Visualizza un messaggio singolo
Vecchio 13-08-2014, 16:49   #22
SirNino
Ciclide
 
L'avatar di SirNino
 
Registrato: Oct 2010
Città: Carpi (MO)
Acquariofilo: Dolce
N° Acquari: 1
Età : 47
Messaggi: 1.239
Foto: 0 Albums: 1
Post "Grazie" / "Mi Piace"
Grazie (Dati):
Grazie (Ricev.):
Mi piace (Dati):
Mi piace (Ricev.):
Mentioned: 45 Post(s)
Feedback 7/100%
Invia un messaggio tramite MSN a SirNino Invia un messaggio tramite Skype a SirNino

Annunci Mercatino: 0
Finalmente è finito

Ciao @marco3020 , ciao @Colaki e ciao a tutti quelli che vorranno seguire questa discussione.
Come promesso a Marco ho realizzato il codice da lui richiesto che prevedeva:

- accensione di 8 canali separati ed indipendenti di led
- alba e tramonto per ogni canale
- gestione temperatura (riscaldatore e refrigeratore)

Hardware:

- Arduino Mega 2560 rev.3
- RTC DS1307
- Display LCD 1602
- 6 pulsanti da circuito stampato (sto implementando il settimo per la navigazione del menù --> movimento back)
- 6 resistenze di pulldown (10 KΏ)
- sensore di temperatura
- resistenza variabile (se volete poter regolare la luminosità del vostro LCD)

La cosa, secondo me, più difficile in questa progettazione è stata l'assoluta indipendenza di ogni canale e la possibilità di regolare in maniera diversa ognuno di questi (per ogni canale si può decidere l'orario dell'inizio alba, la durata, l'inizio del tramonto e la durata di quest'ultimo). Quindi se si volesse far accendere prima il sesto canale e poi il primo basterebbe impostarlo così nei relativi campi . La gestione del menù ha portato via molto tempo (ci sono più di 100 variabili a definire solo le regolazioni dei canali tra orari durate ecc. oltre alle variabili "di sistema" per gli orari le temperature ed altre cosine.
La temperatura viene rilevata una volta al secondo. Dopo la misurazione questo dato viene passato ad un ciclo di controllo che verifica se la temperatura rientra nei delta impostati, sia per la refrigerazione che per il riscaldamento, rispetto alle temperature di riferimento (a loro volta impostabili da menù.
Durante le prove fatte sulla protoboard, ho notato che se il sensore viene installato troppo vicino ad altri componenti elettronici, risente molto dei campi magnetici emessi, sballando ( a volte anche di 5 - 6°) la temperatura rilevata.

Iniziamo il lavoro vero e proprio modificando la libreria menuBackend.h

aggiungere, alla riga 195 del file MenuBackend.h subito prima della riga con scritto "private:", questo metodo:
codice:
    void toRoot() {
        setCurrent( &getRoot() );
    }
Questo metodo mi serve per poter tornare agevolmente alla radice del menu (all'home).

Ora qualche foto del progetto di prototipazione (vi prego scusate il casino di fili ma durante lo sviluppo ho aggiunto, tolto, spostato e rispostato...risultato....?)





a questo punto credo che non manchi più niente...apparte lo il codice

codice:
#include <MenuBackend.h>    //MenuBackend library
#include <LiquidCrystal.h>  
#include <Wire.h>
#include <RTClib.h>

int orario; 
char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;
int nMenu=0;                         //  VARIABILE CHE IDENTIFICA IL MENU' IN USO
const int sensorPin=A0;
int temperatura=0.0;
int sensorval=0.0;
float volt=0.0;
float tRisc = 25.0; 
float dRisc = 2.0;       //   VARIABILI RISCALDATORE
float tRefrig = 27.0; 
float dRefrig = 2.0;    //   VARIABILI REFRIGERATORE

RTC_DS1307 RTC;


const int buttonPinLeft = 22;      // pin Giu
const int buttonPinRight = 24;    // pin Su
const int buttonPinEsc = 28;     // pin Esc
const int buttonPinEnter = 26;   // pin OK
const int buttonPiu = 30;        // pin modifica più
const int buttonMeno = 32;       // pin modifica meno
const int temp = A0;              // pin sensore temperatura
const int refrig = 53;            //  USCITA REFRIGERATORE
const int risc = 51;              //  USCITA RISCALDATORE

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 1                                 //
int FACH1=5;
int FTCH1=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH1h = 12;
int ACH1m = 0;
int TCH1h = 0;
int TCH1m = 0;
const int LED1 = 2;        //  definisce il pin per la prima fila di led
boolean alba1 = true;
boolean tramonto1 = true;
int stepA1 = 0;
int stepA11 = 0;
int stepT1 = 0;
int stepT11 = 0;
char CH1ora[5]="";
int x1=0;
int ACH1timer[] = {
  0, 0};
int TCH1timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 2                                 //
int FACH2=5;
int FTCH2=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH2h = 12;
int ACH2m = 30;
int TCH2h = 23;
int TCH2m = 30;
const int LED2 = 3;        //  definisce il pin per la seconda fila di led
boolean alba2 = true;
boolean tramonto2 = true;
int stepA2 = 0;
int stepA22 = 0;
int stepT2 = 0; 
int stepT22 = 0;
char CH2ora[5]=""; 
int x2=0;
int CH2timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 3                                 //
int FACH3=5;
int FTCH3=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH3h = 13;
int ACH3m = 0;
int TCH3h = 23;
int TCH3m = 0;
const int LED3 = 4;        //  definisce il pin per la terza fila di led
boolean alba3 = true;
boolean tramonto3 = true;
int stepA3 = 0;
int stepA33 = 0;
int stepT3 = 0;
int stepT33 = 0;
char CH3ora[5]=""; 
int x3=0;
int CH3timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 4                                 //
int FACH4=5;
int FTCH4=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH4h = 13;
int ACH4m = 30;
int TCH4h = 22;
int TCH4m = 30;
const int LED4 = 5;        //  definisce il pin per la quarta fila di led
boolean alba4 = true;
boolean tramonto4 = true;
int stepA4 = 0;
int stepA44 = 0;
int stepT4 = 0;
int stepT44 = 0;
char CH4ora[5]=""; 
int x4=0;
int CH4timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 5                                 //
int FACH5=5;
int FTCH5=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH5h = 14;
int ACH5m = 0;
int TCH5h = 22;
int TCH5m = 0;
const int LED5 = 6;        //  definisce il pin per la quinta fila di led
boolean alba5 = true;
boolean tramonto5 = true;
int stepA5 = 0;
int stepA55 = 0;
int stepT5 = 0;
int stepT55 = 0;
char CH5ora[5]=""; 
int x5=0;
int CH5timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 6                                 //
int FACH6=5;
int FTCH6=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH6h = 14;
int ACH6m = 30;
int TCH6h = 21;
int TCH6m = 30;
const int LED6 = 7;        //  definisce il pin per la sesta fila di led
boolean alba6 = true;
boolean tramonto6 = true;
int stepA6 = 0;
int stepA66 = 0;
int stepT6 = 0;
int stepT66 = 0;
char CH6ora[5]=""; 
int x6=0;
int CH6timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 7                                 //
int FACH7=5;
int FTCH7=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH7h = 15;
int ACH7m = 0;
int TCH7h = 21;
int TCH7m = 0;
const int LED7 = 8;        //  definisce il pin per la settima fila di led
boolean alba7 = true;
boolean tramonto7 = true;
int stepA7 = 0;
int stepA77 = 0;
int stepT7 = 0;
int stepT77 = 0;
char CH7ora[5]="";
int x7=0;
int CH7timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//                                VARIABILI CANALE 8                                 //
int FACH8=5;
int FTCH8=5;         //DURATA ALBA/TRAMONTO ESPRIMERE IN MINUTI
int ACH8h = 15;
int ACH8m = 30;
int TCH8h = 20;
int TCH8m = 30;
const int LED8 = 9;        //  definisce il pin per l'ottava fila di led
boolean alba8 = true;
boolean tramonto8 = true;
int stepA8 = 0;
int stepA88 = 0;
int stepT8 = 0;
int stepT88 = 0;
char CH8ora[5]="";
int x8=0;
int CH8timer[] = {
  0, 0};
///////////////////////////////////////////////////////////////////////////////////////

int lastButtonPushed = 0;

int lastButtonEnterState = LOW;   
int lastButtonEscState = LOW;   
int lastButtonLeftState = LOW;  
int lastButtonRightState = LOW;  


long lastEnterDebounceTime = 0;
long lastEscDebounceTime = 0;  
long lastLeftDebounceTime = 0; 
long lastRightDebounceTime = 0;
long debounceDelay = 300;    // tempo di rimbalzo


LiquidCrystal lcd(12, 11, 13, 10, 27, 25);

//Variabili del menu
MenuBackend menu = MenuBackend(menuUsed,menuChanged);


//    MENU' ILLUMINAZIONE
MenuItem menu1Item1 = MenuItem("Item1");
MenuItem menuCanale1 = MenuItem("CH1");
MenuItem menuCanale2 = MenuItem("CH2");
MenuItem menuCanale3 = MenuItem("CH3");
MenuItem menuCanale4 = MenuItem("CH4");
MenuItem menuCanale5 = MenuItem("CH5");
MenuItem menuCanale6 = MenuItem("CH6");
MenuItem menuCanale7 = MenuItem("CH7");
MenuItem menuCanale8 = MenuItem("CH8");
MenuItem menuCanale1ACH1=MenuItem("ACH1");
MenuItem menuCanale1FACH1=MenuItem("FACH1");
MenuItem menuCanale1TCH1=MenuItem("TCH1");
MenuItem menuCanale1FTCH1=MenuItem("FTCH1");
MenuItem menuCanale2ACH1=MenuItem("ACH2");
MenuItem menuCanale2FACH1=MenuItem("FACH2");
MenuItem menuCanale2TCH1=MenuItem("TCH2");
MenuItem menuCanale2FTCH1=MenuItem("FTCH2");
MenuItem menuCanale3ACH1=MenuItem("ACH3");
MenuItem menuCanale3FACH1=MenuItem("FACH3");
MenuItem menuCanale3TCH1=MenuItem("TCH3");
MenuItem menuCanale3FTCH1=MenuItem("FTCH3");
MenuItem menuCanale4ACH1=MenuItem("ACH4");
MenuItem menuCanale4FACH1=MenuItem("FACH4");
MenuItem menuCanale4TCH1=MenuItem("TCH4");
MenuItem menuCanale4FTCH1=MenuItem("FTCH4");
MenuItem menuCanale5ACH1=MenuItem("ACH5");
MenuItem menuCanale5FACH1=MenuItem("FACH5");
MenuItem menuCanale5TCH1=MenuItem("TCH5");
MenuItem menuCanale5FTCH1=MenuItem("FTCH5");
MenuItem menuCanale6ACH1=MenuItem("ACH6");
MenuItem menuCanale6FACH1=MenuItem("FACH6");
MenuItem menuCanale6TCH1=MenuItem("TCH6");
MenuItem menuCanale6FTCH1=MenuItem("FTCH6");
MenuItem menuCanale7ACH1=MenuItem("ACH7");
MenuItem menuCanale7FACH1=MenuItem("FACH7");
MenuItem menuCanale7TCH1=MenuItem("TCH7");
MenuItem menuCanale7FTCH1=MenuItem("FTCH7");
MenuItem menuCanale8ACH1=MenuItem("ACH8");
MenuItem menuCanale8FACH1=MenuItem("FACH8");
MenuItem menuCanale8TCH1=MenuItem("TCH8");
MenuItem menuCanale8FTCH1=MenuItem("FTCH8");


//       MENU' TEMPERATURE
MenuItem menu1Item2 = MenuItem("Item2");
MenuItem menuTempRefrig=MenuItem("tRefrig");
MenuItem menuDeltaRefrig=MenuItem("dRefrig");
MenuItem menuTempRisc=MenuItem("tRisc");
MenuItem menuDeltaRisc=MenuItem("dRisc");
MenuItem menuRiscaldatore=MenuItem("Riscaldatore");
MenuItem menuRefrigeratore=MenuItem("Refrigeratore");

//        MENU' IMPOSTAZIONI
MenuItem menu1Item3 = MenuItem("Item3");
MenuItem menuData=MenuItem("Data/Ora");
//MenuItem menuOra=MenuItem("Ora");

void setup(void)
{
  pinMode(buttonPinLeft, INPUT);
  pinMode(buttonPinRight, INPUT);
  pinMode(buttonPinEnter, INPUT);
  pinMode(buttonPinEsc, INPUT);
  pinMode(buttonPiu, INPUT);
  pinMode(buttonMeno, INPUT);
  pinMode(risc, OUTPUT);
  pinMode(refrig, OUTPUT);
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  stepA1 = ((FACH1*60000)/255);
  stepT1 = ((FTCH1*60000)/255);
  stepA2 = ((FACH2*60000)/255);
  stepT2 = ((FTCH2*60000)/255);
  stepA3 = ((FACH3*60000)/255);
  stepT3 = ((FTCH3*60000)/255);
  stepA4 = ((FACH4*60000)/255);
  stepT4 = ((FTCH4*60000)/255);
  stepA5 = ((FACH5*60000)/255);
  stepT5 = ((FTCH5*60000)/255);
  stepA6 = ((FACH6*60000)/255);
  stepT6 = ((FTCH6*60000)/255);
  stepA7 = ((FACH7*60000)/255);
  stepT7 = ((FTCH7*60000)/255);
  stepA8 = ((FACH1*60000)/255);
  stepT8 = ((FTCH1*60000)/255);

  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }


  menu.getRoot().add(menu1Item1).addRight(menu1Item2).addRight(menu1Item3);
  menu1Item1.add(menuCanale1).addRight(menuCanale2).addRight(menuCanale3).addRight(menuCanale4).addRight(menuCanale5).addRight(menuCanale6).addRight(menuCanale7).addRight(menuCanale8);
  menuCanale1.add(menuCanale1ACH1).addRight(menuCanale1FACH1).addRight(menuCanale1TCH1).addRight(menuCanale1FTCH1);
  menuCanale2.add(menuCanale2ACH1).addRight(menuCanale2FACH1).addRight(menuCanale2TCH1).addRight(menuCanale2FTCH1);
  menuCanale3.add(menuCanale3ACH1).addRight(menuCanale3FACH1).addRight(menuCanale3TCH1).addRight(menuCanale3FTCH1);
  menuCanale4.add(menuCanale4ACH1).addRight(menuCanale4FACH1).addRight(menuCanale4TCH1).addRight(menuCanale4FTCH1);
  menuCanale5.add(menuCanale5ACH1).addRight(menuCanale5FACH1).addRight(menuCanale5TCH1).addRight(menuCanale5FTCH1);
  menuCanale6.add(menuCanale6ACH1).addRight(menuCanale6FACH1).addRight(menuCanale6TCH1).addRight(menuCanale6FTCH1);
  menuCanale7.add(menuCanale7ACH1).addRight(menuCanale7FACH1).addRight(menuCanale7TCH1).addRight(menuCanale7FTCH1);
  menuCanale8.add(menuCanale8ACH1).addRight(menuCanale8FACH1).addRight(menuCanale8TCH1).addRight(menuCanale8FTCH1);
  menu1Item2.add(menuRiscaldatore).addRight(menuRefrigeratore);
  menuRiscaldatore.add(menuTempRisc).addRight(menuDeltaRisc);
  menuRefrigeratore.add(menuTempRefrig).addRight(menuDeltaRefrig);
  menu1Item3.add(menuData); //.addRight(menuOra);
  menu.toRoot();

  pulischermo();

}  // setup()...

void rilevTemp(void){
  sensorval=analogRead(sensorPin);
  volt=((sensorval/1024.0)*5.0);
  temperatura=((volt - .5)*100);
  //delay(5000);

}

void pulischermo(void){


  nMenu=0;
  lcd.clear();
  DateTime now = RTC.now();
  sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(0,0);
  lcd.print( buffer );

  char buffer[14] = "";

  sprintf(buffer,  "%02d:%02d", now.hour(), now.minute());
  lcd.setCursor(11,0);
  lcd.print( buffer );
  lcd.setCursor(0,1);
  lcd.print("Temperatura: ");
  lcd.setCursor(13,1);
  lcd.print(temperatura);
  lcd.setCursor(15,1);
  lcd.print(char(223));

}

void setLCD(void){
  lcd.clear();
  lcd.setCursor(0,0);
}

void ach(void){
  setLCD();
  lcd.print("Inizio Alba");
  lcd.setCursor(0,1);
}

void fach(void){
  setLCD();
  lcd.print("Durata Alba");
  lcd.setCursor(4,1);
  lcd.print("min.");
  lcd.setCursor(0,1);
}

void tch(void){
  setLCD();
  lcd.print("Inizio Tramonto");
  lcd.setCursor(0,1);
}

void ftch(void){
  setLCD();
  lcd.print("Durata Tramamont");
  lcd.setCursor(4,1);
  lcd.print("min.");
  lcd.setCursor(0,1);
}

void selOpt(void){
  lcd.setCursor(0,1);
  lcd.print("Selez.Opzioni");
}
Il codice dovrebbe essere tutto commentato (almeno nelle parti importanti) quindi dovrebbe essere di facile comprensione.
Ma per qualsiasi domanda o dubbio non esitate a chiedere.

Spero che vi piaccia....e soprattutto che funzioni!!

Ciao
Alla prossima!!
__________________
Chi non ride mai non è una persona seria - (Chopin)
...La sobrietà và presa con moderazione... - (Jax - Brillo ma da lucido)

La mia vasca - RITORNO AL DOLCE

Ultima modifica di SirNino; 19-08-2014 alle ore 07:33.
SirNino non è in linea   Rispondi quotando
 
Page generated in 0,13661 seconds with 14 queries