Buona giornata ragazzi
sono ancora qui per chiedervi gentilmente un aiuto,
sto provando gli interrupt e mi sembrano OK, poi però voglio che alcune parti del progetto non siano interessate dagli interrupt,
questo e il programma che sto testando
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define led_v 4
#define led_g 6
#define buton 3
#define buton_1 5
#define buton_2 7
#define sens 2 //interrupt
unsigned long ledTemp;
bool led_1;
int cunter = 0;
byte Stato = 0;
byte StatoLedVerde = 0;
byte UnLamp = 0;
int A = 0;
int B;
int C;
void Led_Verde();
void Led_Gialo();
void mate();
void SENS(); //Funzione per interrupt
LiquidCrystal_I2C lcd(0x3F, 20, 4); //0x27
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight(); //per attivare la retro inluminazione
lcd.home();
pinMode(led_v, OUTPUT);
digitalWrite(led_v, 0);
lcd.setCursor(0, 1);
lcd.print("Led Spento");
pinMode(led_g, OUTPUT);
digitalWrite(led_g, 0);
pinMode(buton, INPUT_PULLUP);
pinMode(sens, INPUT_PULLUP);
pinMode(buton_1, INPUT_PULLUP);
pinMode(buton_2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), SENS, FALLING); //interrupt verso massa
led_1 = false;
delay(100);
}
void loop() {
if (digitalRead(buton) == 0) {
cunter++;
while (digitalRead(buton) == 0)
;
}
if (cunter > 4) {
cunter = 0;
}
// lcd.setCursor(10, 0);
// lcd.print("Case0");
switch (cunter) {
case 0:
lcd.setCursor(10, 0);
lcd.print("Case0");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
break;
case 1:
Led_Verde();
lcd.setCursor(10, 0);
lcd.print("Case1");
break;
case 2:
Led_Gialo();
// lcd.setCursor(10, 0);
// lcd.print("Case2");
break;
case 3:
if (led_1) {
digitalWrite(led_g, 0);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Led Aceso");
if (millis() - ledTemp > 3000) {
digitalWrite(led_v, 0);
led_1 = false;
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Led Spento ");
}
}
lcd.setCursor(10, 0);
lcd.print("Case3");
break;
case 4:
mate();
break;
}
delay(100);
} //loop
void Led_Verde() {
lcd.setCursor(10, 0);
lcd.print("Case1");
if (digitalRead(buton_1) == 0 && Stato == 0) {
digitalWrite(led_g, 0);
digitalWrite(led_v, 1);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Led Aceso");
while (digitalRead(buton_1) == 0)
;
Stato = 1;
}
if (digitalRead(buton_1) == 0 && Stato == 1) {
digitalWrite(led_v, 0);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Led Spento ");
while (digitalRead(buton_1) == 0)
;
Stato = 0;
}
}
void Led_Gialo() {
lcd.setCursor(10, 0);
lcd.print("Case2");
if (UnLamp == 0) {
digitalWrite(led_v, 1);
StatoLedVerde++;
delay(100);
digitalWrite(led_v, 0);
if (StatoLedVerde == 5) {
digitalWrite(led_v, 0);
digitalWrite(led_g, 1);
cunter = 3;
}
}
if (StatoLedVerde > 5) {
StatoLedVerde = 0;
}
}
void mate() {
lcd.setCursor(10, 0);
lcd.print("Case4");
// digitalWrite(led_v, 0);
if (digitalRead(buton_2) == 0) {
A++;
while (digitalRead(buton_2) == 0)
;
}
if (A > 20) {
A = 0;
}
B = A >> 1; //B assegnto ad A / 2
C = A << 1; //C assegnato ad A x 2
lcd.setCursor(0, 2);
lcd.print("A ");
lcd.print(A);
if (A < 10) {
lcd.setCursor(3, 2);
lcd.print(" ");
}
lcd.setCursor(0, 3);
lcd.print("B ");
lcd.print(B);
if (B < 10) {
lcd.setCursor(3, 3);
lcd.print(" ");
}
lcd.setCursor(5, 3);
lcd.print("C ");
lcd.print(C);
if (C < 10) {
lcd.setCursor(8, 3);
lcd.print(" ");
}
}
void SENS() {
digitalWrite(led_v, 1);
ledTemp = millis();
led_1 = true;
}
ora io vorrei che la funzione mate() non sia soggetta ad interrupt,
ho provato ad inserire all'inizio della funzione
detachInterrupt(digitalPinToInterrupt(2));
ed attivare gli intrrupt alla fine della funzione
attachInterrupt(digitalPinToInterrupt(2), SENS, FALLING);
(nel programma postato non ci sono gli o tolti perché non vanno)
ma non mi funziona,
cortesemente qualcuno mi può dire dove sbaglio?