Aiuto con TimeAlarmExample e ..

Ciao a tutti.
ho 2 sketch funzionanti (incredibile) XD
1 il time alarm example che accende o spegne un led all’ora che gli imposto (morning alarm)…
2 quest’altro sketch mi legge un impulso da analog0 in millivolt e mi accende/spegne un led al valore che gli imposto io…

Posso mettere insieme i 2 sketch per ricavarne uno che: alle ore xx mi faccia partire il secondo sketch?

Alla fine si tratta di un timer, ho guardato in giro, ma tutti usano un rtc esterno, io non ho bisogno di tanta precisione

Mi permetto di postarvi i 2 sk…

/*
 * TimeAlarmExample.pde
 *
 * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
 * and simulates turning lights on at night and off in the morning
 *
 * A timer is called every 15 seconds
 * Another timer is called once only after 10 seconds
 *
 * At startup the time is set to Jan 1 2010  8:29 am
 */

#include <Time.h>
#include <TimeAlarms.h>

void setup()
{
  pinMode(13, OUTPUT); 
  Serial.begin(9600);    
  Serial.println("TimeAlarms Example");
  Serial.println("Alarms are triggered daily at 8:30 am and 17:45 pm");
  Serial.println("One timer is triggered every 15 seconds");
  Serial.println("Another timer is set to trigger only once after 10 seconds");
  Serial.println();
  
  setTime(8,29,55,1,1,10); // set time to 8:29:40am Jan 1 2010 

  Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day 
 
  Alarm.timerRepeat(15, RepeatTask);            // timer for every 15 seconds    
  Alarm.timerOnce(10, OnceOnlyTask);            // called once after 10 seconds 
}

void MorningAlarm()
{
  Serial.println("Alarm: - accendo il led"); 
  digitalWrite (13, HIGH);  
  delay(3000);
  digitalWrite (13, LOW);  
  delay(3000);

}

void EveningAlarm()
{
  Serial.println("Alarm: - turn lights on");           
}

void RepeatTask()
{
  Serial.println("15 second timer");         
}

void OnceOnlyTask()
{
  Serial.println("This timer only triggers once");  
}

