alba e tramonto

Ciao a tutti!!! In un mio vecchio progetto sono riuscito a simulare l'alba e il tramonto con i led pilotandoli in pwm :slight_smile: :slight_smile: adesso però voglio migliorare il mio progetto, avevo intenzione di:

-inserire uno schermo lcd (16x2);
-inserire 4 pulsanti: aumento, decremento, avanti e menù;

Quello che voglio realizzare è un semplice menù dove è possibile impostare: durata dell'alba (che coincide alla durata del tramonto) e durata del fotoperiodo. Dovrebbe essere una cosa abbastanza semplice eppure sbaglio qualcosa... :frowning: :frowning:

Lo schermo è collegato ad arduino tramite I2C.

Ecco il programma:

while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(1, 0);
    lcd.print(ioc1);
    lcd.setCursor(0, 3);
    lcd.print(":");
    lcd.setCursor(0, 4);
    lcd.print(imc1);
    if(digitalRead(piu) == HIGH)
    {
    imc1++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc1--;
    }
    if(imc1 > 59)
    {
    if(ioc1 < 25)
    {
    ioc1++;
    }
    imc1 = 0;
    }    
    }



    lcd.clear();
    while(digitalRead(avanti) == HIGH)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(1, 0);
    lcd.print(dc1);
    if(digitalRead(piu) == HIGH)
    {
    dc1++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc1--;
    }
    if(dc1 > 25)
    {
    dc1 = 0; 
    }
    if(dc1 < 0)
    {
    dc1 = 24;
    }
    }

grazie a tutti quelli che scriveranno...

Se serve posto il programma completo

La soluzione è semplice.

Qual'è??? c'è un errore nel programma??? può essere che sia sbagliato il collegamento dei pulsanti ad arduino??? Qualsiasi consiglio è ben accetto... alla fine quando sarò riuscito a farlo posterò l'intero programma per renderlo disponibile a chiunque voglia imbattersi in questo progetto.

Intanto direi che dovresti racchiudere il codice negli appositi TAG (sono quelli in alto a sinistra con il simbolo "</>") così come richiesto dal punto 7 del regolamento di questo forum.
Poi se nell'IDE di arduino vai nel menu "strumenti" e usi la "formattazione automatica" (CTRL+T) ottieni anche uno sketch correttamente indentato e sicuramente più leggibile. :wink:

Ciao

Attilio

Allora intanto io sono andato avanti: ho inserito anche gli altri 3 canali, e adesso sto comincianto anche con il modulo rtc ( Io ho il DS1302 ) e sto sviluppando ultimando il programma.

eccolo:

#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
DS1302 rtc(2,3,4);

int canale1 =11;
int canale2 =10;
int canale3 =9;

int avanti =8;
int menu =7;
int piu =6;
int meno =5;

int ioc1 =0;
int ioc2 =0;
int ioc3 =0;
int imc1 =0;
int imc2 =0;
int imc3 =0;

int dc1 =0;
int dc2 =0;
int dc3 =0;

int v =0;


void setup()
{
  //Inizializzazione rtc
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setDOW(MONDAY);
  rtc.setTime(12, 0, 0);
  rtc.setDate(12, 22, 2015); 
  //Inizializzazione lcd
  lcd.init();
  lcd.backlight();
  //Impostazione input e output
  pinMode(canale1, OUTPUT);
  pinMode(canale2, OUTPUT);
  pinMode(canale3, OUTPUT);
  pinMode(avanti, INPUT);
  pinMode(menu, INPUT);
  pinMode(piu, INPUT);
  pinMode(meno, INPUT);
}

void loop()
{
    while(digitalRead(menu) == LOW)
    {
      lcd.setCursor(0, 0);
      lcd.print("PLAFONIERA ARDUINO");
      delay(100);
    }
    
    lcd.clear();
    lcd.print("MENU'");
    delay(500);
    lcd.clear();
    lcd.print("SETTAGGIO");
    lcd.setCursor(1, 0);
    lcd.print("CANALE 1");
    delay (200);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(1, 0);
    lcd.print(ioc1);
    lcd.setCursor(0, 3);
    lcd.print(":");
    lcd.setCursor(0, 4);
    lcd.print(imc1);
    if(digitalRead(piu) == HIGH)
    {
    imc1++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc1--;
    }
    if(imc1 > 59)
    {
    if(ioc1 < 25)
    {
    ioc1++;
    }
    imc1 = 0;
    }    
    }



    lcd.clear();
    while(digitalRead(avanti) == HIGH)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(1, 0);
    lcd.print(dc1);
    if(digitalRead(piu) == HIGH)
    {
    dc1++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc1--;
    }
    if(dc1 > 25)
    {
    dc1 = 0; 
    }
    if(dc1 < 0)
    {
    dc1 = 24;
    }
    }

    lcd.clear();
    lcd.print("CANALE 1 SETTATO");
    lcd.setCursor(1, 0);
    lcd.print("CORRETTAMENTE");
    delay(500);


    lcd.clear();
    lcd.print("SETTAGGIO");
    lcd.setCursor(1, 0);
    lcd.print("CANALE 2");
    delay (200);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(1, 0);
    lcd.print(ioc2);
    lcd.setCursor(0, 3);
    lcd.print(":");
    lcd.setCursor(0, 4);
    lcd.print(imc2);
    if(digitalRead(piu) == HIGH)
    {
    imc2++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc2--;
    }
    if(imc2 > 59)
    {
    if(ioc2 < 25)
    {
    ioc2++;
    }
    imc2 = 0;
    }    
    }



    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(1, 0);
    lcd.print(dc2);
    if(digitalRead(piu) == HIGH)
    {
    dc2++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc2--;
    }
    if(dc2 > 25)
    {
    dc2 = 0; 
    }
    if(dc2 < 0)
    {
    dc2 = 24;
    }
    }

    lcd.clear();
    lcd.print("CANALE 2 SETTATO");
    lcd.setCursor(1, 0);
    lcd.print("CORRETTAMENTE");
    

    

    lcd.clear();
    lcd.print("SETTAGGIO");
    lcd.setCursor(1, 0);
    lcd.print("CANALE 3");
    delay (200);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(1, 0);
    lcd.print(ioc3);
    lcd.setCursor(0, 3);
    lcd.print(":");
    lcd.setCursor(0, 4);
    lcd.print(imc3  );
    if(digitalRead(piu) == HIGH)
    {
    imc3++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc3--;
    }
    if(imc3 > 59)
    {
    if(ioc3 < 25)
    {
    ioc3++;
    }
    imc3 = 0;
    }    
    }



    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(1, 0);
    lcd.print(dc3);
    if(digitalRead(piu) == HIGH)
    {
    dc3++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc3--;
    }
    if(dc3 > 25)
    {
    dc3 = 0; 
    }
    if(dc3 < 0)
    {
    dc3 = 24;
    }
    }

    lcd.clear();
    lcd.print("CANALE 3 SETTATO");
    lcd.setCursor(1, 0);
    lcd.print("CORRETTAMENTE");
    delay(500);
    
    }

