Problema con debounce e con le uscite

Ciao a tutti avrei bisogno del vostro prezioso aiuto, ho questo circuito che dovrebbe fare questo:

  1. premo contemporaneamente i due pulsanti per 2/3 sec. si alimenta va in auto ritenuta e passa allo stato ON rimanendo alimentato,
    • in questo stato si accende il led RGB e facendo lo spettro colori mi dà lo stato di carica della batteria,
    • sempre nello stato ON il pulsante 1 accende e spegne il led 1 e il pulsante 2 accende e spegne il led 2
  2. se ripremo i due pulsante contemporaneamente per 2/3 sec. si toglie auto ritenuta e si spegne il tutto
    cosa vorrei migliorare e non so come fare,
  3. avvenuto lo stato ON i pulsanti 1 e 2 dovrebbero avere un debounce variabile sia in accensione che in spegnimento, spiegandomi meglio faccio un esempio, vorrei poter accendere subito e spegnere dopo una pressione di 3sec il led 1 con il pulsante 1 e così anche il pulsante 2 magari accendo dopo pressione di 3sec. e spengo dopo altra pressione o subito, io ci ho provato ma non riesco ad avere ON o OFF in real time
  4. Altra cosa ma magari va messa prima vorrei che le uscite non siano attive prima di passare allo stato ON

mi aiutate per favore, Grazie

/*
per programmare attiny84 in circuit è stato aggiunto connettore 6 cpin con questi collegamenti
pin 1 - Vcc 5v
pin 2 - su attiny84 pin 4 su arduino pin 10
pin 3 - su attiny84 pin 7 su arduino pin 11
pin 4 - su attiny84 pin 8 su arduino pin 12
pin 5 - su attiny84 pin 9 su arduino pin 13
pin 6 - GND

*/
#define PIN_RITENUTA 11 //su attiny84 pin fisico 10
#define PIN_PULS1    2 //su attiny84 pin fisico 6
#define PIN_PULS2    3 //su attiny84 pin fisico 7

#define led1  7 //su attiny84 pin fisico 2
#define led2  8 //su attiny84 pin fisico 8

int led1_state = HIGH;
int led2_state = HIGH;

byte rilasciato = 0;
unsigned long t = 0;
byte prem1Prec = 0;
byte prem2Prec = 0;

int S = 0;

// Button states and debounce
int buttonState1 = 0;
int buttonState2 = 0;
int lastButtonState1 = LOW;
int lastButtonState2 = LOW;
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;

  // Arduino
#define sensorPin A2  //su attiny84 pin fisico 11
int ledRPin = 5;      //RED LED su attiny84 pin fisico 3
int ledGPin = 6;      //GREEN LED su attiny84 pin fisico 12
int ledBPin = 4;      //BLUE LED su attiny84 pin fisico 13


int u = 0;  // variable to store the value coming from the sensor
int um = 0;  // sum
int numero = 0; // number

float u0, u1, ux;

float k0 = 1.016;  // correction for resistive divider
float k=(float)4.88/5.; // corection voltage ("real 5V" / 5V)
// define voltage steps (step = 1023 * voltage_threshold /20)
/*
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 593;       // 95%
int step3 = 562;       // 90%
int step4 = 499;       // 80%
int step5 = 468;       // 75%
*/
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 0.95*step1;       // 95%
int step3 = 0.9*step1;       // 90%
int step4 = 0.8*step1;      // 80%
int step5 = 0.75*step1;        // 75%

int isteresi = 2;         // per eliminare i cambiamenti veloci
int pausa = 500;           // freno tra le misurazioni
int pausa2 = 300;           // tempo in ms per il flash rosso (acceso/spento)
int letture = 50;          // numero di misurazioni

// Coomon Anode
byte spento = 1;
byte acceso = 0;

/*
// Comon Cathode
byte spento = 0;
byte acceso = 1;
*/