void  loop()
{  
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

e l’altro

int voltage = 0; // per la tensione effettiva 
int i = 0; // per i cicli float v2 = 0; // for voltage calculation float v2 = 0; / / per il calcolo della tensione 
int del = 50; // per i ritardi tra i LED di accensione e spegnimento
float v2 = 0; // per il calcolo della tensione

void setup ()
{
  for (i=8;i<=12;i++)
 {
  pinMode (i, OUTPUT); 
 }
 Serial.begin (9600); // aprire la porta seriale per inviare i dati al computer a 9600 bps 
}
 
 void loop () 
 {
   voltage=analogRead (0); // ottiene la lettura analogica pin 0
    v2=voltage/102.3;  
     Serial.print ("voltage:"); 
     Serial.println (v2, 2); // turni v2 a due cifre decimali 
     
      if (voltage <=10) 
      {
        delay (del);
        
      }
       else if (voltage <= 102) 
      {
       digitalWrite (8, HIGH); 
       delay (15000);
       digitalWrite (8, LOW); 
       
      }
 }

attendo le vostre considerazioni, grazie anticipatamente

Ciao Stefano, il secondo sketch che devi fare girare all'ora X, deve in tal caso fare un lettura one shot e basta?

Perchè così di primo acchito, ti basterebbe inserire il secondo skech (quel che è dentro il loop) in una funzione. All'ora X ti basterebbe quindi richiamare tale funzione. Naturalmente devi dichiarare tutte le tue variabili ed accorpare i due setup in uno (non limitandosi al copia-incolla, naturalmente).

Grazie Pitusso, Quindi anche se "sommo" i 2 setup e i 2 loop non funziona, giusto? (beh, però un po di copia/incolla lo faccio comunque)

devo perforza imparare il c++ per farlo?, l'operazione è talmente banale che credevo fosse piu semplice

sto cercando dei tutorial di timer, ma non trovo quelli semplici, senza display e rtc esterno, sapete darmi qualche link o aiutino..

Ciao

detta rozzamente: i due setup() li unisci, il secondo loop() lo chiami in altro modo, per esempio lettura() e poi modifichi il primo setup per richiamare la funzione al tempo prestabilito: Alarm.alarmRepeat(8,30,0, lettura); // 8:30am every day

ah occhio che il primo loop() fa 4 cose:

Alarm.alarmRepeat(8,30,0, MorningAlarm); // alle 8:30am ogni giorno chiama la funzione MorningAlarm() Alarm.alarmRepeat(17,45,0,EveningAlarm); // alle 5:45pm chiama EveningAlarm()

Alarm.timerRepeat(15, RepeatTask); // timer for every 15 seconds = ogni 15 secondi chiama la funzione RepeatTask() Alarm.timerOnce(10, OnceOnlyTask); // called once after 10 seconds = dopo dieci secondi e solo per una volta chiama OnceOnlyTask()

comunque più che il c++, un'ifarinatura di c sarebbe più che utile, ci sono guide ottime per iniziare in internet tipo questa: http://programmazione.html.it/guide/leggi/32/guida-c/

Grazie mille Lesto, mi hai dato qualche briciolina in più... domani provo a modificare il soft, ricontrollo meglio ed elimino/inserisco le funzioni che non mi servono seguendo le tue istruzioni e grazie per il link, studierò un po', Ma sicuramente avrò bisogno di aiuto

Vi chiedo un'altra cosa, non utilizzando un rtc esterno, le operazioni sono comunque affidabili, perchè tutti usano l'rtc??

Grazie, ciao

il clock di arduino sfasa di pochissimo, talmente poco da essere impercettibile a breve termine. Ma dopo chessò, un paio di giorni, vedrai che arduino è avanti o indietro di 10 minuti. a dopo 4 giorni di 20... senza contare il problema dell'overflow (ma la libreria che utilizzi dovrebbe pensarci da sola) l'RTC invece è affidabile anche dopo settimane, mesi o addirittura anni. credo che li testino sul lungo periodo e poi aggiustino i valori in base allo sfaso misurato, oltre che usare quarzi più precisi...

Eccomi qui, pian piano mi sembra di fare qualche passo in +

ho semplificato al massimo gli sketch… togliendo le operazioni che non mi servivano…

a questo punto ho inserito nell’1 il setup del 2, ma ho un grosso problema, come faccio a creare una funzione che mi dia il loop 2 e richiamarla nll’1??

Vi posto i 2 sketch:

#include <Time.h>
#include <TimeAlarms.h>

int voltaggio = 0; // per la tensione effettiva 

void setup()
{
  pinMode (8, OUTPUT); 
  pinMode (13, OUTPUT); 
  Serial.begin(9600);    
  Serial.println("TimeAlarms Example");
  Serial.println();
  
  setTime(8,29,55,1,1,10); // set time to 8:29:40am Jan 1 2010 

  Alarm.alarmRepeat(8,30,0, ON);  // accendo il led tutti i gg alle 8.30
  Alarm.alarmRepeat(8,30,10,OFF);  // Spengo il led alle 8.30.10 sec

 }

void ON()
{
  Serial.println("Alarm: - accendo il led"); 
  digitalWrite (13, HIGH);
    
}
void OFF()
{
  Serial.println("Alarm: - spengo il led"); 
  digitalWrite (13, LOW);    
}

void  loop()
{  
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

IL secondo

int voltaggio = 0; // per la tensione effettiva 

void setup ()
{
  pinMode (8, OUTPUT); 
  Serial.begin (9600); // aprire la porta seriale per inviare i dati al computer a 9600 bps 
}
 
 void loop () 
 {
   voltaggio=analogRead (0); // ottiene la lettura analogica pin 0
    
     Serial.print ("voltaggio:"); 
     Serial.println(analogRead (0));

       if (voltaggio >= 930) // questa la potrei modificare con Voltaggio compreso tra..
       if (voltaggio <= 960)
      {
       Serial.print ("Accendo la luce"); 
       digitalWrite (8, HIGH); 
       delay (5000);
       Serial.print ("Spengo la luce");
       delay (1000);
       digitalWrite (8, LOW); 
       
      }
 }

Se mi potete aiutare a capire un pochino…Grazie

Ciao Stefano, void ON() e le altre sono funzioni definite da te, mentre setup e loop appartengono ad arduino, qalunque nome per un funzione và bene tranne le parole riservate di C/C++ e difficile che le userai per sbaglio, comunque puoi copiare la funzione loop del secondo sketch nel primo e poi gli cambi nome la puoi anche chiamare loop1 ma è meglio che gli dai un nome che abbia un senso solo perchè il codice così è più leggibile.

Anche per la funzione setup puoi fare lo stesso.

Poi per richiamarle o invocarle scrivi semplicemente loop1(); o setup1(); a secodo del nome che hai scelto. ciao.

Usi un RTC anche perché normalmente ha una piccola batteria che lo fa andare avanti anche con la alimentazione spenta. L’ arduino devi tenerlo acceso 24 ore su 24 per far contare l’ora.
Ciao Uwe

Ciao e grazie a tutti… con il Vs. aiuto ho capito come fare, ecco il codice “riunito”

#include <Time.h>
#include <TimeAlarms.h>

int voltaggio = 0; // per la tensione effettiva 

void setup()
{
  pinMode (8, OUTPUT); 
  pinMode (13, OUTPUT); 
  Serial.begin(9600);    
  Serial.println("TimeAlarms Example");
  Serial.println();
  
  setTime(8,29,57,1,1,10); // imposto l'ora
  Alarm.alarmRepeat(8,30,0, ON);  // accendo il led tutti i gg alle 8.30
  Alarm.alarmRepeat(8,30,7,OFF);  // Spengo il led alle 8.30.7 sec
  Alarm.alarmRepeat(8,30,0, lettura);  // inizio lettura dal sensore
  
 }

void ON()
{
  Serial.println("Alarm: - accendo il led"); 
  digitalWrite (13, HIGH);
    
}
void OFF()
{
  Serial.println("Alarm: - spengo il led"); 
  digitalWrite (13, LOW);    
}
void lettura()
{
   voltaggio=analogRead (0); // ottiene la lettura analogica pin 0
    
     Serial.print ("voltaggio:"); 
     Serial.println(analogRead (0));

       if (voltaggio >= 930) // questa la potrei modificare con Voltaggio compreso tra..
       if (voltaggio <= 960)
      {
       Serial.print ("Accendo la luce"); 
       digitalWrite (8, HIGH); 
       delay (5000);
       Serial.print ("Spengo la luce");
       delay (1000);
       digitalWrite (8, LOW); 
       
      }
}

void  loop()
{  
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

P.S. una cosa strana sul forum, ieri ho postato altri 2 post (reply a questo), ma oggi non ci sono… booo, qualche problema sul nuovo forum???

Comunque ecco, Praticamente è un codice che imposta un Timer giornaliero senza rtc… sono molto soddisfatto per questi primi passi di programmazione.

Una domanda “banale” sono bravo con il saldatore, vorrei costruire da solo l’rtc ds1307, su roboitaly se prendo i pz separati spendo poco di meno che prenderlo gia su shield… qualche link per i componenti??
Ancora uno permettemi, vorrei prendere anche un display, con meno pin possibili, magari 20*4, qualche consiglio??
Sempre grazie per l’assistenza, a presto.

Sì, spendi poco di meno ma vuoi mettere il divertimento nell'assemblartelo? :grin: La costruzione di uno shield autocostruito con RTC e sensore di temperatura, il tutto interfacciato ad uno shield con display LCD, è stato il mio primo progetto realizzato completamente da me, è stata una buona palestra.

PS: display LCD 20x4 io li ho trovati a buon prezzo solo su Ebay. C'è un produttore polacco che ne ha di interessanti, con diversi colori della retroilluminazione.