Disturbi su Pin IN con resistenze Pull Down

infatti avevo cancellato il post #13 perchè non ero sicuro , ma era identico al post #14

Guarda, ho preso il tuo codice, l'ho copiato nell'IDE, ho fatto la formattazione automatica e l'ho rimesso al suo posto nel post #14 ... vedi un po' tu ... :roll_eyes:

Guglielmo

P.S.: ...e presta attenzione al messaggio di C1P8 (post #19) ... :wink:

Una criticità di cui parlava C1P8 penso di averla eliminata ,
 inutile settare LOW un PIN IN ,  e anche di aver capito come
 indentare lo sketch grazie alle indicazioni di gpb01
 ( quando studiavo informatica nel lontano 1985 usavo scrivere
 i programmi non indentati solo perchè per me sono piu leggibili ,
 capisco che i tempi sono cambiati) .
 spero comunque di avvicinarmi il più possibile ai format del Forum
 grazie alle vostre preziose indicazioni.



// ZONA GIORNO ARDUINO MEGA COM 5
#include <LiquidCrystal_I2C.h>
#define LED_PIN 3

int SRTraviVeranda = 0;
int SRTraveEsternaVeranda = 0;
int SRPresaPilotataVeranda = 0;
int SRLuciAlte = 0;
int SRTavoloCucina = 0;
int SRMensolaSXCucina = 0;
int SRMensolaDXCucina = 0;
int SRTraviCucina = 0;
int SRIngressoTravi = 0;
int SRScala = 0;
int SRIngressoLampadario = 0;
int SRTraveSoppalco = 0;
int SRTraveDoppia = 0;
int SRTraveMedia = 0;
int SRPresaPilotataSala = 0;
// Veranda
#define pTraviVeranda 39
#define TraviVeranda 22
#define pTraveEsternaVeranda 40
#define TraveEsternaVeranda 23
#define pPresaPilotataVeranda 41
#define PresaPilotataVeranda 24
//Cucina
#define pLuciAlte 42
#define LuciAlte 25
#define pTavoloCucina 43
#define TavoloCucina 26
#define pMensolaSXCucina 44
#define MensolaSXCucina 27
#define pMensolaDXCucina 45
#define MensolaDXCucina 28
#define pTraviCucina 46
#define TraviCucina 29
//Ingresso
#define pIngressoTravi 47
#define IngressoTravi 30
#define pScala 48
#define Scala 31
#define pIngressoLampadario 49
#define IngressoLampadario 32
//Sala
#define pTraveSoppalco 50
#define TraveSoppalco 33
#define pTraveDoppia 51
#define TraveDoppia 34
#define pTraveMedia 52
#define TraveMedia 35
#define pPresaPilotataSala 53
#define PresaPilotataSala 36
// Allarme e spegni tutto
#define pSpegniTutto 37
#define pAllarme 38


#define z = 1  // Variabile di intervallo fliccheraggio pulsanti
#define a = 1  //Variabile di intervallo per luci allarme
#define b = 1  //Variante di intervallo per spegni tutto
int uscitarele = 1000;
int pulsantepremuto = 0;
int uscita = 0;
int statoprecedente = 99;
String SERIALE = "";

LiquidCrystal_I2C lcd(0x27, 20, 4);
String riga1 = "Benvenuti da Alberto";
String riga2 = "Lucia               ";
String riga3 = "Samuele             ";
String riga4 = "Tommaso             ";
String azione = "                    ";


void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(LED_PIN, OUTPUT);
  analogWrite(LED_PIN, 20);
  lcd.setCursor(0, 0);
  typewriting(riga1);
  lcd.setCursor(0, 1);
  typewriting(riga2);
  lcd.setCursor(0, 2);
  typewriting(riga3);
  lcd.setCursor(0, 3);
  typewriting(riga4);
  delay(100);
  analogWrite(LED_PIN, 5);


  //Veranda
  pinMode(pTraviVeranda, INPUT);  // Travi Centrali 5V Ingresso 39
  pinMode(TraviVeranda, OUTPUT);  // Travi Centrali 24V
  digitalWrite(TraviVeranda, LOW);
  pinMode(pTraveEsternaVeranda, INPUT);  // Trave esterna 5V
  pinMode(TraveEsternaVeranda, OUTPUT);  // Trave esterna 24V
  digitalWrite(TraveEsternaVeranda, LOW);
  pinMode(pPresaPilotataVeranda, INPUT);  // Presa pilotata angolo 5V
  pinMode(PresaPilotataVeranda, OUTPUT);  // Presa pilotata angolo 24V
  digitalWrite(PresaPilotataVeranda, LOW);
  //Cucina
  pinMode(pLuciAlte, INPUT);  // Luci alte 5V
  pinMode(LuciAlte, OUTPUT);  // Luci alte 220V
  digitalWrite(LuciAlte, LOW);
  pinMode(pTavoloCucina, INPUT);  // Tavolo 5V
  pinMode(TavoloCucina, OUTPUT);  // Tavolo 220V
  digitalWrite(TavoloCucina, LOW);
  pinMode(pMensolaSXCucina, INPUT);  // Mensola SX 5V
  pinMode(MensolaSXCucina, OUTPUT);  // Mensola SX 24V
  digitalWrite(MensolaSXCucina, LOW);
  pinMode(pMensolaDXCucina, INPUT);  // Mensola DX 5V
  pinMode(MensolaDXCucina, OUTPUT);  // Mensola DX 24V
  digitalWrite(MensolaDXCucina, LOW);
  pinMode(pTraviCucina, INPUT);  // Travi 5V
  pinMode(TraviCucina, OUTPUT);  // Travi 24V
  digitalWrite(TraviCucina, LOW);
  // SALA


  pinMode(pTraveSoppalco, INPUT);  // Trave Soppalco 5V
  pinMode(TraveSoppalco, OUTPUT);  // Trave Soppalco 24V
  digitalWrite(TraveSoppalco, LOW);
  pinMode(pTraveDoppia, INPUT);  // Trave Alta + Bassa 5V
  pinMode(TraveDoppia, OUTPUT);  // Trave Alta + Bassa 24V
  digitalWrite(TraveDoppia, LOW);
  pinMode(pTraveMedia, INPUT);  // Trave Media 5V
  pinMode(TraveMedia, OUTPUT);  // Trave Media 24V
  digitalWrite(TraveMedia, LOW);
  pinMode(pPresaPilotataSala, INPUT);  // Presa Pilotata 5V
  pinMode(PresaPilotataSala, OUTPUT);  // Presa Pilotata 24V
  digitalWrite(PresaPilotataSala, LOW);



  //Ingresso
  pinMode(pIngressoTravi, INPUT);  // Travi 5V
  pinMode(IngressoTravi, OUTPUT);  // Travi 24V
  digitalWrite(IngressoTravi, LOW);
  pinMode(pScala, INPUT);  // Scala 5V
  pinMode(Scala, OUTPUT);  // Scala 24V
  digitalWrite(Scala, LOW);
  pinMode(pIngressoLampadario, INPUT);  // Lampadario 5V
  pinMode(IngressoLampadario, OUTPUT);  // Lampadario 24V
  digitalWrite(IngressoLampadario, LOW);
  //Allarme sPEGNI TUTTO

  pinMode(pAllarme, INPUT);      // Allarme
  pinMode(pSpegniTutto, INPUT);  // Spegni tutto
  digitalWrite(pSpegniTutto, LOW);

  Serial.begin(9600);
  Serial.println();
  Serial.print("               Ok ripartiamo");
  Serial.println();
  Serial.println();
  Serial.print("Travi veranda stato iniziale          > ");
  Serial.print(SRTraviVeranda);
  Serial.println();
  Serial.print("Travi veranda esterna stato iniziale  > ");
  Serial.print(SRTraveEsternaVeranda);
  Serial.println();
  Serial.print("Presa Pilotata  stato iniziale        > ");
  Serial.print(SRPresaPilotataVeranda);
  Serial.println();
  Serial.print("Cucina travi alte stato iniziale      > ");
  Serial.print(SRLuciAlte);
  Serial.println();
  Serial.print("Cucina Tavolo  stato iniziale         > ");
  Serial.print(SRTavoloCucina);
  Serial.println();
  Serial.print("Cucina Mensola SX stato iniziale      > ");
  Serial.print(SRMensolaSXCucina);
  Serial.println();
  Serial.print("Cucina mensola DX stato iniziale      > ");
  Serial.print(SRMensolaDXCucina);
  Serial.println();
  Serial.print("Cucina travi stato iniziale           > ");
  Serial.print(SRTraviCucina);
  Serial.println();
  Serial.print("Ingresso Travi stato iniziale         > ");
  Serial.print(SRIngressoTravi);
  Serial.println();
  Serial.print("Scala stato iniziale                  > ");
  Serial.print(SRScala);
  Serial.println();
  Serial.print("Ingresso lampadario stato iniziale    > ");
  Serial.print(SRIngressoLampadario);
  Serial.println();
  Serial.print("Sala trave soppalco stato iniziale    > ");
  Serial.print(SRTraveSoppalco);
  Serial.println();
  Serial.print("Sala Trave doppia stato iniziale      > ");
  Serial.print(SRTraveDoppia);
  Serial.println();
  Serial.print("Sala trave media stato iniziale       > ");
  Serial.print(SRTraveMedia);
  Serial.println();
  Serial.print("sala Presa pilotata stato iniziale    > ");
  Serial.print(SRPresaPilotataSala);
  Serial.println();
  Serial.print("#-------------------------------------------------#");
  Serial.println();
  Serial.println();


  // Veranda
}

