Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Orologio su piattaforma Arduino

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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    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) in modo da permettere agli utenti di capire come aiutarti nel migliore dei modi possibili.

    Correggo il titolo.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    grazie delle indicazione ho postato il codice ma non so se l'ho fatto nel modo corretto, grazie e saluti Cesare

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Il codice non è leggibile ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5

    ...forse così è più chiaro...;)

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

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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

  8. #8
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    ...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....

  10. #10
    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...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.