void setup() 
{
    pinMode(led1, OUTPUT);
    pinMode(PIN_PULS1, INPUT_PULLUP);
   
    
    pinMode(led2, OUTPUT);
    pinMode(PIN_PULS2, INPUT_PULLUP);
    
    
    pinMode(PIN_RITENUTA, OUTPUT);
    //digitalWrite(PIN_RITENUTA, 1);

  Serial.begin(9600);
  // declare the ledPins as an OUTPUT:
  pinMode(ledRPin, OUTPUT);  
  pinMode(ledGPin, OUTPUT);
  pinMode(ledBPin, OUTPUT);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);

  pinMode(sensorPin, INPUT);   
}

void loop() 
{
    delay(40); // debounce barbaro minimo

    // letture ingressi con riconoscimento
    // click su rilascio

    byte prem1 = (digitalRead(PIN_PULS1) == 0);
    byte click1 = !prem1 && prem1Prec;
    prem1Prec = prem1;

    byte prem2 = (digitalRead(PIN_PULS2) == 0);
    byte click2 = !prem2 && prem2Prec;
    prem2Prec = prem2;


    // Gestione autoritenuta

    if(S==0 && prem1 && prem2)
    {
      if(millis() - t > 2000)
      {
        digitalWrite(PIN_RITENUTA, 1);
        S = 1;
      }
    }
    else if (S==1 && !prem1 && !prem2)
      {
        S = 2;
      }
      else if (S==2 && prem1 && prem2)
      {
        if(millis()-t> 2000)
          {
            digitalWrite(PIN_RITENUTA, 0);
          }
        }
        else
        {
          t=millis();     
        }
        
      int reading1 = digitalRead(PIN_PULS1);
  if (reading1 != lastButtonState1)
    lastDebounceTime1 = millis();

  if ((millis() - lastDebounceTime1) > 500) {
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      if (buttonState1 == LOW) {
        led1_state = !led1_state;
      }
    }
  }

  lastButtonState1 = reading1;

  digitalWrite(led1, led1_state);

      int reading2 = digitalRead(PIN_PULS2);
  if (reading2 != lastButtonState2)
    lastDebounceTime2 = millis();

  if ((millis() - lastDebounceTime2) > 500) {
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      if (buttonState2 == LOW) {
        led2_state = !led2_state;
      }
    }
  }

  lastButtonState2 = reading2;

  digitalWrite(led2, led2_state);

    if (S == 2)
    {
      powerON();
    }
 
}  // end main loop

void powerON()
{
  /*
  // all leds are off
    digitalWrite(ledRPin, spento);    // turn the red led off
    digitalWrite(ledGPin, spento);    // turn the green led off
    digitalWrite(ledBPin, spento);    // turn the blue led off
*/
  
  // read the value from the sensor:
  um = 0;
  for (int i = 0; i < letture; i++) 
  {
  u = (float)(k0 * k *analogRead(sensorPin));  
  delay(10);
  um = um + u;
  }
  ux = (float)(um/letture);
  u0 = (float)(ux * 5. / 1024); // voltage on uC pin
  u1 = (float)(4. *  u0 );
  //Serial.print("step = ");
  //Serial.print(u);
  //Serial.print("/1024 = ");
  //Serial.print(u1);
  //Serial.println("V");  

   
// voltage below 75% -> flash RED
if (u < step5)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  //Serial.println("<75% = <9.2V ===> R");
  delay(pausa2);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  delay(pausa2);
}

// voltage over 75% & below 80% -> YeLLOW (RED + GREEN)
if (u >= step5 && u < step4-isteresi)
{ 
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("75..80% = 9.2..9.8V ===> R+G");
  delay(pausa);
}


// voltage over 80% & below 90% -> GREEN
if (u >= step4 && u < step3-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("80..90% = 9.8..11.0V ===> G");
  delay(pausa);
}


// voltage over 90% & below 95% -> CYAN (BLUE + GREEN)
if (u >= step3 && u < step2-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, acceso);
  //Serial.println("90..95% = 11.0..11.6V ===> B+G");
  delay(pausa);
}

// voltage over 95% & below 100% -> BLUE
if (u >= step2 && u <= step1-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println("95..100% = 11.6..12.2V ===> B");
  delay(pausa);
}

// voltage over 12,2V (> 100%) -> MAUVE (RED + BLUE)
if (u > step1)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println(">100% = 12.2V ===> R+B");
  /*
  delay(300);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  */
  delay(pausa);
}
}

Più di così vorrebbe dire scriverti il programma...

No non pretendo che mi scrivi il programma, però un altro aiuto sì, ho seguito le tue indicazioni ma non ho capito l'ultima parte della logica, non capisco cosa devo fare, ti allego quello che ho fatto se sei così gentile da vedere se va bene e cosa ho sbagliato o cosa devo aggiungere, ti ringrazio infinitamente

/*
per programmare attiny84 in circuit è stato aggiunto connettore 6 cpin con questi collegamenti
pin 1 - Vcc 5v
pin 2 - su attiny84 pin 4 su arduino pin 10
pin 3 - su attiny84 pin 7 su arduino pin 11
pin 4 - su attiny84 pin 8 su arduino pin 12
pin 5 - su attiny84 pin 9 su arduino pin 13
pin 6 - GND

*/
#define PIN_RITENUTA 11 //su attiny84 pin fisico 10
#define PIN_PULS1    2 //su attiny84 pin fisico 6
#define PIN_PULS2    3 //su attiny84 pin fisico 7

#define led1  7 //su attiny84 pin fisico 2
#define led2  8 //su attiny84 pin fisico 8

int led1_state = HIGH;
int led2_state = HIGH;

byte rilasciato = 0;
unsigned long t = 0;
unsigned long TP1=0;
unsigned long TP2=0;
byte prem1Prec = 0;
byte prem2Prec = 0;

int S = 0;
int SP1 =0;
int SP2 = 0;
int se = 0;

long Tacc1 = 500; //tempo di accensione pulsante 1 in millesecondi
long Tspegn1 = 1000; //tempo di spegnimento pulsante 1 in millesecondi
long Tacc2 = 500; //tempo di accensione pulsante 2 in millesecondi
long Tspegn2 = 500; //tempo di spegnimento pulsante 2 in millesecondi

  // Arduino
#define sensorPin A2  //su attiny84 pin fisico 11
int ledRPin = 5;      //RED LED su attiny84 pin fisico 3
int ledGPin = 6;      //GREEN LED su attiny84 pin fisico 12
int ledBPin = 4;      //BLUE LED su attiny84 pin fisico 13


int u = 0;  // variable to store the value coming from the sensor
int um = 0;  // sum
int numero = 0; // number

float u0, u1, ux;

float k0 = 1.016;  // correction for resistive divider
float k=(float)4.88/5.; // corection voltage ("real 5V" / 5V)
// define voltage steps (step = 1023 * voltage_threshold /20)
/*
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 593;       // 95%
int step3 = 562;       // 90%
int step4 = 499;       // 80%
int step5 = 468;       // 75%
*/
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 0.95*step1;       // 95%
int step3 = 0.9*step1;       // 90%
int step4 = 0.8*step1;      // 80%
int step5 = 0.75*step1;        // 75%

int isteresi = 2;         // per eliminare i cambiamenti veloci
int pausa = 500;           // freno tra le misurazioni
int pausa2 = 300;           // tempo in ms per il flash rosso (acceso/spento)
int letture = 50;          // numero di misurazioni

// Coomon Anode
byte spento = 1;
byte acceso = 0;

/*
// Comon Cathode
byte spento = 0;
byte acceso = 1;
*/


void setup() 
{
    pinMode(led1, OUTPUT);
    pinMode(PIN_PULS1, INPUT_PULLUP);
   
    
    pinMode(led2, OUTPUT);
    pinMode(PIN_PULS2, INPUT_PULLUP);
    
    
    pinMode(PIN_RITENUTA, OUTPUT);
    //digitalWrite(PIN_RITENUTA, 1);

  Serial.begin(9600);
  // declare the ledPins as an OUTPUT:
  pinMode(ledRPin, OUTPUT);  
  pinMode(ledGPin, OUTPUT);
  pinMode(ledBPin, OUTPUT);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);

  pinMode(sensorPin, INPUT);   
}

void loop() 
{
    
(40); // debounce barbaro minimo

    // letture ingressi con riconoscimento
    // click su rilascio

    byte prem1 = (digitalRead(PIN_PULS1) == 0);
    byte click1 = !prem1 && prem1Prec;
    prem1Prec = prem1;

    byte prem2 = (digitalRead(PIN_PULS2) == 0);
    byte click2 = !prem2 && prem2Prec;
    prem2Prec = prem2;


    // Gestione autoritenuta

    if(S==0 && prem1 && prem2)
    {
      if(millis() - t >= 2000)
      {
        digitalWrite(PIN_RITENUTA, 1);
        S = 1;
      }
    }
    else if (S==1 && !prem1 && !prem2)
      {
          SP1 = 1;
  SP2 = 1;
  se = 1;
  S = 2;
      }
      else if (S==2 && prem1 && prem2)
      {
        if(millis()-t>= 2000)
          {
            digitalWrite(PIN_RITENUTA, 0);
          }
        }
        else
        {
          t=millis();     
        }
        
  if(SP1 ==1 && prem1 && !prem2)
  {
    if(millis() - TP1 >= Tacc1)
    {
      digitalWrite(led1, HIGH);
      SP1 = 2;
    }
  }else if(SP1 == 2 && !prem1)
  {
    SP1 = 3;
  }else if(SP1 == 3 && prem1 && !prem2)
  {
    if(millis() - TP1 >= Tspegn1){
      digitalWrite(led1, LOW);
      SP1 = 4;
    }
  }else if(SP1 == 4){
    SP1=1;
  }else{
    TP1 = millis();
  }

  if(SP2 ==1 && prem2 && !prem1)
  {
    if(millis() - TP2 >= Tacc2)
    {
      digitalWrite(led2, HIGH);
      SP2 = 2;
    }
  }else if(SP2 == 2 && !prem2)
  {
    SP2 = 3;
  }else if(SP2 == 3 && prem2 && !prem1)
  {
    if(millis() - TP2 >= Tspegn2){
      digitalWrite(led2, LOW);
      SP2 = 4;
    }
  }else if(SP2 == 4){
    SP2=1;
  }else{
    TP2 = millis();
  } 
  
//sono arrivato fino a qua

    if (S == 2)
    {
      misure();
    }
 
}  // end main loop

void misure()
{
  /*
  // all leds are off
    digitalWrite(ledRPin, spento);    // turn the red led off
    digitalWrite(ledGPin, spento);    // turn the green led off
    digitalWrite(ledBPin, spento);    // turn the blue led off
*/
  
  // read the value from the sensor:
  um = 0;
  for (int i = 0; i < letture; i++) 
  {
  u = (float)(k0 * k *analogRead(sensorPin));  
  delay(10);
  um = um + u;
  }
  ux = (float)(um/letture);
  u0 = (float)(ux * 5. / 1024); // voltage on uC pin
  u1 = (float)(4. *  u0 );
  //Serial.print("step = ");
  //Serial.print(u);
  //Serial.print("/1024 = ");
  //Serial.print(u1);
  //Serial.println("V");  

   
// voltage below 75% -> flash RED
if (u < step5)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  //Serial.println("<75% = <9.2V ===> R");
  delay(pausa2);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  delay(pausa2);
}

// voltage over 75% & below 80% -> YeLLOW (RED + GREEN)
if (u >= step5 && u < step4-isteresi)
{ 
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("75..80% = 9.2..9.8V ===> R+G");
  delay(pausa);
}


// voltage over 80% & below 90% -> GREEN
if (u >= step4 && u < step3-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("80..90% = 9.8..11.0V ===> G");
  delay(pausa);
}


// voltage over 90% & below 95% -> CYAN (BLUE + GREEN)
if (u >= step3 && u < step2-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, acceso);
  //Serial.println("90..95% = 11.0..11.6V ===> B+G");
  delay(pausa);
}

// voltage over 95% & below 100% -> BLUE
if (u >= step2 && u <= step1-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println("95..100% = 11.6..12.2V ===> B");
  delay(pausa);
}

// voltage over 12,2V (> 100%) -> MAUVE (RED + BLUE)
if (u > step1)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println(">100% = 12.2V ===> R+B");
  /*
  delay(300);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  */
  delay(pausa);
}
}

Hai scritto una logica bloccante piena di delay. Per questo motivo non funziona niente in tempo reale. Va riscritta in modo non bloccante, esattamente come per le tre parti precedenti di gestione autoritenuta e pulsanti.

Io il disegno l'ho fatto sul codice che avevi postato (e tra l'altro non mi ero accorto che anche la media delle letture porta via ogni volta mezzo secondo), adesso hai cambiato qualcosa e non mi va di rifare ogni volta il disegno.

Quello che devi fare è realizzare questo usando millis e non delay:

Che, seguendo la stessa logica che hai scritto può essere così:

@Claudio_FF scusa, cosa usi per fare quei diagrammi ?

Sempre Fidocad

1 Like

Come vedete sul mio sketch che ho postato sopra, ho anche descritto dove sono arrivato "//sono arrivato fino a qua"
Non riesco a fare e a capire cosa devo scrivere sulla parte finale come mi ha descritto Claudio_FF c'è qualcuno che mi aiuta per favore, grazie

Io davo per scontato che il diagramma di flusso fosse leggibile come le altre parti...

if (se == 1)
{
    u = (float)(k0 * k *analogRead(sensorPin));  // singola misura
    um = um + u;
    te = millis();
    nMisure++;
    if (nMisure == 50) // se fatte tutte le 50 misure
    {
        nMisure = 0;
        // calcolo media
        ux = (float)(um/letture);
        u0 = (float)(ux * 5. / 1024); // voltage on uC pin
        u1 = (float)(4. *  u0 );
        accendiRGB(u);
        te = millis();
        if (u < step5)  // se deve fare flash
        {
            se = 3;
        }
        else            // altrimenti
        {
            se = 5;
        }
    }
    else
    {
        se = 2;
    }
}
else if (se == 2 && (millis()-te >= 10))
{
    ecc ecc...

@Claudio_FF mi aiuti per favore,
Ho scritto il codice come hai consigliato tu, funziona l'autoritenuta, ma i led 1 e 2 non fanno on/off. Non capisco il motivo in quanto il codice aggiunto non dovrebbe interferire e sembra essere corretta la parte di on/off dei due led.
Grazie in anticipo
Buona serata

/*
per programmare attiny84 in circuit è stato aggiunto connettore 6 cpin con questi collegamenti
pin 1 - Vcc 5v
pin 2 - su attiny84 pin 4 su arduino pin 10
pin 3 - su attiny84 pin 7 su arduino pin 11
pin 4 - su attiny84 pin 8 su arduino pin 12
pin 5 - su attiny84 pin 9 su arduino pin 13
pin 6 - GND

*/
#define PIN_RITENUTA 11 //su attiny84 pin fisico 10
#define PIN_PULS1    2 //su attiny84 pin fisico 6
#define PIN_PULS2    3 //su attiny84 pin fisico 7

#define led1  7 //su attiny84 pin fisico 2
#define led2  8 //su attiny84 pin fisico 8

int led1_state = HIGH;
int led2_state = HIGH;

byte rilasciato = 0;
unsigned long t = 0;
unsigned long te = 0;
unsigned long TP1=0;
unsigned long TP2=0;
byte prem1Prec = 0;
byte prem2Prec = 0;

int S = 0;
int SP1 =0;
int SP2 = 0;
int se = 0;
int nMisure=0;

long Tacc1 = 500; //tempo di accensione pulsante 1 in millesecondi
long Tspegn1 = 1000; //tempo di spegnimento pulsante 1 in millesecondi
long Tacc2 = 500; //tempo di accensione pulsante 2 in millesecondi
long Tspegn2 = 500; //tempo di spegnimento pulsante 2 in millesecondi

  // Arduino
#define sensorPin A2  //su attiny84 pin fisico 11
int ledRPin = 5;      //RED LED su attiny84 pin fisico 3
int ledGPin = 6;      //GREEN LED su attiny84 pin fisico 12
int ledBPin = 4;      //BLUE LED su attiny84 pin fisico 13


int u = 0;  // variable to store the value coming from the sensor
int um = 0;  // sum
int numero = 0; // number

float u0, u1, ux;

float k0 = 1.016;  // correction for resistive divider
float k=(float)4.88/5.; // corection voltage ("real 5V" / 5V)
// define voltage steps (step = 1023 * voltage_threshold /20)
/*
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 593;       // 95%
int step3 = 562;       // 90%
int step4 = 499;       // 80%
int step5 = 468;       // 75%
*/
int step1 = 624;       // Ubat=12,2V (100%) 
int step2 = 0.95*step1;       // 95%
int step3 = 0.9*step1;       // 90%
int step4 = 0.8*step1;      // 80%
int step5 = 0.75*step1;        // 75%

int isteresi = 2;         // per eliminare i cambiamenti veloci
int pausa = 500;           // freno tra le misurazioni
int pausa2 = 300;           // tempo in ms per il flash rosso (acceso/spento)
int letture = 50;          // numero di misurazioni

// Coomon Anode
byte spento = 1;
byte acceso = 0;

/*
// Comon Cathode
byte spento = 0;
byte acceso = 1;
*/


void setup() 
{
    pinMode(led1, OUTPUT);
    pinMode(PIN_PULS1, INPUT_PULLUP);
   
    
    pinMode(led2, OUTPUT);
    pinMode(PIN_PULS2, INPUT_PULLUP);
    
    
    pinMode(PIN_RITENUTA, OUTPUT);
    //digitalWrite(PIN_RITENUTA, 1);

  Serial.begin(9600);
  // declare the ledPins as an OUTPUT:
  pinMode(ledRPin, OUTPUT);  
  pinMode(ledGPin, OUTPUT);
  pinMode(ledBPin, OUTPUT);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);

  pinMode(sensorPin, INPUT);   
}

void loop() 
{
    
(40); // debounce barbaro minimo

    // letture ingressi con riconoscimento
    // click su rilascio

    byte prem1 = (digitalRead(PIN_PULS1) == 0);
    byte click1 = !prem1 && prem1Prec;
    prem1Prec = prem1;

    byte prem2 = (digitalRead(PIN_PULS2) == 0);
    byte click2 = !prem2 && prem2Prec;
    prem2Prec = prem2;


    // Gestione autoritenuta

    if(S==0 && prem1 && prem2)
    {
      if(millis() - t >= 2000)
      {
        digitalWrite(PIN_RITENUTA, 1);
        S = 1;
      }
    }
    else if (S==1 && !prem1 && !prem2)
      {
          SP1 = 1;
          SP2 = 1;
          se = 1;
          S = 2;
      }
      else if (S==2 && prem1 && prem2)
      {
        if(millis()-t>= 2000)
          {
            digitalWrite(PIN_RITENUTA, 0);
          }
        }
        else
        {
          t=millis();     
        }
        
  if(SP1 ==1 && prem1 && !prem2)
  {
    if(millis() - TP1 >= Tacc1)
    {
      digitalWrite(led1, HIGH);
      SP1 = 2;
    }
  }else if(SP1 == 2 && !prem1)
  {
    SP1 = 3;
  }else if(SP1 == 3 && prem1 && !prem2)
  {
    if(millis() - TP1 >= Tspegn1){
      digitalWrite(led1, LOW);
      SP1 = 4;
    }
  }else if(SP1 == 4){
    SP1=1;
  }else{
    TP1 = millis();
  }

  if(SP2 ==1 && prem2 && !prem1)
  {
    if(millis() - TP2 >= Tacc2)
    {
      digitalWrite(led2, HIGH);
      SP2 = 2;
    }
  }else if(SP2 == 2 && !prem2)
  {
    SP2 = 3;
  }else if(SP2 == 3 && prem2 && !prem1)
  {
    if(millis() - TP2 >= Tspegn2){
      digitalWrite(led2, LOW);
      SP2 = 4;
    }
  }else if(SP2 == 4){
    SP2=1;
  }else{
    TP2 = millis();
  } 

  if (se == 1)
  {
    u = (float)(k0 * k *analogRead(sensorPin));  // singola misura
    um = um + u;
    te = millis();
    nMisure++;
    if (nMisure == 50) // se fatte tutte le 50 misure
    {
        nMisure = 0;
        // calcolo media
        ux = (float)(um/letture);
        u0 = (float)(ux * 5. / 1024); // voltage on uC pin
        u1 = (float)(4. *  u0 );
        accendiRGB();
        te = millis();
        if (u < step5)  // se deve fare flash
        {
            se = 3;
        }
        else            // altrimenti
        {
            se = 5;
        }
    }
    else
    {
        se = 2;
    }
}
else if (se == 2 && ((millis()-te) >= 10))
{
    se=1;
}
else if(se==3 && ((millis()-te) >= pausa2))
{
    digitalWrite(ledRPin, spento);
    digitalWrite(ledGPin, spento);
    digitalWrite(ledBPin, spento);
    te=millis();
    se=4;
}
else if((se==4 && ((millis()-te)>=pausa2))||(se==5 && ((millis()-te)>=pausa)))
{
    ux=0;
    se=1;
}
/*
    if (S == 2)
    {
      misure();
    }*/
 
}  // end main loop

void accendiRGB()
{
  /*
  // all leds are off
    digitalWrite(ledRPin, spento);    // turn the red led off
    digitalWrite(ledGPin, spento);    // turn the green led off
    digitalWrite(ledBPin, spento);    // turn the blue led off
*/
  
  // read the value from the sensor:
 /*
  um = 0;
  for (int i = 0; i < letture; i++) 
  {
  u = (float)(k0 * k *analogRead(sensorPin));  
  delay(10);
  um = um + u;
  }
  ux = (float)(um/letture);
  u0 = (float)(ux * 5. / 1024); // voltage on uC pin
  u1 = (float)(4. *  u0 );
  //Serial.print("step = ");
  //Serial.print(u);
  //Serial.print("/1024 = ");
  //Serial.print(u1);
  //Serial.println("V");  

   */
// voltage below 75% -> flash RED
if (u < step5)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  //Serial.println("<75% = <9.2V ===> R");
  /*delay(pausa2);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  delay(pausa2);*/
}

// voltage over 75% & below 80% -> YeLLOW (RED + GREEN)
if (u >= step5 && u < step4-isteresi)
{ 
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("75..80% = 9.2..9.8V ===> R+G");
//  delay(pausa);
}


// voltage over 80% & below 90% -> GREEN
if (u >= step4 && u < step3-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, spento);
  //Serial.println("80..90% = 9.8..11.0V ===> G");
 // delay(pausa);
}


// voltage over 90% & below 95% -> CYAN (BLUE + GREEN)
if (u >= step3 && u < step2-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, acceso);
  digitalWrite(ledBPin, acceso);
  //Serial.println("90..95% = 11.0..11.6V ===> B+G");
 // delay(pausa);
}

// voltage over 95% & below 100% -> BLUE
if (u >= step2 && u <= step1-isteresi)
{ 
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println("95..100% = 11.6..12.2V ===> B");
 // delay(pausa);
}

// voltage over 12,2V (> 100%) -> MAUVE (RED + BLUE)
if (u > step1)
{
  digitalWrite(ledRPin, acceso);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, acceso);
  //Serial.println(">100% = 12.2V ===> R+B");
  /*
  delay(300);
  digitalWrite(ledRPin, spento);
  digitalWrite(ledGPin, spento);
  digitalWrite(ledBPin, spento);
  */
 // delay(pausa);
}
}

Ma chi ti ha scritto questa parte di codice?

Io, ma l'uso delle variabili 'click1' e 'click2' (assieme ai flag 'prem1Prec' e 'prem2Prec') è rimasto incompreso (infatti adesso non servono a nulla) e il delay iniziale è misteriosamente scomparso. Lo scopo iniziale era rilevare i fronti di rilascio dei pulsanti, e applicare il debounce più semplice possibile, cioè ritardare il loop a circa 40 cicli al secondo.

Per quanto riguarda il confronto delle digitalRead con zero (LOW) è per avere le variabili 'prem1' e 'prem2' in logica positiva, impostate a uno (true) quando i pulsanti sono premuti.

Sembra... ma non lo è, riguarda le condizioni disegnate al post #2

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