PDA

Visualizza la versione completa : [C] Orologio su piattaforma Arduino


cesare76m
25-11-2011, 14:43
[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


//////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); } }

LeleFT
25-11-2011, 15:00
Ciao e benvenuto.
Il linguaggio va indicato anche/soprattutto nel titolo della discussione. Dentro al corpo della discussione è facoltativo/non influente.

Inoltre, dovresti postare il codice che hai sviluppato (all'interno degli appositi tag CODE, come indicato nel regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887)) in modo da permettere agli utenti di capire come aiutarti nel migliore dei modi possibili.

Correggo il titolo.

Ciao. :ciauz:

cesare76m
25-11-2011, 15:08
grazie delle indicazione ho postato il codice ma non so se l'ho fatto nel modo corretto, grazie e saluti Cesare

oregon
25-11-2011, 16:53
Il codice non è leggibile ...

cesare76m
25-11-2011, 16:53
//////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);
}
}

oregon
25-11-2011, 17:01
Dovresti usare un delay di qualche millisecondo (1 , 5 o 10 da aggiustare praticamente ...) aggiornando una varaibile contatore in modo che i secondi siano aggiornati allo scadere di un certo conteggio.

Ovvero, se imposti un ritardo di 1 millisecondo, aumenta la tua variabile (preazzerata) e quando arriva a 1000 aumenti il valore dei secondi e la azzeri nuovamente.

Così i secondi andranno al ritmo corretto ma il tuo programma avrà a disposizione molto più tempo ...

cesare76m
25-11-2011, 17:41
ti ringrazio molto della risposta, speravo nella possibilità di poter impostare delle subroutine che rimanessero indipendenti tra di loro circa i delay impostati, proverò e ti farò sapere saluti Cesare

MItaly
25-11-2011, 23:50
In realtà per una maggiore precisione potresti anche sfruttare la funzione millis(), che ti restituisce i millisecondi dall'accensione dell'Arduino (ovviamente devi stare attento al momento in cui il contatore si resetta).

cesare76m
26-11-2011, 09:27
...grazie dei consigli mi metto a lavoro e ottimizzo un pò di cose, secondo voi è stilato bene il software o può essere ottimizzato, avendolo implementato un pò per volta potrebbero esserci routine di troppo....

cesare76m
28-11-2011, 23:31
Ho seguito il consiglio di Oregon impostando il contatore in ms con un delay(1), ma stranamente l'orologio è lento e come se non corrispondesse a un millisecondo, volendo usare il comando consigliato da Mitaly millis(), in che modo posso impostare una variabile contatore in modo che aumenti all'incremento del comando millis....spero di essere stato chiaro...

Loading