Aiuto Problemi con D0

Buonasera, salve a tutti,
mi presento sono Tommaso appassionato di elettronica e costruzione audio da sempre.
Ringrazio tutti, ed in particolare Guglielmo grpb01 per le indicazioni.
Da poco mi sono avvicinato al mondo di Arduino con tanta voglia di imparare. :wink:

Sto smanettando da qualche giorno con Arduino ONE.
E' mia intenzione realizzare un progetto che mi consentisse di usare Arduino UNO per gestire 10 IN e 10 OUT, (toogle).
Ho effettuato la formattazione automatica del listato come indicato.(spero sia leggibile).
Descrizione del funzionamento:
alla pressione di un pulsante, sull'uscita corrispondente si otterrà un cambiamento di stato che resterà tale fino alla successiva pigiata. (interruttore)
In sostanza ho realizzato lo sketch ed Arduino e si comporta quasi come volevo, tranne il D0 che resta allo stato alto.
Mi aiutate a capire perché succede questo?
Grazie infinite.
Tommaso

Di seguito il listato:

int pulsPin1 = A0;
int pulsPin2 = A1;
int pulsPin3 = A2;
int pulsPin4 = A3;
int pulsPin5 = A4;
int pulsPin6 = A5;
int pulsPin7 = 0;
int pulsPin8 = 1;
int pulsPin9 = 2;
int pulsPin10 = 3;

int relayPin1 = 4;
int relayPin2 = 5;
int relayPin3 = 6;
int relayPin4 = 7;
int relayPin5 = 8;
int relayPin6 = 9;
int relayPin7 = 10;
int relayPin8 = 11;
int relayPin9 = 12;
int relayPin10 = 13;


int relayStato1 = LOW;
int relayStato2 = LOW;
int relayStato3 = LOW;
int relayStato4 = LOW;
int relayStato5 = LOW;
int relayStato6 = LOW;
int relayStato7 = LOW;
int relayStato8 = LOW;
int relayStato9 = LOW;
int relayStato10 = LOW;

int pulsStato1 = LOW;
int pulsStato2 = LOW;
int pulsStato3 = LOW;
int pulsStato4 = LOW;
int pulsStato5 = LOW;
int pulsStato6 = LOW;
int pulsStato7 = LOW;
int pulsStato8 = LOW;
int pulsStato9 = LOW;
int pulsStato10 = LOW;

int attesaDebounce1 = 50;
int attesaDebounce2 = 50;
int attesaDebounce3 = 50;
int attesaDebounce4 = 50;
int attesaDebounce5 = 50;
int attesaDebounce6 = 50;
int attesaDebounce7 = 50;
int attesaDebounce8 = 50;
int attesaDebounce9 = 50;
int attesaDebounce10 = 50;

unsigned long ultimoTempoDebounce1 = 0;
unsigned long ultimoTempoDebounce2 = 0;
unsigned long ultimoTempoDebounce3 = 0;
unsigned long ultimoTempoDebounce4 = 0;
unsigned long ultimoTempoDebounce5 = 0;
unsigned long ultimoTempoDebounce6 = 0;
unsigned long ultimoTempoDebounce7 = 0;
unsigned long ultimoTempoDebounce8 = 0;
unsigned long ultimoTempoDebounce9 = 0;
unsigned long ultimoTempoDebounce10 = 0;

int ultimaLettura1 = LOW;
int ultimaLettura2 = LOW;
int ultimaLettura3 = LOW;
int ultimaLettura4 = LOW;
int ultimaLettura5 = LOW;
int ultimaLettura6 = LOW;
int ultimaLettura7 = LOW;
int ultimaLettura8 = LOW;
int ultimaLettura9 = LOW;
int ultimaLettura10 = LOW;

void setup() {
  pinMode(pulsPin1, INPUT);
  pinMode(pulsPin2, INPUT);
  pinMode(pulsPin3, INPUT);
  pinMode(pulsPin4, INPUT);
  pinMode(pulsPin5, INPUT);
  pinMode(pulsPin6, INPUT);
  pinMode(pulsPin7, INPUT);
  pinMode(pulsPin8, INPUT);
  pinMode(pulsPin9, INPUT);
  pinMode(pulsPin10, INPUT);

  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);
  pinMode(relayPin3, OUTPUT);
  pinMode(relayPin4, OUTPUT);
  pinMode(relayPin5, OUTPUT);
  pinMode(relayPin6, OUTPUT);
  pinMode(relayPin7, OUTPUT);
  pinMode(relayPin8, OUTPUT);
  pinMode(relayPin9, OUTPUT);
  pinMode(relayPin10, OUTPUT);

  digitalWrite(relayPin1, relayStato1);
  digitalWrite(relayPin2, relayStato2);
  digitalWrite(relayPin3, relayStato3);
  digitalWrite(relayPin4, relayStato4);
  digitalWrite(relayPin5, relayStato5);
  digitalWrite(relayPin6, relayStato6);
  digitalWrite(relayPin7, relayStato7);
  digitalWrite(relayPin8, relayStato8);
  digitalWrite(relayPin9, relayStato9);
  digitalWrite(relayPin10, relayStato10);

}

void loop() {
  int lettura1 = digitalRead(pulsPin1);
  if (lettura1 != ultimaLettura1) {
    ultimoTempoDebounce1 = millis();
  }

  if ((millis() - ultimoTempoDebounce1) > attesaDebounce1) {
    if (lettura1 != pulsStato1 and lettura1 == HIGH) {
      relayStato1 = !relayStato1;
      digitalWrite(relayPin1, relayStato1);
    }
    pulsStato1 = lettura1;
  }

  ultimaLettura1 = lettura1;
  delay(10);

  int lettura2 = digitalRead(pulsPin2);
  if (lettura2 != ultimaLettura2) {
    ultimoTempoDebounce2 = millis();
  }

  if ((millis() - ultimoTempoDebounce2) > attesaDebounce2) {
    if (lettura2 != pulsStato2 and lettura2 == HIGH) {
      relayStato2 = !relayStato2;
      digitalWrite(relayPin2, relayStato2);
    }
    pulsStato2 = lettura2;
  }
  ultimaLettura2 = lettura2;
  delay(10);

  int lettura3 = digitalRead(pulsPin3);
  if (lettura3 != ultimaLettura3) {
    ultimoTempoDebounce3 = millis();
  }
  if ((millis() - ultimoTempoDebounce3) > attesaDebounce3) {
    if (lettura3 != pulsStato3 and lettura3 == HIGH) {
      relayStato3 = !relayStato3;
      digitalWrite(relayPin3, relayStato3);
    }
    pulsStato3 = lettura3;
  }
  ultimaLettura3 = lettura3;
  delay(10);

  int lettura4 = digitalRead(pulsPin4);
  if (lettura4 != ultimaLettura4) {
    ultimoTempoDebounce4 = millis();
  }
  if ((millis() - ultimoTempoDebounce4) > attesaDebounce4) {
    if (lettura4 != pulsStato4 and lettura4 == HIGH) {
      relayStato4 = !relayStato4;
      digitalWrite(relayPin4, relayStato4);
    }
    pulsStato4 = lettura4;
  }
  ultimaLettura4 = lettura4;
  delay(10);

  int lettura5 = digitalRead(pulsPin5);
  if (lettura5 != ultimaLettura5) {
    ultimoTempoDebounce5 = millis();
  }
  if ((millis() - ultimoTempoDebounce5) > attesaDebounce5) {
    if (lettura5 != pulsStato5 and lettura5 == HIGH) {
      relayStato5 = !relayStato5;
      digitalWrite(relayPin5, relayStato5);
    }
    pulsStato5 = lettura5;
  }
  ultimaLettura5 = lettura5;
  delay(10);

  int lettura6 = digitalRead(pulsPin6);
  if (lettura6 != ultimaLettura6) {
    ultimoTempoDebounce6 = millis();
  }
  if ((millis() - ultimoTempoDebounce6) > attesaDebounce6) {
    if (lettura6 != pulsStato6 and lettura6 == HIGH) {
      relayStato6 = !relayStato6;
      digitalWrite(relayPin6, relayStato6);
    }
    pulsStato6 = lettura6;
  }
  ultimaLettura6 = lettura6;
  delay(10);

  int lettura7 = digitalRead(pulsPin7);
  if (lettura7 != ultimaLettura7) {
    ultimoTempoDebounce7 = millis();
  }
  if ((millis() - ultimoTempoDebounce7) > attesaDebounce7) {
    if (lettura7 != pulsStato7 and lettura7 == HIGH) {
      relayStato7 = !relayStato7;
      digitalWrite(relayPin7, relayStato7);
    }
    pulsStato7 = lettura7;
  }
  ultimaLettura7 = lettura7;
  delay(10);

  int lettura8 = digitalRead(pulsPin8);
  if (lettura8 != ultimaLettura8) {
    ultimoTempoDebounce8 = millis();
  }
  if ((millis() - ultimoTempoDebounce8) > attesaDebounce8) {
    if (lettura8 != pulsStato8 and lettura8 == HIGH) {
      relayStato8 = !relayStato8;
      digitalWrite(relayPin8, relayStato8);
    }
    pulsStato8 = lettura8;
  }
  ultimaLettura8 = lettura8;
  delay(10);

  int lettura9 = digitalRead(pulsPin9);
  if (lettura9 != ultimaLettura9) {
    ultimoTempoDebounce9 = millis();
  }
  if ((millis() - ultimoTempoDebounce9) > attesaDebounce9) {
    if (lettura9 != pulsStato9 and lettura9 == HIGH) {
      relayStato9 = !relayStato9;
      digitalWrite(relayPin9, relayStato9);
    }
    pulsStato9 = lettura9;
  }
  ultimaLettura9 = lettura9;
  delay(10);

  int lettura10 = digitalRead(pulsPin10);
  if (lettura10 != ultimaLettura10) {
    ultimoTempoDebounce10 = millis();
  }
  if ((millis() - ultimoTempoDebounce10) > attesaDebounce10) {
    if (lettura10 != pulsStato10 and lettura10 == HIGH) {
      relayStato10 = !relayStato10;
      digitalWrite(relayPin10, relayStato10);
    }
    pulsStato10 = lettura10;
  }
  ultimaLettura10 = lettura10;
  delay(10);
}

Buonasera e benvenuto :slight_smile: ,

essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

... poi, in conformità al suddetto regolamento, punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, il tuo codice non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE). Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Buongiorno Guglielmo,
grazie indicazioni.
Ieri ho effettuato le correzioni, ma credo che per la presentazione non sia andata a buon fine.
Mi può dare indicazioni di come fare la presentazione nel modo corretto. Ho cliccato su "in questo thread", ma non vedo la spunta di new topics per effettuare la presentazione.
Come devo proseguire?
Grazie
Cordiali saluti

Difatti NON devi creare un "New Topic" che esiste già ed è quello dove sono tutte le presentazioni, ma devi usare il bottone di colore BLU che si trova in fondo fatto così: Screenshot 2021-06-17 at 10.40.34

Così la tua verra aggiunta in fondo al thread delle presentazioni :wink:

Guglielmo

Tks

Mi raccomando anche di sistemare il codice come è spiegato nel mio post #2 ... :roll_eyes:

Guglielmo

Salve Guglielmo,
un ulteriore chiarimento in merito alla sistemazione del codice.
Effettuato la formattazione automatica devo effettuare la copia del listato e incollarlo nel post, o inviare direttamente il file.ino?
Grazie per la disponibilità
Saluti

Edita il tuo primo post, quindi seleziona il "vecchio" codice, poi incolla quello "nuovo" (che quindi sostituirà quello vecchio) e mantenendo selezionato solo il codice, premi il pulsante "</>" in alto per formattarlo come codice, quindi salva.

Salve docdoc
Grazie per le indicazioni, spero di aver capito bene.
:+1:

Si, va bene così.
Passiamo ora al tuo problema.

Spiegati meglio, io il D0 lo vedo associato ad un pulsante (pulsPin7) cosa intendi con "che resta allo stato alto"? Cos'è che resta "alto", il pulsante (ossia anche se lo premi una volta è come se continuassi a premerlo), o parli del led, ossia il relè, che non si spegne più una volta acceso?

