Info per piccola applicazione

Nestore1978:
L'unica cosa che ti posso dire è che fino ad ora ho usato librerie e codici già fatti di conseguenza i richiami a librerie non corrette non sono farina del mio sacco...

No, attento, il codice è probabilmente corretto, ma per farlo girare, se NON intendi metterti li a studiare la DS3231 e modificare il codice, allora devi trovare la giusta libreria da scaricare ed installare.

Tu inizialmente hai chiesto quale libreria usare per il DS3231 e ti è stata quindi suggerita una libreria; diverso è il problema di prendere un codice già fatto e chiedere "che devo installare per farlo funzionare" con le librerie che lui già usa :slight_smile:

Nel tuo caso, il codice che hai preso ad esempio, usa la RTClib che, facendo una ricerca trovi sempre nel "library manager" dell'IDE di Arduno ...
... installala e prova a ricompliare e vediamo se ci sono altri errori :wink:

Guglielmo

Comunque, dovendo semplicemente temporizzare sempre per 24 ore, potresti anche usare semplicemente millis(). Ci sarà un po' di errore, ma è semplice correggerlo: scegli un orario che ti è comodo, ad esempio le 20.00, e a quell'ora precisa premi un pulsante che legge millis() e imposta il valore come offset; 1 o più giorni dopo (sono 86400 secondi al giorno, quindi con una variabile unsigned long è possibile contare per oltre un mese e mezzo), poco prima delle 20.00, vai lì e aspetti che venga emesso un suono che avrai impostato allo scadere delle (24 x giorni) ore conteggiate. Quando suona leggi l'ora esatta, vedi di quanti secondi è l'errore e aggiusti proporzionalmente il valore che deve raggiungere la variabile.

Considera che un quarzo da 20ppm sta entro 2 secondi al giorno, che sono 1 minuto al mese e 12 minuti all'anno, già tollerabili per un'applicazione simile. Resta da vedere se è preciso millis() rispetto alla frequenza del quarzo, oppure c'è qualcosa che gli fa perdere qualche ciclo..

Datman:
Considera che un quarzo da 20ppm sta entro 2 secondi al giorno, che sono 1 minuto al mese e 12 minuti all'anno, già tollerabili per un'applicazione simile. Resta da vedere se è preciso millis() rispetto alla frequenza del quarzo, oppure c'è qualcosa che gli fa perdere qualche ciclo..

... SE ci fosse un buon quarzo ... peccato che c'è un semplice oscillatore ceramico e la precisione di millis() sulle 24 ore ... è praticamnete inutilizzabile :confused:

Guglielmo

Atmega328+quarzo a circa 5€! :slight_smile:
Per la programmazione basta usare un programmatore ISP USBASP, che si trova a pochi Euro.

Datman:
Atmega328+quarzo a circa 5€! :slight_smile:
Per la programmazione basta usare un programmatore ISP USBASP, che si trova a pochi Euro.

Costa meno un DS3231 ed è più preciso (... oltre ad avere anche altre funzionalità) :smiley: :smiley: :smiley: :smiley:

Guglielmo

Beh... Io ho lanciato l'idea! :slight_smile:

Ciao Guglielmo,
Grazie per le dritte!! Sono stato un pò avaro e ho "letto" solo la parte di mio interesse :slight_smile:
Ed ecco il risultato che funziona!!

[code]
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <DS3231.h>

DS3231  rtc(SDA, SCL);

LiquidCrystal_PCF8574 lcd(0x3F);

void setup()
{
Serial.begin(115200);
Serial.println("Trial LCD + DS3231");

rtc.begin();

lcd.begin(20, 4); // initialize the lcd
lcd.setBacklight(255);
lcd.setCursor(0,0);
lcd.print(" 1th. Arduino Paolo ");
lcd.setCursor(0,2);
lcd.print("    LCD + DS3231  ");
delay(5000);
lcd.clear();
//rtc.setDOW(MONDAY);
} 

void loop()
{
Serial.print(rtc.getDOWStr(1));
Serial.print(" ");
  
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
  
Serial.println(rtc.getTimeStr());
Serial.print(" -- ");
  
Serial.println(rtc.getTemp());

lcd.setCursor(0,0);
lcd.print(rtc.getDOWStr(1));
lcd.setCursor(3,0);
lcd.print(",");

lcd.setCursor(4,0);
lcd.print(rtc.getDateStr());

lcd.setCursor(0,1);
lcd.print(rtc.getTimeStr());

lcd.setCursor(10,1);
lcd.print("t:");

lcd.setCursor(12,1);
lcd.print(rtc.getTemp());

lcd.setCursor(0, 2);
lcd.print("Mangiatoia");

lcd.setCursor(0, 3);
lcd.print("Automatica");

delay (1000);
}

[/code]

Ora ti chiedo l'ennesima info :smiley:
Ma come creo un evento (movimento del servo) ad un'ora ben precisa?
O meglio riformulo correttamente la domanda come si chiama la funzione da usare?
Sicuramente un libro lo prendo è troppo bello vedere le cose che si possono fare!!

