Buongiorno! intoppo softwer attach interrupt

buongiorno a tutti!
ho un programma che ha 2 attachinterrupt su arduino mega,(premetto che utilizzo i pin19 e 18 che sul mega sono predisposti alla funzione).

ora nel codice li utilizzo per un menù a scorrimento.
nella seconda finestra del menù è necessario che l’utente possa dare conferma, da qui la nascita del secondo interrupt.

la mia soluzione e’ stata mooolto elementare, ovvero dentro alle istruzioni del richiamo tramite interrupt ho una variabile (ck2 o ck3 in base all’interrupt) che si incrementa creando le condizioni per le “pagine” del menù.

ora il problema è che se il primo interrupt che funziona regolarmente(quello connesso al redB che richiama la funzione menu) incrementa la variabile da 1 a 2, lo stesso fà la variabile annessa al secondo interrupt e non mi spiego il perchè.

il programma per le mie esperienze è un pò lungo, cercherò comunque di essere il più chiaro possibile:

ora questo è cio che accade appena acceso l’arduino:

mentre una volta richiamata la funzione menù annessa a redB incrementa di uno anche la variabile annessa al greenB.
ora la situazione è:

la cosa curiosa e’ che lo fa solo nel passagio da 1 a 2, non per le altre “pagine”.

Ps.ovviamente nei due screen si vedono la funzione menu() dell’interrupt che scorre regolarmente
e la funzione aggiuntiva: conferma() che è quella non funzionante.

linko lo sketch completo se dovesse servire, ditemi come posso semplificare lo sketch da esporre sul forum! e grazie come sempre della pazienza.

//pin:(cella di carico)5v + gnd+22bianco+24arancione//(pulsante rosso )18//(pulsante verde)19//(potentiometer)A0 5v+gnd//(lcd)5v+gnd+21 scl blu+20 sda verde

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); //comunicazione pin e I2c

#define greenB 19
#define redB 18
#define pot A0

#include "HX711.h"                        //libreria cella di carico
HX711 scale(22, 24);

unsigned long timer, intervallo = 0, intervallo2 = 0,intervallo3=0;
float calibration_factor = -463, units;       //variabili usate per il menù
int load, ck3 = 1, ck2 = 1;
//byte rState, gState;

void setup() {
  lcd.begin(20, 4);                                 //settaggio righe colonne e retroilluminazione
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);

  Serial.begin(9600);
  scale.set_scale();
  scale.tare();                  //riporto a 0 la bilancia
  pinMode(greenB, INPUT_PULLUP);
  pinMode(redB, INPUT_PULLUP);
  pinMode(pot, INPUT);
  attachInterrupt(digitalPinToInterrupt(redB), menu, FALLING);
  attachInterrupt(digitalPinToInterrupt(greenB), conferma, FALLING);
}


void loop() {
  timer = millis();                               //inizializza tempo intervalli
  scale.set_scale(calibration_factor);            //
  load = analogRead(pot);                       //
  units = scale.get_units();
Serial.println("ck2:"+String(ck2));
Serial.println("\nck3:"+String(ck3));
  if (units < 0)
    units = 0.00;
  if (ck3 == 1)                                             //1° menù lettura peso
    grammi();
  if (ck3 == 2)                                           //2° menù calibrazione
    calibrazione();                                         //
  //if (ck3 == 3)                                                                                                    //3°menù impostazione riempimento
    //riempimento();
}
void conferma() {
  if (timer - intervallo2 >= 600)
  {
    ck2++;
    if (ck2 == 3)
    {
      ck2 = 1;
    }
    intervallo2 = timer;
  }
}
void menu()
{
  if (timer - intervallo2 >= 600)
  {
    ck3++;
    if (ck3 == 4)
    {
      ck3 = 1;
    }
    intervallo2 = timer;
  }
}

/*void riempimento()
{ 
  lcd.setCursor(0,4);
  lcd.print("inserire quantita':");

  if (gState == 0) {
    if (timer - intervallo >= 600)
    {
      intervallo = timer;
      ck2 = !ck2;
    }

  }
  if (ck2 == 1) {
    if (units <= load * 8 / 10 )
    {
      Serial.println("servo gira velocemente");
      Serial.print(units);
      Serial.println("g");

    }
    if (units > load * 8 / 10 && units < load )
    {
      Serial.println("servo rallenta");
      Serial.print(units);
      Serial.println("g");
    }
    if (units >= load) {
      Serial.println("servo si spegne");
      Serial.print(units);
      Serial.println("g");
    }
  }

}
*/
void grammi() {
  lcd.setCursor(0, 0);
  lcd.print("orario");
  lcd.setCursor(15, 0);
  lcd.print("data");
  lcd.setCursor(0, 2);
  lcd.print("Peso:" + String(units, 0) + "g.");
  pulisciSchermo();
}
void pulisciSchermo()
{
  if (timer - intervallo >= 100)
  {
    intervallo = timer;
    lcd.print("                    ");

  }
}
void calibrazione()//funzione gestionale fattore di calibrazione
{
  if(ck2==1){
    
  lcd.setCursor(0, 0);
  lcd.print("orario");
  lcd.setCursor(15, 0);
  lcd.print("data");
  lcd.setCursor(0, 2);
  lcd.print("peso:" + String(units, 0) + "g.");
  pulisciSchermo();
  conferma();
   
  if (load <= 511) {

    
    load = load - 511;
    lcd.setCursor(0, 1);
    lcd.print("Calibrazione: " );
    lcd.setCursor(13, 1);
    lcd.print(load / 4);
    Serial.println(load/4); 
    conferma();
     if (ck2 == 2) {
        intervallo = timer;
        calibration_factor = calibration_factor + load / 4;
  }
    }
    
  
  
  if (load > 511)
  {
    load = load - 511;
    lcd.setCursor(0, 1);
    lcd.print("Calibrazione: ");
    lcd.setCursor(14, 1);
    lcd.print(load / 4);
   conferma();
   if (ck2 == 2){
        intervallo = timer;
        calibration_factor = calibration_factor + load / 4;
   }
  }
lcd.setCursor(0, 3);  
lcd.print(calibration_factor, 0);
}
}

Non usare più i vecchi tag code, una volta inserito il codice, lo selezioni tutto e usi il bottone </> come ho appena fatto io :wink:

Grazie,

Guglielmo

ah ecco! iniziamo subito bene :joy:

ok sono riuscito a trovare il malippo! un errore grave mio di distrazione!