Mi sono bloccato, e si che dovevo contare

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

grazie, l'ho corretto ma ancora non conta...
ho pure aggiunto una riga...
comincio a brancolare.

    if ((contatore > 0) && (digitalRead(pinSTART))) {
     delay(1000);
     for (int c = contatore;  c -- ; c = 0) {
    contatore -- ; 
    Serial.println ("START");
    Serial.println (contatore);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("  tempo =");
    lcd.setCursor(5,1);
    lcd.print(contatore);}
   
  }

Anche il resto della sintassi del for è errata
for (int c = contatore; c>=0; c -- ) {

...azzo se viaggia!! velocissimo:
Grazie mille.

magari adesso però , un bel link che mi chiarisca come e dove inserire il tempo di conteggio , sarebbe il top. :thinking:
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.

Guarda questo:

1 Like

Guardare.
Per guardare , guardo.
Di più non credo di poter sperare.
:smile: :smile: :smile:
Grazie.

I miei commenti sono sempre precisi e abbondanti... :slight_smile:

1 Like

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--;   
    */

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.