Ciao a tutti,
Ma mi convince usare la funzione Alarm? e richiamare il movimento al servo ed eventualmente anche per il riposizionamento del servo in posizione di partenza sempre con un Alarm?
Grazie mille

Perché no? Non ricordo i metodi della libreria, ma se c'è un qualche cosa con cui puoi richiamare un allarme ... usalo senza stare ad impazzire con altri sistemi ::slight_smile:

Guglielmo

gpb01:
Perché no? Non ricordo i metodi della libreria, ma se c'è un qualche cosa con cui puoi richiamare un allarme ... usalo senza stare ad impazzire con altri sistemi ::slight_smile:

Guglielmo

Alla fine ho provato con if ma senza successo....
Potete aiutarmi?
Grazie mille

Errore:

Primo_test_RCT_LCD_SERVO2:74: error: expected unqualified-id before 'if'

 if lcd.print(rtc.getTimeStr() = "00:05:00" ;  {

 ^

Primo_test_RCT_LCD_SERVO2:74: error: expected unqualified-id before '{' token

 if lcd.print(rtc.getTimeStr() = "00:05:00" ;  {

                                               ^

Multiple libraries were found for "DS3231.h"
 Used: C:\Users\sadm-m173356\Documents\Arduino\libraries\DS3231
 Not used: C:\Program Files\Arduino\libraries\DS3231-master

Istruzioni complete..

#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <DS3231.h>
#include <Servo.h>

DS3231  rtc(SDA, SCL);

LiquidCrystal_PCF8574 lcd(0x3F);

Servo servo1;

Servo servo2;

void setup()
{

Serial.begin(115200);
Serial.println("Trial LCD + DS3231");

rtc.begin();

lcd.begin(20, 4); // initialize the lcd
lcd.setBacklight(255);
lcd.setCursor(0,0);
lcd.print(" 1th. Arduino Paolo ");
lcd.setCursor(0,2);
lcd.print("    LCD + DS3231  ");
delay(5000);
lcd.clear();
//rtc.setDOW(MONDAY);
} 

void loop()
{
Serial.print(rtc.getDOWStr(1));
Serial.print(" ");
  
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
  
Serial.print(rtc.getTimeStr());
Serial.print(" -- ");
  
Serial.println(rtc.getTemp());

lcd.setCursor(0,0);
lcd.print(rtc.getDOWStr(1));
lcd.setCursor(3,0);
lcd.print(",");

lcd.setCursor(4,0);
lcd.print(rtc.getDateStr());

lcd.setCursor(0,1);
lcd.print(rtc.getTimeStr());

lcd.setCursor(10,1);
lcd.print("t:");

lcd.setCursor(12,1);
lcd.print(rtc.getTemp());

lcd.setCursor(0, 2);
lcd.print("Mangiatoia");

lcd.setCursor(0, 3);
lcd.print("Automatica");

lcd.scrollDisplayRight();

}

if lcd.print(rtc.getTimeStr() = "00:05:00" ;  {
  servo1.write(0);
  servo2.write(180);
  delay(10000);
  servo1.write(180);
  servo2.write(0);

delay (1000);

}

Grazie mille vado a dormire che alle 04:14 precise il gattone arriva :slight_smile:

Si, però ... un po' di buona volontà ed imparate a leggere gli errori che chiaramente vi dice il compilatore ...

  1. Ti pare corretta questa riga che ti indica il compilatore :
if lcd.print(rtc.getTimeStr() = "00:05:00" ;  {

... guardala bene e vedi cosa ti sei dimenticato.

  1. Ti segnala inoltre che hai fatto casino nell'installazione dell librerie (mi sa che ne hai installata qualcuna a mano invece di usare SOLO il "Library Manager") :
Multiple libraries were found for "DS3231.h"
 Used: C:\Users\sadm-m173356\Documents\Arduino\libraries\DS3231
 Not used: C:\Program Files\Arduino\libraries\DS3231-master

... come vedi hai messo DUE volte la stessa libreria in due posti differenti.

Guglielmo

gpb01:
Si, però ... un po' di buona volontà ed imparate a leggere gli errori che chiaramente vi dice il compilatore ...

  1. Ti pare corretta questa riga che ti indica il compilatore :

  2. Ti segnala inoltre che hai fatto casino nell'installazione dell librerie (mi sa che ne hai installata qualcuna a mano invece di usare SOLO il "Library Manager")

Guglielmo

Ciao Guglielmo
Cavolo mi sembra di essere tornato a scuola quando il proff mi cazziava per le cavolate in programmazione di plc CGE Fanuk :smiley:
Per il punto 1
credo di aver omesso delle parentesi ma non ne sono sicuro ho capito che ad una aperta ne deva corrispondere una chiusa ma il messaggio “unqualified-id before 'if'”
mi ha spiazzato....
Per il punto 2
Se seguo il percorso indicato (C:\Program Files\Arduino\libraries\DS3231-master)
la libreria rtc-master non c’è in quella cartella perchè non l’ho usata l’ho cancellata è forse quello il problema? Dovrei ripristinarla?
Grazie e buona giornata

Nestore1978:
Cavolo mi sembra di essere tornato a scuola quando il proff mi cazziava per le cavolate in programmazione di plc CGE Fanuk :smiley:

... io sono peggio dei prof :smiling_imp: :smiling_imp: :smiling_imp:

Nestore1978:
Per il punto 1
credo di aver omesso delle parentesi ma non ne sono sicuro ho capito che ad una aperta ne deva corrispondere una chiusa ma il messaggio “unqualified-id before 'if'” mi ha spiazzato....

Avendo omesso le parentesi il compilatore andava avanti, incontrava la graffa e non capiva più nulla, da qui quell'errore ...

E comunque, mi spieghi cosa vorresti che facesse quella IF ... perché mica l'ho capito ... anche mettendo delle parentisi non è che abbia comunque molto senso logico ... ::slight_smile:

Nestore1978:
Per il punto 2
Se seguo il percorso indicato (C:\Program Files\Arduino\libraries\DS3231-master)
la libreria rtc-master non c’è in quella cartella perchè non l’ho usata l’ho cancellata è forse quello il problema? Dovrei ripristinarla?

Se hai eliminato la cartella, hai poi chiuso e riaperto l'IDE?

Perché se la segnala l'IDE è convinto che ancora ci sia ...

Guglielmo

gpb01:

  1. Ti pare corretta questa riga che ti indica il compilatore :
if lcd.print(rtc.getTimeStr() = "00:05:00" ;  {

... guardala bene e vedi cosa ti sei dimenticato.

Eh magari fosse solo la graffa/parentesi, io direi anche il segno uguale... :wink:

docdoc:
Eh magari fosse solo la graffa/parentesi, io direi anche il segno uguale... :wink:

... ma anche con quello, mi dici che senso ha la IF su un lcd.print()? ... perché prima viene valutato il contenuto della lcd.print(), eseguita quest'ultima e poi fatto l'IF sul valore di ritorno ovvero ... sul numero dei bytes visualizzati :o :o :o

Guglielmo

P.S.: "lcd.print() will return the number of bytes written, though reading that number is optional".

Eh si.
C'è grossa crisi, stiamo miagolando nel buio (cit.). :smiley:

gpb01:
E comunque, mi spieghi cosa vorresti che facesse quella IF ... perché mica l'ho capito ... anche mettendo delle parentisi non è che abbia comunque molto senso logico ... ::slight_smile:

Guglielmo

Ciao
La mia idea era quella di usare la funzione IF per creare la condizione in cui ad un determinato orario il sistema comanda i due servo.
Ho forse sbagliato interpretare la funzione IF?
Leggendo i tutoria viene usata anche per comandare il servo da pulsanti...
(Pensavo di usare alarm ma mi è sembrato più complicato)

Nestore1978:
La mia idea era quella di usare la funzione IF per creare la condizione in cui ad un determinato orario il sistema comanda i due servo.
Ho forse sbagliato interpretare la funzione IF?

Beh la if() è una delle basi della programmazione (in generale non solo per Arduino, C, C++...) quindi temo che per fare le cose per bene dovresti PRIMA cercare di capire le basi, POI iniziare a "sperimentare" con piccoli programmini, e solo DOPO iniziare a "usare" o "modificare" programmi trovati in rete...

Quella if() dovrebbe essere così, almeno per il suo funzionamento ossia di fare "ualcosa" a mezzanotte e 5 minuti (che poi sia corretto all'interno dell'applicazione è un altro discorso):

if (rtc.getTimeStr() == "00:05:00") {

Si, l'IF serve per verificare una condizione, ma ... la condizione deve essrere una cosa verificabile e quello che hai scritto non lo è:

  1. il metodo getTimeStr() ritorna un char *, ovvero una string classica del 'C' che NON è comparabile con l'operatore di uguaglianza ==, ovvero, NON puoi fare IF(getTimeStr() == "00:05:00") perché NON è ammesso quel tipo di comparazione.
    Per Comparare stringhe classiche del 'C' si usa la strcmp() che trovi in <string.h> che è in AVR libc (libreria SEMPRE inclusa dall'IDE).

  2. in ogni caso tu stavi facendo una IF su una lcd.print() che ritorna il numero di caratteri stampati !

... perdona, senza offesa, dovresti prenderti un buon testo di 'C' e studiare un po il linguaggio ::slight_smile:

Guglielmo

P.S.: Occhio docdoc che la getTimeStr() ritorna un char * e non una String con cui puoi usare l'operatore ==

char	*getTimeStr(uint8_t format=FORMAT_LONG);

gpb01:
Si, l'IF serve per verificare una condizione, ma ... la condizione deve essrere una cosa verificabile e quello che hai scritto non lo è:

char	*getTimeStr(uint8_t format=FORMAT_LONG);

Uhmm fatemi capire IF può comparare un ingresso di logica fisico come un pulsante/tasto ma non pò comparare un valore ricevuto da un RTC giusto?
Ma come posso creare un evento in determinato tempo usando il modulo rtc?
Grazie mille