Problema sezioni di un menù(risolto)

Mi scuso se disturbo ancora, grazie al Vostro aiuto, ho quasi ultimato il progetto della mia centralina di gestione dell'Acquario, ho ancora un piccolo ma fastidioso problema da risolvere, ho implementato un menù per la gestione dei vari parametri, spesso premendo il tasto "set" che è quello che permette di spostarsi nelle varie sezioni, alcune di esse saltano, dovrebbe essere un problema di rimbalzo del pulsante, secondo voi posso risolvere via software questa problematica, non vorrei porre mano alla parte hardware con l'aggiunta di condensatori e resistenze. Grazie mille,

// Hour Lamp 1 On
void SetLamp1On(){
    LampOn1= EEPROM.read(0);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(LampOn1==23)
    
    
      {LampOn1=0;}
  
    else
    
      {LampOn1=LampOn1+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOn1==0)
    {
      LampOn1=23;
    }
    else
    {
      LampOn1=LampOn1-1;
    }
  
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Lamp1 On:");
  if (LampOn1<=9)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Lamp1 On:");
    }
  //lcd.setCursor(0,1);
  lcd.print(LampOn1,DEC);

  delay(200);
 }
  EEPROM.write(0, LampOn1);
  delay(200);
}
// Hour Lamp 1 Off
void SetLamp1Off(){
    LampOff1= EEPROM.read(1);
  while(digitalRead(P1)==HIGH){

  if(digitalRead(P2)==LOW)
  {
    if(LampOff1==23)
    {
      LampOff1=0;
    }
    else
    {
      LampOff1=LampOff1+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOff1==0)
    {
      LampOff1=23;
    }
    else
    {
      LampOff1=LampOff1-1;
    }
  }
  lcd.setCursor(12,0);
  lcd.print("Off:");
if (LampOff1<=9)
  {
    lcd.clear();
    lcd.setCursor(12,0);
    lcd.print("Off:");
    }
  lcd.print(LampOff1,DEC);
  delay(200);
 }
  EEPROM.write(1, LampOff1);
  delay(200);
}
// Hour Lamp 2 On
void SetLamp2On(){
    LampOn2= EEPROM.read(2);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(LampOn2==23)
    {
      LampOn2=0;
    }
    else
    {
      LampOn2=LampOn2+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOn2==0)
    {
      LampOn2=23;
    }
    else
    {
      LampOn2=LampOn2-1;
    }
  }
  lcd.setCursor(0,1);
  lcd.print("Lamp2 On:");
if (LampOn2<=9)
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Lamp2 On:");
    }
  lcd.print(LampOn2,DEC);
  delay(200);
 }
  EEPROM.write(2, LampOn2);
  delay(200);
}
// Hour Lamp 2 Off
void SetLamp2Off(){
    LampOff2= EEPROM.read(3);
  while(digitalRead(P1)==HIGH){

  if(digitalRead(P2)==LOW)
  {
    if(LampOff2==23)
    {
      LampOff2=0;
    }
    else
    {
      LampOff2=LampOff2+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOff2==0)
    {
      LampOff2=23;
    }
    else
    {
      LampOff2=LampOff2-1;
    }
  }
  lcd.setCursor(12,1);
  lcd.print("Off:");
if (LampOff2<=9)
  {
    lcd.clear();
    lcd.setCursor(12,1);
    lcd.print("Off:");
    }
  lcd.print(LampOff2,DEC);
  delay(200);
 }
  EEPROM.write(3, LampOff2);
  delay(200);
}
// Hour Lamp 3 On
void SetLamp3On(){
    LampOn3= EEPROM.read(4);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(LampOn3==23)
    {
      LampOn3=0;
    }
    else
    {
      LampOn3=LampOn3+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOn3==0)
    {
      LampOn3=23;
    }
    else
    {
      LampOn3=LampOn3-1;
    }
  }
  lcd.setCursor(0,2);
  lcd.print("Lamp3 On:");
if (LampOn3<=9)
  {
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print("Lamp3 On:");
    }
  lcd.print(LampOn3,DEC);
  delay(200);
 }
  EEPROM.write(4, LampOn3);
  delay(200);
}
// Hour Lamp 3 On
void SetLamp3Off(){
    LampOff1= EEPROM.read(5);
  while(digitalRead(P1)==HIGH){

  if(digitalRead(P2)==LOW)
  {
    if(LampOff3==23)
    {
      LampOff3=0;
    }
    else
    {
      LampOff3=LampOff3+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(LampOff3==0)
    {
      LampOff3=23;
    }
    else
    {
      LampOff3=LampOff3-1;
    }
  }
  lcd.setCursor(12,2);
  lcd.print("Off:");
if (LampOff3<=9)
  {
    lcd.clear();
    lcd.setCursor(12,2);
    lcd.print("Off:");
    }
  lcd.print(LampOff3,DEC);
  delay(200);
 }
  EEPROM.write(5, LampOff3);
  delay(200);
}
// Riscaldatore ON
void SetRison(){
    Rison= EEPROM.read(6);
  while(digitalRead(P1)==HIGH){

  if(digitalRead(P2)==LOW)
  {
    if(Rison==32)
    {
      Rison=18;
    }
    else
    {
      Rison=Rison+1;
    }
  }
   if(digitalRead(P3)==LOW)
  {
    if(Rison==18)
    {
      Rison=32;
    }
    else
    {
      Rison=Rison-1;
    }
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Risc. ON:");
  if (Rison<=9)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Risc. ON:");
    }

  lcd.print(Rison,DEC);
  delay(200);
 }
  EEPROM.write(6, Rison);
  delay(200);
}
// Lcd ON
void SetLcdon(){
  Lcdon= EEPROM.read(7);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(Lcdon==23)
    
    
      {Lcdon=0;}
  
    else
    
      {Lcdon=Lcdon+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(Lcdon==0)
    {
      Lcdon=23;
    }
    else
    {
      Lcdon=Lcdon-1;
    }
  } 
 
  lcd.setCursor(0,1);
  lcd.print("Lcd . ON:");
if (Lcdon<=9)
  {
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("Lcd . ON:");
    }
  lcd.print(Lcdon,DEC);
  delay(200);
 }
  EEPROM.write(7, Lcdon);
  delay(200);
}
// Lcd OFF
void SetLcdoff(){
    Lcdoff= EEPROM.read(8);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(Lcdoff==23)
    
    
      {Lcdoff=0;}
  
    else
    
      {Lcdoff=Lcdoff+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(Lcdoff==0)
    {
      Lcdoff=23;
    }
    else
    {
      Lcdoff=Lcdoff-1;
    }
  }
  lcd.setCursor(12,1);
  lcd.print("OFF:");
if (Lcdoff<=9)
  {
    lcd.clear();
    lcd.setCursor(12,1);
    lcd.print("OFF:");
    }
  lcd.print(Lcdoff,DEC);
  delay(200);
 }
  EEPROM.write(8, Lcdoff);
  delay(200);

 
  }
// Co2 ON
void SetCo2on(){
  Co2on= EEPROM.read(9);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(Co2on==23)
    
    
      {Co2on=0;}
  
    else
    
      {Co2on=Co2on+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(Co2on==0)
    {
      Co2on=23;
    }
    else
    {
      Co2on=Co2on-1;
    }
  } 
  ;
  lcd.setCursor(0,2);
  lcd.print("Co2 . ON:");
if (Co2on<=9)
  {
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print("Co2 . ON:");
    }
  lcd.print(Co2on,DEC);
  delay(200);
 }
  EEPROM.write(9, Lcdon);
  delay(200);
}
// Co2 OFF
void SetCo2off(){
    Co2off= EEPROM.read(10);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(Co2off==23)
    
    
      {Co2off=0;}
  
    else
    
      {Co2off=Co2off+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(Co2off==0)
    {
      Co2off=23;
    }
    else
    {
      Co2off=Co2off-1;
    }
  }
  lcd.setCursor(12,2);
  lcd.print("OFF:");
if (Co2off<=9)
  {
    lcd.clear();
    lcd.setCursor(12,2);
    lcd.print("OFF:");
    }
  lcd.print(Co2off,DEC);
  delay(200);
  EEPROM.write(10, Co2off);
  delay(200);

}
  
}
// Ventola raffreddamento
void SetVon(){
    Von = EEPROM.read(11);
  while(digitalRead(P1)==HIGH){

   if(digitalRead(P2)==LOW)
  {
    if(Von==35)
    
    
      {Von=25;}
  
    else
    
      {Von=Von+1;}
    
  }
   if(digitalRead(P3)==LOW)
  {
    if(Von==25)
    {
      Von=35;
    }
    else
    {
      Von=Von-1;
    }
  }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ventola On:");
  if (LampOn1<=9)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Ventola On:");
    }
  //lcd.setCursor(0,1);
  lcd.print(Von,DEC);

  delay(200);
 }
  EEPROM.write(11, Von);
  delay(200);
}

