buon giorno a tutti. vorrei realizzare una centralina countdown , ma al momento sono bloccato col ciclo for perché non conta . Al momento vorrei solamente capire dove sbaglio , in un secondo momento giocherò con i tempi corretti , usando la millis .
grazie in anticipo.
#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>
PCF8574_HD44780_I2C lcd(0x27,16,2);
#define PERIODO_ACQ 60000 //un minuto
#define pinClk 3 //Definizione pin ingresso
#define pinDt 5 //Definizione pin ingresso
#define pinSW 4 //Definizione pin ingresso
#define pinSTART 11 //Definizione pin ingresso
int era_Clk; // Conserva stato ultima posizione encoder
int era_Dt; // Conserva stato ultima posizione encoder
int era_SW; // Conserva stato ultima posizione encoder
int contatore = 0; // Variabile per calcolo
unsigned long lastMillisAcq = 0; //variabile tempo
void setup()
{
Serial.begin(9600);
pinMode (pinClk, INPUT); //pin Clk ingresso
pinMode (pinDt, INPUT); //pin Dt ingresso
pinMode (pinSW, INPUT); //pin SW ingresso
pinMode (pinSTART, INPUT_PULLUP); //pinSTART ingresso
era_Clk = digitalRead(pinClk); // Esegui prima lettura dei valori sui pin
era_Dt = digitalRead(pinDt); // Esegui prima lettura dei valori sui pin
era_SW = digitalRead(pinSW); // Esegui prima lettura dei valori sui pin
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hello");
lcd.setCursor(0,1);
lcd.print("World!");
}
void loop()
{
int ora_Clk = digitalRead(pinClk); // Leggi valori tempo reale
int ora_Dt = digitalRead(pinDt); // Leggi valori tempo reale
int ora_SW = digitalRead(pinSW); // Leggi valori tempo reale
if (ora_Clk != era_Clk) { // Se la lettura corrente è diversa dall'ultima memorizzata
Serial.print("[era_Clk, era_Dt | ora_Clk, ora_Dt] = "); // scrivo i dati su seriale.
Serial.print(era_Clk);
Serial.print(" ");
Serial.print(era_Dt);
Serial.print(" | ");
Serial.print(ora_Clk);
Serial.print(" ");
Serial.print(ora_Dt);
if (ora_Dt == ora_Clk) { //Se il valore di dt è uguale al valore corrente di clk
Serial.print(" -"); //metto il segno meno
contatore --; //decremento il valore
} else { //altrimenti
Serial.print(" +"); //metto il segno più
contatore ++; //aumento il valore
}
Serial.print(" => "); //Scrivo lo stato del contatore
Serial.println(contatore);
era_Clk = ora_Clk; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
era_Dt = ora_Dt; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" tempo =");
lcd.setCursor(6,1);
lcd.print(contatore);
}
if ((contatore > 0) && (digitalRead(pinSTART))) {
delay(1000);
for (int c = contatore; c -- ; c = 0) ;{
Serial.println ("START");
Serial.println (contatore);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" tempo =");
lcd.setCursor(5,1);
lcd.print(contatore);}
}
era_SW = ora_SW; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
}
/*
#define PERIODO_ACQ 60000 //un minuto
unsigned long lastMillisAcq = 0;
if ( millis() - lastMillisAcq > 60000 ) {
lastMillisAcq = millis();
pseudocodice
if (contatore < 99) && (digitalRead(pin2) == HIGH) contatore++;
if (contatore > 1) && (digitalRead(pin2) == LOW) contatore--;
*/
Errata la sintassi. Se metti un ; a fine for hai "chiuso" il for
Quello è come scrivere
for (int c = contatore; c -- ; c = 0) { ciclo senza niente dentro} ; { altro blocco...
magari adesso però , un bel link che mi chiarisca come e dove inserire il tempo di conteggio , sarebbe il top.
ed approfitto anche per dire una cosuccia che mi sta a cuore , che però riguarda il forum in generale : ma non sarebbe meglio meglio eliminare definitivamente tutte le discussioni chiuse dai moderatori (in particolare quelle chiuse per mancanza di presentazione del malcapitato di turno) senza sviluppo? Prima di postare cerco sempre se ne avete già discusso....ma diventa lunga la ricerca....
grazie ancora.
La notte porta consiglio (e pure un po' di fortuna) ; infatti sono arrivato dove volevo arrivare.
Allego il codice funzionante come lo avevo immaginato , ora implementerò ( forse, ma sono ottimista) una scala di gestione del tempo per stabilire se si tratta di secondi , ore o minuti.
#include <PCF8574_HD44780_I2C.h>
#include <Wire.h>
PCF8574_HD44780_I2C lcd(0x27,16,2);
#define PERIODO_ACQ 60000 //un minuto
#define pinClk 3 //Definizione pin ingresso
#define pinDt 5 //Definizione pin ingresso
#define pinSW 4 //Definizione pin ingresso
#define pinSTART 11 //Definizione pin ingresso
int era_Clk; // Conserva stato ultima posizione encoder
int era_Dt; // Conserva stato ultima posizione encoder
int era_SW; // Conserva stato ultima posizione encoder
int contatore = 0; // Variabile per calcolo
unsigned long lastMillisAcq = 0; //variabile tempo
void setup()
{
Serial.begin(9600);
pinMode (pinClk, INPUT); //pin Clk ingresso
pinMode (pinDt, INPUT); //pin Dt ingresso
pinMode (pinSW, INPUT); //pin SW ingresso
pinMode (pinSTART, INPUT_PULLUP); //pinSTART ingresso
era_Clk = digitalRead(pinClk); // Esegui prima lettura dei valori sui pin
era_Dt = digitalRead(pinDt); // Esegui prima lettura dei valori sui pin
era_SW = digitalRead(pinSW); // Esegui prima lettura dei valori sui pin
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hello");
lcd.setCursor(0,1);
lcd.print("World!");
}
void loop()
{
int ora_Clk = digitalRead(pinClk); // Leggi valori tempo reale
int ora_Dt = digitalRead(pinDt); // Leggi valori tempo reale
int ora_SW = digitalRead(pinSW); // Leggi valori tempo reale
if (ora_Clk != era_Clk) { // Se la lettura corrente è diversa dall'ultima memorizzata
Serial.print("[era_Clk, era_Dt | ora_Clk, ora_Dt] = "); // scrivo i dati su seriale.
Serial.print(era_Clk);
Serial.print(" ");
Serial.print(era_Dt);
Serial.print(" | ");
Serial.print(ora_Clk);
Serial.print(" ");
Serial.print(ora_Dt);
if (ora_Dt == ora_Clk) { //Se il valore di dt è uguale al valore corrente di clk
Serial.print(" -"); //metto il segno meno
contatore --; //decremento il valore
} else { //altrimenti
Serial.print(" +"); //metto il segno più
contatore ++; //aumento il valore
}
Serial.print(" => "); //Scrivo lo stato del contatore
Serial.println(contatore);
era_Clk = ora_Clk; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
era_Dt = ora_Dt; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" tempo =");
lcd.setCursor(6,1);
lcd.print(contatore);
}
if (digitalRead(pinSTART)) {
delay(300);
for (int c = contatore; c >= 1; c -- ) {
contatore -- ;
delay ( 1000) ;
Serial.println (contatore);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" tempo =");
lcd.setCursor(5,1);
lcd.print(contatore);}
}
era_SW = ora_SW; //Aggiorno i valori all'ultima lettura fatta, ultima posizione.
}
/*
#define PERIODO_ACQ 60000 //un minuto
unsigned long lastMillisAcq = 0;
if ( millis() - lastMillisAcq > 60000 ) {
lastMillisAcq = millis();
pseudocodice
if (contatore < 99) && (digitalRead(pin2) == HIGH) contatore++;
if (contatore > 1) && (digitalRead(pin2) == LOW) contatore--;
*/