void loop() {

  // Allarme 38 zona Notte
  //int ComunicazioneAllarme=37;
  //Spegni Tutto 37 Notte

  // Veranda trave centrale:
  if (digitalRead(pTraviVeranda) == HIGH && SRTraviVeranda == 0) {
    digitalWrite(TraviVeranda, HIGH);
    // "Benvenuti da Alberto";
    azione = "Veranda Travi CX OFF";
    statoprecedente = SRTraviVeranda;
    pulsantepremuto = pTraviVeranda;
    uscitarele = TraviVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviVeranda = 1;
    DOPO();
  };

  if (digitalRead(pTraviVeranda) == HIGH && SRTraviVeranda == 1) {
    digitalWrite(TraviVeranda, LOW);
    // "--------------------";
    azione = "Veranda Travi CX  ON";
    statoprecedente = SRTraviVeranda;
    pulsantepremuto = pTraviVeranda;
    uscitarele = TraviVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviVeranda = 0;
    DOPO();
  };

  // Veranda Trave Esterna:

  if (digitalRead(pTraveEsternaVeranda) == HIGH && SRTraveEsternaVeranda == 0) {
    digitalWrite(TraveEsternaVeranda, HIGH);
    // "Benvenuti da Alberto";
    azione = "Verand Trave EST OFF";
    statoprecedente = SRTraveEsternaVeranda;
    pulsantepremuto = pTraveEsternaVeranda;
    uscitarele = TraveEsternaVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveEsternaVeranda = 1;
    DOPO();
  };

  if (digitalRead(pTraveEsternaVeranda) == HIGH && SRTraveEsternaVeranda == 1) {
    digitalWrite(TraveEsternaVeranda, LOW);
    // "Benvenuti da Alberto";
    azione = "Veranda Trave EST ON";
    statoprecedente = SRTraveEsternaVeranda;
    pulsantepremuto = pTraveEsternaVeranda;
    uscitarele = TraveEsternaVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveEsternaVeranda = 0;
    DOPO();
  };
  // Veranda presa Pilotata:
  if (digitalRead(pPresaPilotataVeranda) == HIGH && SRPresaPilotataVeranda == 0) {
    digitalWrite(PresaPilotataVeranda, HIGH);
    // "Benvenuti da Alberto";
    azione = "Ver Pres Pilotat OFF";
    statoprecedente = SRPresaPilotataVeranda;
    pulsantepremuto = pPresaPilotataVeranda;
    uscitarele = PresaPilotataVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveEsternaVeranda = 1;
    DOPO();
  };
  if (digitalRead(pPresaPilotataVeranda) == HIGH && SRPresaPilotataVeranda == 1) {
    digitalWrite(PresaPilotataVeranda, LOW);
    // "Benvenuti da Alberto";
    azione = "Ver Pres Pilotata ON";
    statoprecedente = SRPresaPilotataVeranda;
    pulsantepremuto = pPresaPilotataVeranda;
    uscitarele = PresaPilotataVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRPresaPilotataVeranda = 0;
    DOPO();
  };

  // Cucina Luci Alte:
  if (digitalRead(pLuciAlte) == HIGH && SRLuciAlte == 0) {
    digitalWrite(LuciAlte, HIGH);
    // "Benvenuti da Alberto";
    azione = "Cucina Lampade   OFF";
    statoprecedente = SRLuciAlte;
    pulsantepremuto = pLuciAlte;
    uscitarele = LuciAlte;
    PRIMA();
    Scrivi_su_LCD();
    SRLuciAlte = 1;
    DOPO();
  };

  if (digitalRead(pLuciAlte) == HIGH && SRLuciAlte == 1) {
    digitalWrite(LuciAlte, LOW);
    // "Benvenuti da Alberto";
    azione = "Cucina lampade    ON";
    statoprecedente = SRLuciAlte;
    pulsantepremuto = pLuciAlte;
    uscitarele = LuciAlte;
    PRIMA();
    Scrivi_su_LCD();
    SRLuciAlte = 0;
    DOPO();
  };
  // Cucina Luci Tavolo:
  if (digitalRead(pTavoloCucina) == HIGH && SRTavoloCucina == 0) {
    digitalWrite(TavoloCucina, HIGH);
    // "Benvenuti da Alberto";
    azione = "Cucina Tavolo    OFF";
    statoprecedente = SRTavoloCucina;
    pulsantepremuto = pTavoloCucina;
    uscitarele = TavoloCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRTavoloCucina = 1;
    DOPO();
  };

  if (digitalRead(pTavoloCucina) == HIGH && SRTavoloCucina == 1) {
    digitalWrite(TavoloCucina, LOW);
    // "Benvenuti da Alberto";
    azione = "Cucina Tavolo     ON";
    statoprecedente = SRTavoloCucina;
    pulsantepremuto = pTavoloCucina;
    uscitarele = TavoloCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRTavoloCucina = 0;
    DOPO();
  };

  // Cucina mensola SX:
  if (digitalRead(pMensolaSXCucina) == HIGH && SRMensolaSXCucina == 0) {
    digitalWrite(MensolaSXCucina, HIGH);
    // "Benvenuti da Alberto";
    azione = "Cucina Mensol SX OFF";
    statoprecedente = SRMensolaSXCucina;
    pulsantepremuto = pMensolaSXCucina;
    uscitarele = MensolaSXCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRMensolaSXCucina = 1;
    DOPO();
  };

  if (digitalRead(pMensolaSXCucina) == HIGH && SRMensolaSXCucina == 1) {
    digitalWrite(MensolaSXCucina, LOW);
    // "Benvenuti da Alberto";
    azione = "Cucina Mensola SX ON";
    statoprecedente = SRMensolaSXCucina;
    pulsantepremuto = pMensolaSXCucina;
    uscitarele = MensolaSXCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRMensolaSXCucina = 0;
    DOPO();
  };

  // Cucina mensole DX:
  if (digitalRead(pMensolaDXCucina) == HIGH && SRMensolaDXCucina == 0) {
    digitalWrite(MensolaDXCucina, HIGH);
    // "Benvenuti da Alberto";
    azione = "Cucina Mensol DX OFF";
    statoprecedente = SRMensolaDXCucina;
    pulsantepremuto = pMensolaDXCucina;
    uscitarele = MensolaDXCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRMensolaDXCucina = 1;
    DOPO();
  };

  if (digitalRead(pMensolaDXCucina) == HIGH && SRMensolaDXCucina == 1) {
    digitalWrite(MensolaDXCucina, LOW);
    // "Benvenuti da Alberto";
    azione = "Cucina Mensola DX ON";
    statoprecedente = SRMensolaDXCucina;
    pulsantepremuto = pMensolaDXCucina;
    uscitarele = MensolaDXCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRMensolaDXCucina = 0;
    DOPO();
  };

  // Cucina Travi:
  if (digitalRead(pTraviCucina) == HIGH && SRTraviCucina == 0) {
    digitalWrite(TraviCucina, HIGH);
    // "Benvenuti da Alberto";
    azione = "Cucina Travi     OFF";
    statoprecedente = SRTraviCucina;
    pulsantepremuto = pTraviCucina;
    uscitarele = TraviCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviCucina = 1;
    DOPO();
  };

  if (digitalRead(pTraviCucina) == HIGH && SRTraviCucina == 1) {
    digitalWrite(TraviCucina, LOW);
    // "Benvenuti da Alberto";
    azione = "Cucina Travi      ON";
    statoprecedente = SRTraviCucina;
    pulsantepremuto = pTraviCucina;
    uscitarele = TraviCucina;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviCucina = 0;
    DOPO();
  };


  //ingresso Travi:
  if (digitalRead(pIngressoTravi) == HIGH && SRIngressoTravi == 0) {
    digitalWrite(IngressoTravi, HIGH);
    // "Benvenuti da Alberto";
    azione = "Ingresso Travi   OFF";
    statoprecedente = SRIngressoTravi;
    pulsantepremuto = pIngressoTravi;
    uscitarele = IngressoTravi;
    PRIMA();
    Scrivi_su_LCD();
    SRIngressoTravi = 1;
    DOPO();
  };

  if (digitalRead(pIngressoTravi) == HIGH && SRIngressoTravi == 1) {
    digitalWrite(IngressoTravi, LOW);
    // "Benvenuti da Alberto";
    azione = "Ingresso Travi    ON";
    statoprecedente = SRIngressoTravi;
    pulsantepremuto = pIngressoTravi;
    uscitarele = IngressoTravi;
    PRIMA();
    Scrivi_su_LCD();
    SRIngressoTravi = 0;
    DOPO();
  };

  //ingresso scala rovere led :
  if (digitalRead(pScala) == HIGH && SRScala == 0) {
    digitalWrite(Scala, HIGH);
    // "Benvenuti da Alberto";
    azione = "Interrato Scala  OFF";
    statoprecedente = SRScala;
    pulsantepremuto = pScala;
    uscitarele = Scala;
    PRIMA();
    Scrivi_su_LCD();
    SRScala = 1;
    DOPO();
  };

  if (digitalRead(pScala) == HIGH && SRScala == 1) {
    digitalWrite(Scala, LOW);
    // "Benvenuti da Alberto";
    azione = "Interrato Scala   ON";
    statoprecedente = SRScala;
    pulsantepremuto = pScala;
    uscitarele = Scala;
    PRIMA();
    Scrivi_su_LCD();
    SRScala = 0;
    DOPO();
  };

  // ingresso Lampadario:
  if (digitalRead(pIngressoLampadario) == HIGH && SRIngressoLampadario == 0) {
    digitalWrite(IngressoLampadario, HIGH);
    // "Benvenuti da Alberto";
    azione = "Ingresso Lampada OFF";
    statoprecedente = SRIngressoLampadario;
    pulsantepremuto = pIngressoLampadario;
    uscitarele = IngressoLampadario;
    PRIMA();
    Scrivi_su_LCD();
    SRIngressoLampadario = 1;
    DOPO();
  };

  if (digitalRead(pIngressoLampadario) == HIGH && SRIngressoLampadario == 1) {
    digitalWrite(IngressoLampadario, LOW);
    // "Benvenuti da Alberto";
    azione = "Ingresso lampada  ON";
    statoprecedente = SRIngressoLampadario;
    pulsantepremuto = pIngressoLampadario;
    uscitarele = IngressoLampadario;
    PRIMA();
    Scrivi_su_LCD();
    SRIngressoLampadario = 0;
    DOPO();
  };

  //Sala Trave Soppalco:
  if (digitalRead(pTraveSoppalco) == HIGH && SRTraveSoppalco == 0) {
    digitalWrite(TraveSoppalco, HIGH);
    // "Benvenuti da Alberto";
    azione = "Sala Tr soppalco OFF";
    statoprecedente = SRTraveSoppalco;
    pulsantepremuto = pTraveSoppalco;
    uscitarele = TraveSoppalco;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveSoppalco = 1;
    DOPO();
  };

  if (digitalRead(pTraveSoppalco) == HIGH && SRTraveSoppalco == 1) {
    digitalWrite(TraveSoppalco, LOW);
    // "Benvenuti da Alberto";
    azione = "Sala Tr soppalco  ON";
    statoprecedente = SRTraveSoppalco;
    pulsantepremuto = pTraveSoppalco;
    uscitarele = TraveSoppalco;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveSoppalco = 0;
    DOPO();
  };

  // Sala Trave Doppia:
  if (digitalRead(pTraveDoppia) == HIGH && SRTraveDoppia == 0) {
    digitalWrite(TraveDoppia, HIGH);
    // "Benvenuti da Alberto";
    azione = "Sala Trave DoppiaOFF";
    statoprecedente = SRTraveDoppia;
    pulsantepremuto = pTraveDoppia;
    uscitarele = TraveDoppia;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveDoppia = 1;
    DOPO();
  };

  if (digitalRead(pTraveDoppia) == HIGH && SRTraveDoppia == 1) {
    digitalWrite(TraveDoppia, LOW);
    // "Benvenuti da Alberto";
    azione = "Sala Trave Doppia ON";
    statoprecedente = SRTraveDoppia;
    pulsantepremuto = pTraveDoppia;
    uscitarele = TraveDoppia;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveDoppia = 0;
    DOPO();
  };

  // Sala trave Media:
  if (digitalRead(pTraveMedia) == HIGH && SRTraveMedia == 0) {
    digitalWrite(TraveMedia, HIGH);
    // "Benvenuti da Alberto";
    azione = "Sala Trave Media OFF";
    statoprecedente = SRTraveMedia;
    pulsantepremuto = pTraveMedia;
    uscitarele = TraveMedia;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveMedia = 1;
    DOPO();
  };

  if (digitalRead(pTraveMedia) == HIGH && SRTraveMedia == 1) {
    digitalWrite(TraveMedia, LOW);
    // "Benvenuti da Alberto";
    azione = "Sala Trave Media  ON";
    statoprecedente = SRTraveMedia;
    pulsantepremuto = pTraveMedia;
    uscitarele = TraveMedia;
    PRIMA();
    Scrivi_su_LCD();
    SRTraveMedia = 0;
    DOPO();
  };

  // Sala presa Pilotata SX:
  if (digitalRead(pPresaPilotataSala) == HIGH && SRPresaPilotataSala == 0) {
    digitalWrite(PresaPilotataSala, HIGH);
    // "Benvenuti da Alberto";
    azione = "Sala luce pilota OFF";
    statoprecedente = SRPresaPilotataSala;
    pulsantepremuto = pPresaPilotataSala;
    uscitarele = PresaPilotataSala;
    PRIMA();
    Scrivi_su_LCD();
    SRPresaPilotataSala = 1;
    DOPO();
  };
  if (digitalRead(pPresaPilotataSala) == HIGH && SRPresaPilotataSala == 1) {
    digitalWrite(PresaPilotataSala, LOW);
    // "Benvenuti da Alberto";
    azione = "Sala Luce pilota  ON";
    statoprecedente = SRPresaPilotataSala;
    pulsantepremuto = pPresaPilotataSala;
    uscitarele = PresaPilotataSala;
    PRIMA();
    Scrivi_su_LCD();
    SRPresaPilotataSala = 0;
    DOPO();
  };
  /*         
AllarmE:
  // Allarme
  //if(Serial.available() > 0){SERIALE=Serial.read();};
   
      //if (SERIALE=="allarme" && TraveSoppalco == LOW && TavoloCucina == LOW)
        if(digitalRead(38)==HIGH && TraveSoppalco == LOW && TavoloCucina == LOW)
          {
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
          };

     // if (SERIALE=="allarme" && TraveSoppalco == LOW && TavoloCucina == HIGH)
        if(digitalRead(38)==HIGH && TraveSoppalco == LOW && TavoloCucina == HIGH)
          {
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, LOW);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, LOW);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, LOW);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, LOW);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);
            digitalWrite(TraveSoppalco, HIGH);
              digitalWrite(TavoloCucina, LOW);
                delay(a);
              digitalWrite(TraveSoppalco, LOW);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);
          };
          // if (SERIALE=="allarme" && TraveSoppalco == HIGH && TavoloCucina == LOW)
        if(digitalRead(38) == HIGH && TraveSoppalco == HIGH && TavoloCucina == LOW)
          {
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, HIGH);
                delay(a);
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, LOW);
          delay(a);
          };

        // if(SERIALE=="allarme" && TraveSoppalco==HIGH && TavoloCucina==HIGH)
        if(digitalRead(38)==HIGH&& TraveSoppalco==HIGH && TavoloCucina==HIGH)
          {
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, LOW);
                delay(a);      
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);      
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, LOW);
                delay(a);      
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);      
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, LOW);
                delay(a);      
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);      
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, LOW);
                delay(a);      
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);      
            digitalWrite(TraveSoppalco, LOW);
              digitalWrite(TavoloCucina, LOW);
                delay(a);      
              digitalWrite(TraveSoppalco, HIGH);
            digitalWrite(TavoloCucina, HIGH);
          delay(a);      
          };  //Fine dell'if Allarme

  //Spegni Tutto
  //if (SERIALE="spegni")
    if(digitalRead(37)==HIGH)
    {
    digitalWrite(TraviVeranda, LOW);SRTraviVeranda=0;
      digitalWrite(TraveEsternaVeranda, LOW);SRTraveEsternaVeranda=0;
        digitalWrite(LuciAlte, LOW);SRLuciAlte=0;
          digitalWrite(TavoloCucina, LOW);SRTavoloCucina=0;
            digitalWrite(MensolaSXCucina, LOW);SRMensolaSXCucina=0;
              digitalWrite(MensolaDXCucina, LOW);SRMensolaDXCucina=0;
                digitalWrite(TraviCucina, LOW);SRTraviCucina=0;
                  digitalWrite(IngressoTravi, LOW);SRIngressoTravi=0;
                    digitalWrite(Scala, LOW);SRScala=0;
                      digitalWrite(IngressoLampadario, LOW);SRIngressoLampadario=0;
                        digitalWrite(TraveSoppalco, LOW);SRTraveSoppalco=0;
                          digitalWrite(TraveDoppia, LOW);SRTraveDoppia=0;
                            digitalWrite(TraveMedia, LOW);SRTraveMedia=0;
                              digitalWrite(TraviVeranda, LOW);SRTraviVeranda=0;
                                digitalWrite(PresaPilotataSala, LOW);SRPresaPilotataSala=0;
                                 delay(a);

                        }  //Fine dell'if dello spegni tutto

}  
*/


}  // Fine void loop
void PRIMA() {

  Serial.print("PRIMA >>>> ");
  Serial.print(azione);
  Serial.print("  - Stato precedente: ");
  if (statoprecedente == 0) { Serial.print(" Acceso = "); };
  if (statoprecedente == 1) { Serial.print(" Spento = "); };
  Serial.print(statoprecedente);
  Serial.println();


  void DOPO() {

    Serial.print("DOPO  >>>>  ");
    Serial.print(azione);

    Serial.println();
    Serial.print("pulsante premuto = ");
    Serial.println(pulsantepremuto);
    Serial.print(" Canale uscita = ");
    Serial.println(uscitarele);
    Serial.print("  valore uscita  = ");
    Serial.print(digitalRead(uscitarele));
    if (digitalRead(uscitarele) == 0) { Serial.print(" Acceso "); };
    if (digitalRead(uscitarele) == 1) { Serial.print(" Spento "); };
    Serial.println();
    Serial.println("....................................................");
    Serial.println();
  }

  void Scrivi_su_LCD() {
    Serial.println();
    Serial.print("riga1  = ");
    Serial.print(riga1);
    Serial.println();
    Serial.print("riga2  = ");
    Serial.print(riga2);
    Serial.println();
    Serial.print("riga3  = ");
    Serial.print(riga3);
    Serial.println();
    Serial.print("riga4  = ");
    Serial.print(riga4);
    Serial.println();
    Serial.print("azione = ");
    Serial.print(azione);
    Serial.println();

    riga4 = riga3;
    riga3 = riga2;
    riga2 = riga1;
    riga1 = azione;


    analogWrite(LED_PIN, 20);
    lcd.setCursor(0, 0);
    typewriting(riga1);
    lcd.setCursor(0, 1);
    typewriting(riga2);
    lcd.setCursor(0, 2);
    typewriting(riga3);
    lcd.setCursor(0, 3);
    typewriting(riga4);
    // delay(10);analogWrite(LED_PIN,20);
    delay(10);
    analogWrite(LED_PIN, 15);
    delay(10);
    analogWrite(LED_PIN, 10);
    delay(10);
    analogWrite(LED_PIN, 5);


    Serial.println("----#----#----#----#----#----#----");
    Serial.print("riga1  = ");
    Serial.print(riga1);
    Serial.println();
    Serial.print("riga2  = ");
    Serial.print(riga2);
    Serial.println();
    Serial.print("riga3  = ");
    Serial.print(riga3);
    Serial.println();
    Serial.print("riga4  = ");
    Serial.print(riga4);
    Serial.println();
    Serial.println();
    Serial.print("---+---+---+---  FINE GIOCHI  ---+---+---+---");
    Serial.println();
    Serial.println();
  }

  void typewriting(String messaggio) {
    int lunghezza = messaggio.length();
    for (int i = 0; i < lunghezza; i++) {
      lcd.print(messaggio[i]);
      delay(10);
    }
  }

Grazie mille Guglielmo , ho capito come fare , forse però i commenti andrebbero fatti fuori dal CODE quindi penso di aver sbagliato anche il post #24 ...... ma piano piano ci arrivo , sono un pò duro ma non durissimo . grazie ancora per il vostro aiuto.

una criticità di cui parla penso di averla capita , inutile settare LOW un pin IN , l'altra ci stò pensando ma non mi viene String riga1 = "Benvenuti da Alberto"; questo è un messaggio che mando al LCD quando inizio il loop , poi se ne va premendo altri interruttori , alla fine del progetto gli LCD sono inutili come il serial Print per il monitor , ma per adesso mi servono per avere un controllo visivo di quello che sto facendo , grazie per i complimenti del cablaggio .

ci sono delle parti a cui sto ancora lavorando , ovviamente sono contrassegnate da /* ...... */

questo è l'effetto finale del mio progetto. illuminazione con strisce led 24 v montate su apposite canaline in alluminio e cover diffusore luce

La domanda fondamentale:

Perché io vedo:

  1. fili probabilmente lunghi collegati direttamente ai pin senza disaccoppiamento (a questo servono le R da 10k del mio schema)
  2. nessun debounce hardware o software (a questo servono i condensatori)
  3. pull down di valore troppo elevato per contatti posti a grande distanza

No, non è solo inutile: l'impostazione LOW con digitalWrite di un ingresso, se è attivata la resistenza di pull-up interna con pinMode (pin, INPUT_PULLUP); LA DISATTIVA!

Sono pienamente d'accordo.

Purtroppo la formattazione automatica non agisce sulle parti tra /* e */. Capisco che sia giusto non formattare i commenti, ma il codice dovrebbe essere identificato e formattato ugualmente, tanto più se sono più righe. Potrebbe anche apparire una domanda:
"Formattare anche i commenti tra /* e */?"

Altrimenti, basta togliere /* e */, formattare e poi rimetterli. :slight_smile:

Secondo noi queste cose escono meglio con delle struct
Il problema sono quelle lunghe strighe descriventi l'azione


I cavi che vanno da Arduino ai pulsanti passano prima dalla morsettiera con una distanza di circa 50 cm ,alla morsettiera arrivano da ogni stanza vari pulsanti che sono ponticellati per avere il solito scopo , i cavi dalla morsettiera vanno ai pulsanti tramite forassite singole dove non passano altri cavi ho dedicato ogni forassite al suo scopo , infatti mi arrivano circa 120 forassiti al quadro elettrico, dalla morsettiera ai pulsanti la distanza è variabile , da 3 a 10/12 mt , e sono divisi in due parti zona notte e zona giorno ( divisi dal rigo nero a metà morsettiera) parte sinistra alimentata dal Vcc di un Arduino e parte destra alimentata dall'altro Arduino.
premetto che funziona tutto , al premere di ogni pulsante si accende e spegne la luce assegnata , quindi teoricamente e praticamente funziona tutto , conscio di aver fatto uno sketch in base alle mie ancestrali rimembranze del linguaggio BASIC che studiai a scuola.
il problema che non capisco è : guardando la foto dei travi illuminati , quattro travi hanno tre modi di essere illuminati tramite pulsante , o il primo a sinistra o il terzo da sinistra o il secondo e quarto , questo per avere più gradi di illuminazione in base alle nostre esigenze , se la sera li spengo tutti , la mattina mi ritrovo con un trave illuminato o due o quattro anche senza premere nessun pulsante , e questo accade anche nelle altre stanze perché l'illuminazione è tutta uguale in ogni stanza , delle volte non ho nessun disturbo , altre volte uno , altre volte 3 , altre volte tutti , è molto variabile .
Avevo già pensato di abbassare il valore della resistenza di pull down , ma mi sembra molto strano che durante le ore di riposo pulsanti ( non premuti per lungo tempo ) ci possa essere un riconoscimento di segnale nel Pin IN di Arduino , avevo anche pensato di inserire un diodo per eliminare un eventuale rientro di Vcc derivato da non so cosa , tipo un accumulo di tensione, sto anche seriamente pensando di avere dei fantasmi in casa che mi premono i pulsanti a mia insaputa.

avevo anche ipotizzato di semplificare il codice ..... premetto che è il mio primo progetto con Arduino.

Non si chiamano fantasmi, ma tensioni di rete indotte e segnali a radiofrequenza, sempre presenti. Non è neanche pensabile collegare un ingresso digitale a simili "antenne". A me sembra già strano che non si resettino completamente (e randomicamente) gli Arduini.

Qualsiasi segnale del "campo" (cioè tutto ciò che sta lontano dalla logica) deve trovare una bassa impedenza (cioè serve un disturbo di grande potenza per interferire) e un'alta "inerzia" (deve durare per un certo tempo), per questo un comune relé non verrà mai disturbato da nulla. Un ingresso digitale collegato al "campo", bisogna invece appositamente renderlo, via hardware e software, "duro e sordo" quanto un relé.

Questa è una delle differenze principali tra gli ingressi/uscite di Arduino (schedina per prototipi senza alcuna protezione dai disturbi condotti e irradiati), e un PLC industriale progettato apposta per far fronte a tutta la casistica di disturbi EMI presenti nel mondo reale.

2 Likes

Esatto. Quindi, Capolona, usa resistenze da 1k (5mA con 5V) o addirittura da 470 ohm (circa 10mA con 5V) al posto di quelle da 10k. Comincia dalle luci che più spesso si accendono da sole e vedi se non accade più.


ho usato il valore da 10 K hom informandomi in rete , sostituire singolarmente le resistenze di pull down sarebbe un pò complicato , preferisco rifare tutto di nuovo , usando delle resistenze di valore inferiore .
Per essere sicuro che ci sia scarico completo da interferenze generate da varie fonti uso resistenze da 470 hom ? non vorrei usarne da 1 K hom per poi ritrovarmi con i soliti problemi , grazie comunque per i vostri preziosi consigli.

Io ti do questo suggerimento. Ci sono dei pezzi di codice che secondo me sono "accorpabili" a coppia (facendo una funzione). Ovvero un esempio:

  // Veranda trave centrale:
  if (digitalRead(pTraviVeranda) == HIGH && SRTraviVeranda == 0) {
    digitalWrite(TraviVeranda, HIGH);
    // "Benvenuti da Alberto";
    azione = "Veranda Travi CX OFF";
    statoprecedente = SRTraviVeranda;
    pulsantepremuto = pTraviVeranda;
    uscitarele = TraviVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviVeranda = 1;
    DOPO();
  };
  if (digitalRead(pTraviVeranda) == HIGH && SRTraviVeranda == 1) {
    digitalWrite(TraviVeranda, LOW);
    // "--------------------";
    azione = "Veranda Travi CX  ON";
    statoprecedente = SRTraviVeranda;
    pulsantepremuto = pTraviVeranda;
    uscitarele = TraviVeranda;
    PRIMA();
    Scrivi_su_LCD();
    SRTraviVeranda = 0;
    DOPO();
  };

Secondo me semplifichi codice e lettura se leggi solo il valore del pin e poi in una funzione specifica verifichi la variabile di stato (nei punti dove il codice deve comportarsi in maniera diversa a secondo dello stato):

  // Veranda trave centrale:
  if (digitalRead(pTraviVeranda) == HIGH)
  { funzTraviVeranda();
  }

...
void funzTraviVeranda()
{ digitalWrite(TraviVeranda, ! SRTraviVeranda );   // oppure digitalWrite(TraviVeranda, (SRTraviVeranda == 0 ? HIGH : LOW) );   
  azione = "Veranda Travi CX " + (SRTraviVeranda == 0 ? "OFF" : "ON") ;
  statoprecedente = SRTraviVeranda;
  pulsantepremuto = pTraviVeranda;
  uscitarele      = TraviVeranda;
  PRIMA();
  Scrivi_su_LCD();
  SRTraviVeranda = (SRTraviVeranda == 0 ? 1 : 0);   // if in linea
  DOPO();
}

Consiglio di fare di più che semplicemente ridurre la resistenza di pull-down.
Schmitt trigger 6 canali non invertente.
SN74HCS14

Pensavo di trovarlo commercializzato come modulo pcb e invece devi assemblarlo tu su un pcb.

Ciao.

secondo noi passando per una struct si semplifica enormemente il programma, almeno la gestione dei pulsanti ingressi ed uscite

solo come esempio, volutamente non c'è una setup() funzionante

/*
   Una nuova idea DDD
   Del Dinamico Duo
   Sentitevi liberi di copiare
   Sentitevi liberi di trarre ispirazione
   Sentitevi liberi di dare un cenno di ringraziamento
   Creato con IDE 1.8.10
*/
typedef struct
{
   byte inp; // ingresso associato
   byte out; // uscita associata
   bool stato; // acceso/spento
   char * nome; // puntatore al nome (quasi la stessa cosa che usare un array di char interno alla struct)
} luce;

luce luci[] =
{
   { 3, 4, 0, "sala grande"},
   { 5, 6, 0, "saletta"},
   {10, 11, 0, "trave centrale"}
};

void setup(void)
{
   Serial.begin(9600);
}

void loop(void)
{
   for (byte i = 0; i < sizeof luci / sizeof luci[0]; i++)
   {
      if (digitalRead(luci[i].inp))
      {
         digitalWrite(luci[i].out, luci[i].stato = !luci[i].stato);
      }

      Serial.print("rilevato pulsante numero: ");
      Serial.println(luci[i].inp);
      Serial.print("luce numero: ");
      Serial.print(i);
      Serial.print(" --->  ");
      Serial, print(luci[i].nome);
      Serial.print("  ");
      Serial.print(luci[i].stato ? "accesa" : "spenta");
      Serial.println();
   }
}

PS il comando dello IDE Modifica-Copia per il forum funziona benissimo

guardate la loop()

fa tutto in tre sole righe
un for
un if
e un digitalwrite

il resto sono solo stampe

COSI' un programma è ben indentato e leggibile

e per vedere se anche altri si interessano agli altrui problemi:
ha pure una bassa complessità ciclomatica :grinning:

PPS
che nessuno se la prenda se abbiamo copiato da lui (o loro)
lo abbiamo sempre detto che ci ispiravamo a voi più bravi
peraltro qui è tutto open source

2 Likes

Non solo, posso pure fare una ricerca nell'array luci perché ad esempio voglio sapere quante e quali luci risultano accese.

Mi basterà scorrere tutti gli elementi dell'array luci[i].state e se vale 1 stampo inp, out e il nome.

Ciao.

È normale, quando si inventa qualcosa e si fa un prototipo, doverlo modificare, quindi bisogna anche prevederlo! Le resistenze smd sono molto comode e da Aliexpress trovi una serie intera di migliaia di pezzi per pochi euro.