Cerca "Arduino debouncing" ... troverai di tutto e di più :smiley:

Guglielmo

Grazie.

Ho girato e rigirato, mi sembrava un buon sistema software questo che ora posto, invece non mi funziona, potete come al solito aiutarmi?
Grazie in anticipo.

if (digitalRead(P1) == LOW){
 delay(200);
 if (digitalRead(P1) == LOW){
 
  
    menu = menu + 1;
  }
  }

ide di arduino -> file -> esempi ->2. digital -> debounce :slight_smile:

Scusate ma cosa sbaglio che non va?

/*
  :Project:Acquario ver. 4 Beta 3
  :Autore: Stefano Bertoni
  :Grazie a: Tiziano Bianchettin e Forum Arduino
  :Date: 07/11/2018
  :License: Public Domain
*/
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 RTC;
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define DHTPIN 3
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define TEMPTYPE 0
unsigned long ultimalettura = 0;
int Riscaldatore = 4;//al relè 01
int Ventola = 5;//al relè 02
const int P1 = 6; //set
const int ledPin = 13;
int P2 = 7; //+
int P3 = 8; //-
int Lamp1 = 9;//al relè 03
int Lamp2 = 10;//al relè 04
int Lamp3 = 11;//al relè 05
int Releco2 = 12;//al relè 06
int ledris = 14;
int led = 15;
int allarme = 16;
int brightness = 0;
int fadeAmount = 5;
int hourupg;
int minupg;
int yearupg;
int monthupg;
int dayupg;
int menu = 0;
int setAll = 0;
int LampOn1;
int LampOn1m;
int LampOff1;
int LampOff1m;
int LampOn2;
int LampOn2m;
int LampOff2;
int LampOff2m;
int LampOn3;
int LampOn3m;
int LampOff3;
int LampOff3m;
int Rison;
int Lcdon;
int Lcdonm;
int Lcdoff;
int Lcdoffm;
int Co2on;
int Co2onm;
int Co2off;
int Co2offm;
float ttt;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int reading = digitalRead(P1);

void setup()
{
  if
  (EEPROM.read(50) != 67) {
    EEPROM.write(50, 67);
    EEPROM.write(0, 12);
    EEPROM.write(32, 10);
    EEPROM.write(2, 12);
    EEPROM.write(34, 10);
    EEPROM.write(4, 12);
    EEPROM.write(36, 10);
    EEPROM.write(6, 12);
    EEPROM.write(38, 10);
    EEPROM.write(8, 12);
    EEPROM.write(40, 10);
    EEPROM.write(10, 12);
    EEPROM.write(42, 10);
    EEPROM.write(12, 25);
    EEPROM.write(14, 7);
    EEPROM.write(16, 23);
    EEPROM.write(18, 10);
    EEPROM.write(20, 20);
    EEPROM.write(30, 10);
  }
  LampOn1 = EEPROM.read(0);
  LampOn1m = EEPROM.read(32);
  LampOff1 = EEPROM.read(2);
  LampOff1m = EEPROM.read(34);
  LampOn2 = EEPROM.read(4);
  LampOn2m = EEPROM.read(36);
  LampOff2 = EEPROM.read(6);
  LampOff2m = EEPROM.read(38);
  LampOn3 = EEPROM.read(8);
  LampOn3m = EEPROM.read(40);
  LampOff3 = EEPROM.read(10);
  LampOff3m = EEPROM.read(42);
  Rison = EEPROM.read(12);
  Lcdon = EEPROM.read(14);
  Lcdoff = EEPROM.read(16);
  Co2on = EEPROM.read(18);
  Co2off = EEPROM.read(20);
  ttt = EEPROM.read(30);
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  pinMode(P1, INPUT_PULLUP);
  pinMode(P2, INPUT_PULLUP);
  pinMode(P3, INPUT_PULLUP);
  pinMode(Lamp1, OUTPUT);
  pinMode(Lamp2, OUTPUT);
  pinMode(Lamp3, OUTPUT);
  pinMode(Riscaldatore, OUTPUT);
  pinMode(Ventola, OUTPUT);
  pinMode(Releco2, OUTPUT);
  pinMode(ledris, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(allarme, OUTPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  sensors.begin();
  dht.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  int menu = 0;
}
void loop()
{
  {
    analogWrite(led, brightness);
    brightness = brightness + fadeAmount;
    if (brightness <= 0 || brightness >= 255) {
      fadeAmount = -fadeAmount;
    }
  }
  {
    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }
    if ((millis() - lastDebounceTime) > debounceDelay) {
      if (reading != buttonState) {
        buttonState = reading;
        if (buttonState == HIGH) {
          ledState = !ledState;
          menu = menu + 1;
        }
      }
    }
    digitalWrite(ledPin, ledState);
    lastButtonState = reading;
  }
  if ((digitalRead(P2) == LOW) && (digitalRead(P3) == LOW))
  {
    lcd.clear();
    SetLamp1On();
    SetLamp1Onm();
    SetLamp1Off();
    SetLamp1Offm();
    SetLamp2On();
    SetLamp2Onm();
    SetLamp2Off();
    SetLamp2Offm();
    SetLamp3On();
    SetLamp3Onm();
    SetLamp3Off();
    SetLamp3Offm();
    SetRison();
    SetLcdon();
    SetLcdoff();
    SetCo2on();
    SetCo2off();
    delay(1000);
    lcd.clear();
  }
  if (menu == 0)
  {
    DisplayDateTime();
    Lamp();
    Temp18B20();
    TempDHT();
    Lamp();
    Lamp22();
    Lamp33();
    Co2();
    Lcd();
    Termo();
    Von1();
    All();
  }
  if (menu == 1)
  {
    DisplaySetHour();
  }
  if (menu == 2)
  {
    DisplaySetMinute();
  }
  if (menu == 3)
  {
    DisplaySetYear();
  }
  if (menu == 4)
  {
    DisplaySetMonth();
  }
  if (menu == 5)
  {
    DisplaySetDay();
  }
  if (menu == 6)
  {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  delay(100);
}

:smiley: ti piacciono le parentesi graffe vedo ! :slight_smile:

void loop()
{
  {                                             // <--- inutile
    analogWrite(led, brightness);
    brightness = brightness + fadeAmount;
    if (brightness <= 0 || brightness >= 255) {
      fadeAmount = -fadeAmount;
    }
  }                                            // <-- inutile
  {                                            // <-- inutile
    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }

analizza questo pezzo e dimmi: dov'è che hai letto il pulsante e l'hai messo in reading?

così cosa ne pensi?

{
    int reading = digitalRead(P1);

    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }
    if ((millis() - lastDebounceTime) > debounceDelay) {
      if (reading != buttonState) {
        buttonState = reading;
        if (buttonState == HIGH) {
          ledState = !ledState;
          menu = menu + 1;
        }
      }
    }
    digitalWrite(ledPin, ledState);
    lastButtonState = reading;

si, così dovrebbe andare

  int reading = digitalRead(P1);

    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }
    if ((millis() - lastDebounceTime) > debounceDelay) {
      if (reading != buttonState) {
        buttonState = reading;
        if (buttonState == HIGH) {
          ledState = !ledState;
          menu = menu + 1;
        }
      }
    }
    digitalWrite(ledPin, ledState);
    lastButtonState = reading;

senza la prima graffa...

Grazie in effetti così va meglio, però ancora mi salta dei menù, non so più veramente cosa fare.......

ciao :slight_smile:

potresti fare una prova mettendo anche un piccolo filtro hardware :slight_smile:
anche roba semplice con una resistenza e un condensatore, tipo questo.

MD

Grazie ci provo.

MatteoDerrico:
ciao :slight_smile:

potresti fare una prova mettendo anche un piccolo filtro hardware :slight_smile:
anche roba semplice con una resistenza e un condensatore, tipo questo.

MD

Scusa se ti disturbo, siccome ieri ho smanettato e sono andato molto vicino a buttare via tutto, la resistenza R1 che valore mi consigli di assegnargli?
Continuo ad avere il salto nelle sezioni dei menù anche con questo filtro semplice che mi hai consigliato, ma che girando su Google è usatissimo.
Mi viene il dubbio di sbagliare qualcosa nella logica del menù, ma non ne esco.................
Ho usato tutte le mie competenze(che non sono moltissime) e seguito tutti i Vostri consigli, ma nulla.....

Mi rispondo da solo, ho risolto con un condensatore da 10mf ed una resistenza da 22KOHM.
Ora sembra tutto corretto, finalmente.
Grazie ancora.

bene son contento :slight_smile:
scusa se non ti ho risposto ma non ero online...

buona continuazione

MD

MatteoDerrico:
bene son contento :slight_smile:
scusa se non ti ho risposto ma non ero online...

buona continuazione

MD

Ma non scusarti, anzi grazie di tutto!