[C] Salve sono Cesare, appena iscritto al forum e neofita nell'ambito della programmazione ed in particolare nell'ambiente di sviluppo C.
In particolare ho stilato un software che utilizzo sulla piattaforma arduino.
Nello specifico è un orologio a cui è possibile impostare l'ora e due spegnimenti e accensionni di contatti analogici.
Il tutto funziona, ma.....
l'orologio funziona con un delay a un secondo e così il contatore avanza incrementando gradualmente secondi minuti e ore, il delay dell'orologio influisce però su tutte le altre funzionalità dandomi il ritardo di un secondo su ogni operazione che vado a compiere (anche solo premere un pulsante del display).
Domanda: Come faccio a separare le routine in modo che l'orologio faccia il suo conteggio con il suo ritardo senza inficiare le altre funzionalità del timer.
Anche pèerchè sarebbe mia intenzione invece di accendere e spegnere banalmente delle luci, vorrei creare delle rampe sulle uscite analogiche con l'impostazione dei tempi di salita, ma se il ritardo della rampa influisce sul ritardo del timer succede un casotto; spero di essere stato alquanto chiaro, saluti Cesare
codice:
//////Librerie////// #include <LiquidCrystal.h> #include <Button.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int h = 0; int m = 0; int s = 0; //accensione01// int ah = 0; int am = 0; int bh = 0; int bm = 0; //accensione02// int ch = 0; int cm = 0; int dh = 0; int dm = 0; int funzione = 0; int f = 6; int w = 0; int H; int M; int d = 0; ///delay button // define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 #define bianchi 53 #define blu 49 // read the buttons int read_LCD_buttons() //& adc_key_in >= 100 //& adc_key_in >= 300 { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000 & adc_key_in <= 1100) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result if (adc_key_in < 50 & adc_key_in >= 0) return btnRIGHT; if (adc_key_in < 195 ) return btnUP; if (adc_key_in < 380 ) return btnDOWN; if (adc_key_in < 555 & adc_key_in >= 500) return btnLEFT; if (adc_key_in < 790 & adc_key_in >= 700) return btnSELECT; return btnNONE; // when all others fail, return this... } void setup() { pinMode(blu, OUTPUT); pinMode(bianchi, OUTPUT); lcd.begin(16, 2); // start the library lcd.setCursor(0,0); } void loop() { lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over //lcd.print(millis()/1000); // display seconds elapsed since power-up //digitalWrite (blu, HIGH); //test led lcd.setCursor(0,1); // move to the begining of the second line lcd_key = read_LCD_buttons(); // read the buttons ///////////////////////////////////////////////SELEZIONE PULSANTI///////////////////////////////////////////////////////////// switch (lcd_key) { case btnRIGHT: if (f != 6){ w = 1; } break; case btnLEFT: if (f != 6){ w = 0; } break; case btnUP: if (f == 5 & w == 0){ h = h++; delay(d); if (h == 24){ h = 0; } } if (f == 5 & w == 1){ m = m++; delay(d); if (m == 60){ m = 0; } } if (f == 4 & w == 0){ ah = ah++; delay(d); if (ah == 24){ ah = 0; } } if (f == 4 & w == 1){ am = am++; delay(d); if (am == 60){ am = 0; } } if (f == 3 & w == 0){ bh = bh++; delay(d); if (bh == 24){ bh = 0; } } if (f == 3 & w == 1){ bm = bm++; delay(d); if (bm == 60){ bm = 0; } } if (f == 2 & w == 0){ ch = ch++; delay(d); if (ch == 24){ ch = 0; } } if (f == 2 & w == 1){ cm = cm++; delay(d); if (cm == 60){ cm = 0; } } if (f == 1 & w == 0){ dh = dh++; delay(d); if (dh == 24){ dh = 0; } } if (f == 1 & w == 1){ dm = dm++; delay(d); if (dm == 60){ dm = 0; } } break; case btnDOWN: if (f == 5 & w == 0){ h = h--; delay(d); if (h < 0){ h = 23; } } if (f == 5 & w == 1){ m = m--; delay(d); if (m < 0){ m = 59; } } if (f == 4 & w == 0){ ah = ah--; delay(d); if (ah < 0){ ah = 23; } } if (f == 4 & w == 1){ am = am--; delay(d); if (am < 0){ am = 59; } } if (f == 3 & w == 0){ bh = bh--; delay(d); if (bh < 0){ bh = 23; } } if (f == 3 & w == 1){ bm = bm--; delay(50); if (bm < 0){ bm = 59; } } if (f == 2 & w == 0){ ch = ch--; delay(d); if (ch < 0){ ch = 23; } } if (f == 2 & w == 1){ cm = cm--; delay(d); if (cm < 0){ cm = 59; } } if (f == 1 & w == 0){ dh = dh--; delay(d); if (dh < 0){ dh = 23; } } if (f == 1 & w == 1){ dm = dm--; delay(50); if (dm < 0){ dm = 59; } } break; case btnSELECT: { f = f - 1; delay(d); } case btnNONE: { lcd.setCursor(0,0); } ///////////////////////////////////////////////////////////// if (f == 6){ lcd.print("Orologio "); lcd.setCursor(13,1); lcd.print(" "); H = h; M = m; } if (f == 5){ lcd.print("Imp. ora "); H = h; M = m; } if (f == 4){ lcd.print("Imp. acc. a"); H = ah; M = am; } if (f == 3){ lcd.print("Imp. spg. a"); H = bh; M = bm; } if (f == 2){ lcd.print("Imp. acc. b"); H = ch; M = cm; } if (f == 1){ lcd.print("Imp. spg. b"); H = dh; M = dm; } if (f == 0){ f = 6; } } ///////////////////////////////////////////////OROLOGIO//////////////////////////////////// { if (s == 59){ m++; s = 0; } else { s++; } if (m == 60){ h++; m = 0; } if (h == 24){ h=0; } delay(1000); } lcd.setCursor(0,1); if (H<10){ lcd.print("0"); lcd.print(H); } else { lcd.print(H); } lcd.print(":"); if (M<10){ lcd.print("0"); lcd.print(M); } else { lcd.print(M); } lcd.print(":"); if (s<10){ lcd.print("0"); lcd.print(s); } else { lcd.print(s); } ///////////////////////////////////////////////////TEST VARIABILI///////////////////////////////// //lcd.print(" "); //lcd.print(adc_key_in); lcd.print(" "); //lcd.print(w); //lcd.setCursor(15,1); //lcd.print(f); //lcd.setCursor(12,0); //lcd.print(h); //lcd.print(":"); //lcd.print(m); ////////////////////////////////////////////INDICATORE ORE MINUTI PER IMPOSTAZIONE ORARIO////////////////// if (w == 0){ lcd.setCursor(12,1); lcd.print("H"); } if (w == 1){ lcd.setCursor(12,1); lcd.print("M"); } /////////////////////////////////////////////////ACCENSIONI E SPEGNIMENTI//////////////////////////////////// ////accensione 01 //// if (h >= ah & m >= am){ digitalWrite (bianchi, HIGH); } else { digitalWrite(bianchi, LOW); } ////spegnimento 01//// if (h >= bh & m >= bm){ digitalWrite (bianchi, LOW); } ////accensione 02//// if (h >= ch & m >= cm){ digitalWrite (blu, HIGH); } else { digitalWrite(blu, LOW); //if (h >= dh & m >= dm){ //digitalWrite (blu, LOW); } ////spegnimento 01//// if (h >= dh & m >= dm){ digitalWrite (blu, LOW); } }