Ma prima dovresti confermare se i pulsanti li hai cablati con una resistenza "pull-down" perché se li definisci solo "INPUT" questo implica che devi avere una resistenza di pull-down (ossia una 10k da pin a massa) ed il pulsante che porta a +5V, per fare in modo che la lettura ti dia sempre LOW ma quando lo premi ti dà HIGH. In caso contrario l'input è "flottante" e puoi leggere qualsiasi valore LOW o HIGH a seconda delle interferenze ricevute dal pin.

Una volta risolta questa cosa, vorrei farti soffermare sulla possibilità di creare degli array di valori, cosa che ti evita di avere quei "copiaincolla" di decine variabili e di blocchi di codice quasi del tutto identici. Ma magari ne parleremo quando avrai risolto il problema. :wink:

PS: ricorda che D0 e D1 sono associati alla seriale di Arduino, per cui puoi usarli solo se non usi nulla della comunicazione seriale...

Salve docdoc
ho cablato tutti gli ingressi con la resistenza in pull-down come da figura in allegato.
La mia perplessità è che tutti gli altri IN ed Out funzionano come volevo.
Solo sul D0 il led in uscita posta sul D10 resta attiva. Led sempre acceso nonostante la pressione del tasto. Ho misurato la tensione sul pin 9 D0 e riscontro sempre +5V.
ho provato anche con un altra board sempre lo stesso comportamento.
Forse devo mantenere il pin in pull-Up?
La cosa strana è che tutti gli altri ingressi rispondono come volevo tranne pin 9 D0.
Per quanto concerne la semplificazione del listato so che ci sono altre vie.
Ma sono alla prima esperienza.
Grazie del supporto.

... emmm ... io nel tuo schema leggo A0 e non D0 :roll_eyes:

Guglielmo

Pardon è D0, nella fretta ho disegnato in modo errato.
Ecco il disegno corretto.

Scusa ma è un "minestrone" di numeri e mi stai facendo girare la testa... :thinking: Tu parli di pin 9, che poi se parli dei pin fisici di Arduino dello schema sarebbe A0, che però nelle variabili è pulsPin1, quindi il pulsante 1, però poi dici che il led che resta sempre acceso si trova su D10 che è relayPin7 (perché il pin1 dovrebbe comandare il relay 7)???

Cerca di spiegare per bene una volta per tutte di cosa parli quando dai una numerazione, usa SEMPRE lo stesso riferimento, o del numero del pin o, meglio, del valore che usi in digitalRead()/digitalWrite(), o almeno dicci il nome della variabile che corrisponde a quello che stai lamentando.

Ah, ok, già meglio :wink:

Allora il problema potrebbe essere proprio in quello che ho scritto nel PS: non è che per caso tu stai provando il tutto mantenendo collegata la USB al computer (e quindi la seriale di Arduino è "impegnata" nella comunicazione)? Alimenta Arduino con un alimentatore sull'apposito jack e vedi se funziona.

In effetti ci avevo pensato, ed ho collegato la board con l'alimentazione esterna.
Ma nulla di fatto.

Ecco una foto:

Allora cerca di isolare il problema, ma dato che non puoi usare la seriale per fare debug, inizia staccando il pulsante da D0 e riavvia la board: il LED resta ancora acceso? Se si spegne, allora è il pulsante (o tracce della breadboard che sono in corto...) in tal caso prova a mettere su D0 uno degli altri e riavvia e vedi se in quel caso funziona.

Se invece risulta ancora acceso, allora potrebbe essere guasto quel pin di Arduino: non è che magari hai un'altra UNO per provare, no eh?

In caso contrario per poterlo verificare dopo i controlli precedenti, io staccherei tutti i fili lasciando solo pulsante e led come nello schema (sempre alimentando comunque la board con alimentatore): fai uno sketch di prova dove gestisci solo quel pulsante e quel led e vedi se isolando tutto funziona o meno. Facci sapere.

Vedo troppe resistenze

In particolare ogni pulsante ha 2 resistenze

A schema solo 1

Inoltre cosa sono quelle due resistenze che collegano le due metà delle due linee del meno?

Il pin che risponde male è l'unico collegato "dopo" la resistenza di ponte in alto

Magari è una coincidenza, magari no...

Ciao Standardoil, hai ragione ci sono due resistori ma sono da 0 ohm al posto dei ponticelli e quelle di pull-down da 10K.