Ovviamente ero ironico. QUAL È IL PROBLEMA??? >:(

Allora ho messo dei delay in più adesso va un po meglio:

#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
DS1302 rtc(2,3,4);

int canale1 =11;
int canale2 =10;
int canale3 =9;

int avanti =8;
int menu =7;
int piu =6;
int meno =5;

int ioc1 =0;
int ioc2 =0;
int ioc3 =0;
int imc1 =0;
int imc2 =0;
int imc3 =0;

int dc1 =0;
int dc2 =0;
int dc3 =0;

int v =0;


void setup()
{
  //Inizializzazione rtc
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setDOW(MONDAY);
  rtc.setTime(12, 0, 0);
  rtc.setDate(12, 22, 2015); 
  //Inizializzazione lcd
  lcd.init();
  lcd.backlight();
  //Impostazione input e output
  pinMode(canale1, OUTPUT);
  pinMode(canale2, OUTPUT);
  pinMode(canale3, OUTPUT);
  pinMode(avanti, INPUT_PULLUP);
  pinMode(menu, INPUT_PULLUP);
  pinMode(piu, INPUT_PULLUP);
  pinMode(meno, INPUT_PULLUP);
  digitalWrite(avanti, HIGH);
  digitalWrite(menu, HIGH);
  digitalWrite(piu, HIGH);
  digitalWrite(meno, HIGH);
}

void loop()
{
    while(digitalRead(menu) == LOW)
    {
      lcd.setCursor(0, 0);
      lcd.print("   PLAFONIERA");
      lcd.setCursor(0, 1);
      lcd.print("    ARDUINO");
      delay(100);
    }
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MENU'");
    delay(750);
    lcd.clear();
    lcd.print("SETTAGGIO");
    lcd.setCursor(0, 1);
    lcd.print("CANALE 1");
    delay (750);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(1, 1);
    lcd.print(ioc1);
    lcd.setCursor(3, 1);
    lcd.print(":");
    lcd.setCursor(4, 1);
    lcd.print(imc1);
    if(digitalRead(piu) == HIGH)
    {
    imc1++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc1--;
    }
    if(imc1 > 59)
    {
    if(ioc1 < 25)
    {
    ioc1++;
    }
    imc1 = 0;
    } 
    delay(50);   
    }



    lcd.clear();
    while(digitalRead(avanti) == HIGH)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(0, 1);
    lcd.print(dc1);
    if(digitalRead(piu) == HIGH)
    {
    dc1++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc1--;
    }
    if(dc1 > 25)
    {
    dc1 = 0; 
    }
    if(dc1 < 0)
    {
    dc1 = 24;
    }
    delay(50); 
    }

    lcd.clear();
    lcd.print("CANALE 1 SETTATO");
    lcd.setCursor(0, 1);
    lcd.print("CORRETTAMENTE");
    delay(750);


    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO");
    lcd.setCursor(0, 1);
    lcd.print("CANALE 2");
    delay (750);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(0, 1);
    lcd.print(ioc2);
    lcd.setCursor(3, 0);
    lcd.print(":");
    lcd.setCursor(4, 0);
    lcd.print(imc2);
    if(digitalRead(piu) == HIGH)
    {
    imc2++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc2--;
    }
    if(imc2 > 59)
    {
    if(ioc2 < 25)
    {
    ioc2++;
    }
    imc2 = 0;
    }
    delay(50);     
    }



    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(0, 1);
    lcd.print(dc2);
    if(digitalRead(piu) == HIGH)
    {
    dc2++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc2--;
    }
    if(dc2 > 25)
    {
    dc2 = 0; 
    }
    if(dc2 < 0)
    {
    dc2 = 24;
    }
    delay(50); 
    }

    lcd.clear();
    lcd.print("CANALE 2 SETTATO");
    lcd.setCursor(0, 1);
    lcd.print("CORRETTAMENTE");
    delay(750);

    

    lcd.clear();
    lcd.print("SETTAGGIO");
    lcd.setCursor(0, 1);
    lcd.print("CANALE 3");
    delay(750);
    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("ORARIO INIZIO:");
    lcd.setCursor(0, 1);
    lcd.print(ioc3);
    lcd.setCursor(3, 0);
    lcd.print(":");
    lcd.setCursor(4, 0);
    lcd.print(imc3  );
    if(digitalRead(piu) == HIGH)
    {
    imc3++;
    } 
    if(digitalRead(meno) == HIGH)
    {
    imc3--;
    }
    if(imc3 > 59)
    {
    if(ioc3 < 25)
    {
    ioc3++;
    }
    imc3 = 0;
    }
    delay(50);     
    }



    lcd.clear();
    while(digitalRead(avanti) == LOW)
    {
    lcd.setCursor(0, 0);
    lcd.print("SETTAGGIO DURATA");
    lcd.setCursor(0, 1);
    lcd.print(dc3);
    if(digitalRead(piu) == HIGH)
    {
    dc3++;
    }
    if(digitalRead(meno) == HIGH)
    {
    dc3--;
    }
    if(dc3 > 25)
    {
    dc3 = 0; 
    }
    if(dc3 < 0)
    {
    dc3 = 24;
    }
    delay(50); 
    }

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("CANALE 3 SETTATO");
    lcd.setCursor(0, 1);
    lcd.print("CORRETTAMENTE");
    delay(750);
    
    }

Ma difetta ancora appena premo il pulsante avanti cominciano a comparire tuute le scritte che ci sono nel codice e vengono fuori numeri negativi... :o :o :o un macello. Ma perchè??? serve una libreria per i pulsanti??? non penso... inoltre ho collegato i pulsanti direttamente dal gnd al piedino usando le resistenze di pullup interne... Non riesco a capire dove sbaglio :confused: Aiutatemi :frowning: :frowning:

Forse dimentichi che Arduino fa 16000000 di cicli al secondo. Ogni volta che premi il pulsante per "un attimo", il loop() viene eseguito migliaia di volte...

No per i pulsanti non serve una libreria, serve una "funzione" anti-rimbalzo.

Quando premi un pulsante non generi solamente un impulso ma una serie di impulsi dovuti al rimbalzo dei contatti meccanici del pulsante stesso.

Di soluzioni per il debouncing ne esistono sia software che hardware.

Fai una ricerca su Google inserendo "debouncing arduino" e vedrai che sicuramente trovi la soluzione.

Ciao

Attilio

Allora ho risistemato il tutto e adesso con le resistenze di pullup interne funziona. :slight_smile: :slight_smile: