FORUM: Informatica ed Elettronica
Dedicato all'informatica per l'elettronica. Un posto in cui scambiarsi consigli nell'utilizzo di applicazioni legate al nostro hobby o per condividere del software per applicazioni elettroniche. (PS: E' vietato inserire link a materiale "pirata")
Ho preso da internet uno sketch di un orologio con rtc 1306,purtroppo il compilatore alla riga for(i=0;i registro da\' l\'errore expcted \';\' before \'registro\'.So che manca qualcosa nel for,ma nonostante mi sia sforzato,non sono riuscito a completarlo.Potete aiutarmi? Grazie
qui iCodice: Seleziona tutto
#include <LCD.h>
#include <LiquidCrystal.h>
/* --------------------------------------------------------------------------
Imposto l\'orario su un modulo RTC (con interfaccia seriale I2C) tramite il
keypad (# per settare la data e * per settare l\'orario) e poi lo mostro su
un display LCD 20x4 con interfaccia seriale I2C \"YwRobot Arduino LCM1602
IIC V1\". Il pin SDA di I2C è connesso alla pin analogico A4 mentre SCL e\'
connesso alla pin analogico A5
-------------------------------------------------------------------------- */
#include \"Wire.h\" // E\' richiesta da I2CIO.cpp
void Registra()
{
DateTime DataOraRTC = RTC.now();
DateTime DataOraNuova;
uint8_t dd, mm, hh, ss;
uint16_t yy;
if (cifre.length()!=6) return; // ignoro # o * prima delle 6 cifre
if (AttivaModificaOra==true)
{
hh=(uint8_t)cifre.substring(0,2).toInt();
mm=(uint8_t)cifre.substring(2,4).toInt();
ss=(uint8_t)cifre.substring(4,6).toInt();
if ( EUnOraCorretta(hh,mm,ss) )
{
DataOraNuova=DateTime(DataOraRTC.year(),DataOraRTC.month(),
DataOraRTC.day(),hh,mm,ss);
RTC.adjust(DataOraNuova);
MessaggioAvviso(\"SET ORA \",\"Orario settato!\");
}
else
MessaggioAvviso(\"SET ORA \",cifre.substring(0,2)+\":\"
+cifre.substring(2,4)+\":\"
+cifre.substring(4,6)+\" ERRATA!\");
}
else if (AttivaModificaData==true)
{
dd=(uint8_t)cifre.substring(0,2).toInt();
mm=(uint8_t)cifre.substring(2,4).toInt();
yy=(uint16_t)(2000+cifre.substring(4,6).toInt());
if ( EUnaDataCorretta(dd,mm,yy) )
{
DataOraNuova=DateTime(yy,mm,dd,DataOraRTC.hour(),
DataOraRTC.minute(),DataOraRTC.second());
RTC.adjust(DataOraNuova);
MessaggioAvviso(\"SET DATA\",\"Data settata!\");
}
else
MessaggioAvviso(\"SET DATA\",cifre.substring(0,2)+\"/\"
+cifre.substring(2,4)+\"/\"
+cifre.substring(4,6)+\" ERRATA!\");
}
AnnullaSet();
}
void StampaConSeparatore(String cifr)
{
int i;
char sep=(AttivaModificaData) ? \'/\' : \':\';
Pulisci4Riga();
lcd.setCursor(0,3);
lcd.print(\">> IN: \");
for (i=0; i registro // Qua e\' l\'errore
Registra();
else if (AttivaModificaOra)
{
AnnullaSet(); // Azzero l\'impostazione della data
Pulisci3e4Riga();
}
else
{
AttivaModificaData=true;
cifre=\"\";
MessaggioAvviso(\"SET DATA\",\"IN: GG:MM:AA\");
}
}
else if (key==\'*\') // Imposta orario
{
if (AttivaModificaOra) // 2° * => registro
Registra();
else if (AttivaModificaData)
{
AnnullaSet(); // Azzero l\'impostazione dell\'ora
Pulisci3e4Riga();
}
else
{
AttivaModificaOra=true;
cifre=\"\";
MessaggioAvviso(\"SET ORA \",\"IN: HH:MM:SS\");
}
}
else if (AttivaModificaOra || AttivaModificaData)
{
if (cifre.length()<6) // non vado oltre le 6 cifre
{
cifre=cifre+String(key);
StampaConSeparatore(cifre);
}
}
}
delay(20);
}
l codice
gironico
postato il: 12.10.2018, alle ore 14:18
non è solo un problema del ciclo for che parte da zero e che deve fare?
Dal tuo sketch non si capisce...
for (i=0;i++; i<=registro) // Qua e\' l\'errore
Registra();
già cosi è diverso... si capisce che il ciclo incrementa la variabile i fino al valore di registro....
che non è neanche dichiarata e non si capisce che valore deve avere
Poi viene il bello....
una cascata di ELSE .... ma La condizione IF?
Cioè.... fai questo(IF) altrimenti se la condizione non è soddisfatta fai altro (ELSE)
Copia incolla da internet è la pessima soluzione.... si inizia con cose semplici, non si parte con un lcd in i2c, un keypad e un rtc quando non si ha la minima idea di cosa si sta facendo e cosa abbiamo tra le mani....
Spiega cosa vuoi fare fare a questo sketch che è inintuibile... che deve visualizzare l'ora e chiaro... ma cosa deve fare, personalmente non l'ho capito.
Mi sembra uno sketch molto gomitoloso ...
La vita è troppo breve per bere vini mediocri
gironico
postato il: 12.10.2018, alle ore 14:40
Cosi a naso potrebbe essere anche corretto ciò che è scritto, ma manca giusto un paio di cosette fondamentali per compilarlo bene....
// #include <LCD.h>
#include <LiquidCrystal.h>
/* --------------------------------------------------------------------------
Imposto l\'orario su un modulo RTC (con interfaccia seriale I2C) tramite il
keypad (# per settare la data e * per settare l\'orario) e poi lo mostro su
un display LCD 20x4 con interfaccia seriale I2C \"YwRobot Arduino LCM1602
IIC V1\". Il pin SDA di I2C è connesso alla pin analogico A4 mentre SCL e\'
connesso alla pin analogico A5
-------------------------------------------------------------------------- */
#include "Wire.h" // E\' richiesta da I2CIO.cpp
// *************************************************************
// IMPOSTAZIONE PER IL KEYPAD
// *************************************************************
#include "Keypad.h"
const byte ROWS = 4; //4 righe
const byte COLS = 3; //3 colonne
char keys[ROWS][COLS] =
{
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; // Pin di arduino connessi ai pin 1,2,3 e 4 delle righe del keypad
byte colPins[COLS] = {4, 3, 2}; // Pin di arduino connessi ai pin 5,6,7 delle righe del keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// *************************************************************
// IMPOSTAZIONI PER IL DISPLAY LCD
// *************************************************************
#include "LiquidCrystal_I2C.h" // Libreria LCD I2C
// Imposta i pin usati sul chip I2C per le connessioni
// con il display LCD: addr, en, rw ,rs ,d4 ,d5 ,d6 ,d7 ,bl ,blpol
// ed inoltre pone l\'indirizzo del display a 0x27
LiquidCrystal_I2C lcd(0x27,16,2);
// -------------------------------------------------------------
// PROGRAMMA VERO E PROPRIO
// -------------------------------------------------------------
// Variabili globali necessarie al nostro progetto.
#define StringaVuota " ";
String cifre="";
boolean AttivaModificaData;
boolean AttivaModificaOra;
void Registra()
{
DateTime DataOraRTC = RTC.now();
DateTime DataOraNuova;
uint8_t dd, mm, hh, ss;
uint16_t yy;
if (cifre.length()!=6) return; // ignoro # o * prima delle 6 cifre
if (AttivaModificaOra==true)
{
hh=(uint8_t)cifre.substring(0,2).toInt();
mm=(uint8_t)cifre.substring(2,4).toInt();
ss=(uint8_t)cifre.substring(4,6).toInt();
if ( EUnOraCorretta(hh,mm,ss) )
{
DataOraNuova=DateTime(DataOraRTC.year(),DataOraRTC.month(),
DataOraRTC.day(),hh,mm,ss);
RTC.adjust(DataOraNuova);
MessaggioAvviso("SET ORA ","Orario settato!");
}
else
MessaggioAvviso("SET ORA ",cifre.substring(0,2)+":"
+cifre.substring(2,4)+":"
+cifre.substring(4,6)+" ERRATA!");
}
else if (AttivaModificaData==true)
{
dd=(uint8_t)cifre.substring(0,2).toInt();
mm=(uint8_t)cifre.substring(2,4).toInt();
yy=(uint16_t)(2000+cifre.substring(4,6).toInt());
if ( EUnaDataCorretta(dd,mm,yy) )
{
DataOraNuova=DateTime(yy,mm,dd,DataOraRTC.hour(),
DataOraRTC.minute(),DataOraRTC.second());
RTC.adjust(DataOraNuova);
MessaggioAvviso("SET DATA","Data settata!");
}
else
MessaggioAvviso("SET DATA",cifre.substring(0,2)+" "
+cifre.substring(2,4)+" "
+cifre.substring(4,6)+" ERRATA!");
}
AnnullaSet();
}
void StampaConSeparatore(String cifr)
{
int i;
int registro;
char sep=(AttivaModificaData) ;
Pulisci4Riga();
lcd.setCursor(0,3);
lcd.print(">> IN: ");
for (i=0;i++; i<registro) // Qua e\' l\'errore
Registra();
if (AttivaModificaOra)
{
AnnullaSet(); // Azzero l\'impostazione della data
Pulisci3e4Riga();
}
else
{
AttivaModificaData=true;
cifre="";
MessaggioAvviso("SET DATA","IN: GG:MM:AA");
}
if (keys=='*') // Imposta orario
{
if (AttivaModificaOra) // 2° * => registro
Registra();
if (AttivaModificaData)
{
AnnullaSet(); // Azzero l\'impostazione dell\'ora
Pulisci3e4Riga();
}
else
{
AttivaModificaOra=true;
cifre="";
MessaggioAvviso("SET ORA ","IN: HH:MM:SS");
}
}
else if (AttivaModificaOra || AttivaModificaData)
{
if (cifre.length()<6) // non vado oltre le 6 cifre
{
// cifre=cifre+String(keys);
StampaConSeparatore(cifre);
}
}
delay(20);
}
Apparte(fondamentale) il void setup soprattutto per le inizializzazioni di lcd e rtc....
ma il void loop?
inutile scrivere sub-routine se puoi non si richiamano nel loop infinito da far girare...
Secondo me, non me ne volere, ma è meglio che ripassi le basi della programmazione di Arduino prima di proseguire....
Per chiarimenti... con il meglio che si può fare.... siamo qui.... ma occorre le basi prima
La vita è troppo breve per bere vini mediocri
papa
postato il: 12.10.2018, alle ore 15:41
non ho molta conoscenza di programmazione,mi sono sforzato non riuscendo e mi sono rivolto a voi,oltretutto mi serve solo per tenermi attivo,considerando che ho una eta'...avanzata.Comunque ti mando il link da dove ho scaricato lo sketch.
http://www.brescianet.com/appunti/Elettronica/Arduino/corso/… .Ti ringrazio e ti saluto
picmicro675
postato il: 12.10.2018, alle ore 20:24
Se vuoi fare le braciole alla griglia, meglio se ne metti una alla volta.
Per questo comincia con un solo componente alla volta. Direi di montare il display e giocherellare a scrivere dei testi. Acquisita esperienza con quello, si potrebbe provare a montare il tastierino, vedere che è collegato bene che i numeri corrispondono e li fai scrivere al display.
Alla fine provi con l' RTC, vedi se legge i dati, se i collegamenti sono corretti.
Poi facci vedere cosa hai messo insieme, magari qualche foto.
Approp. A che punto stai con il montaggio ?
Anno nuovo, forum nuovo.
Mi sa che lascio.
papa
postato il: 12.10.2018, alle ore 23:10
se non risolvo il problema dello sketch a che serve montare il circuito.Lo sketch riveduto e corretto da gironico ,il compilatore mi da' adesso :errore durante la compilazione per la scheda arduino -genuino
picmicro675
postato il: 13.10.2018, alle ore 05:10
papa: il compilatore mi da' adesso :errore durante la compilazione per la scheda arduino -genuino
Eggià , come se lo vedessimo..... Quale ?
Scrivilo qui.
A me dice che senza main() e senza loop() non vai lontano
/tmp/ccbBCjpA.ltrans0.ltrans.o: In function `main':
/home/myself/.arduino15/packages/arduino/hardware/avr/1.6.20/cores/arduino/main.cpp:43: undefined reference to `setup'
/home/myself/.arduino15/packages/arduino/hardware/avr/1.6.20/cores/arduino/main.cpp:46: undefined reference to `loop'
collect2: error: ld returned 1 exit status
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.
Direi che da fare un progetto come questo senza essere passati dal far lampeggiare un semplice LED, direi che sono ambizioni senza risultati. Spero di sbagliarmi.
Anno nuovo, forum nuovo.
Mi sa che lascio.
papa
postato il: 13.10.2018, alle ore 07:51
ecco cosa viene fuori
ATTENZIONE: Cartella spuria .tests nella libreria 'Adafruit IO Arduino'
C:\Users\Federico\AppData\Local\Temp\ccXHIHpU.ltrans0.ltrans.o: In function `main':
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.15.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/main.cpp:43: undefined reference to `setup'
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.15.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'
collect2.exe: error: ld returned 1 exit status
Più di una libreria trovata per "LiquidCrystal.h"
Usata: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.15.0_x86__mdqgnx93n4wtt\libraries\LiquidCrystal
Non usata: C:\Users\Federico\Documents\Arduino\libraries\NewliquidCrystal
Più di una libreria trovata per "Wire.h"
Usata: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.15.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\libraries\Wire
Non usata: C:\Users\Federico\Documents\Arduino\libraries\Wire
Più di una libreria trovata per "LiquidCrystal_I2C.h"
Usata: C:\Users\Federico\Documents\Arduino\libraries\LiquidCrystal_I2C
Non usata: C:\Users\Federico\Documents\Arduino\libraries\NewliquidCrystal
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.
double_wrap
postato il: 13.10.2018, alle ore 13:20
papa: se non risolvo il problema dello sketch a che serve montare il circuito.Lo sketch riveduto e corretto da gironico ,il compilatore mi da' adesso :errore durante la compilazione per la scheda arduino -genuino
Allarga in alto la finestra NERA degli errori per vedere QUALE errore ti da il compilatore
Hai installato tutte le librerie usate : <keypad.h>, <LiquidCrystal_I2C.h> che è DIVERSA da #include <LiquidCrystal.h>, RTC_DS1307.h?
Per la cronaca io ho testato il codice del sito linkato con la libreria dopo aver installato la libreria <LiquidCrystal_I2C.h>, ma il compilatore da errore sulla costante POSITIVE della dichiarazione, quindi non e' la libreria giusta (purtroppo ce ne sono svariate versioni)
Come ti hanno detto compila un pezzo alla volta con un codice ridotto che usa una sola libreia alla volta, altrimenti diventi matto!
"se peso cado, ma se cado non peso"
adamatj.altervista.org
picmicro675
postato il: 13.10.2018, alle ore 13:29
La pagina da dove hai preso il codice ha altri sorgenti, che dovrebbero funzionare, che sono scopiazzati da qualcun altro. Quello che hai preso è incompleto e non rende a nulla.
Ci sono i link delle librerie usate, ma forse sono obsolete come anche tutta la pagina si riferisce a cose di una certa età .
Senza contare che un DS1302 ha una deriva di qualche minuto al giorno. Consiglio di prendere un DS3231.
Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito