Output digitali in HIGH appena accesa....

Ho montato un circuito con 7 relè da 10A per controllare diversi carichi (fari, elettrovalvole, avviamento compressore ecc..) comandati tramite 7 diversi pulsanti. I 7 pulsanti danno un'impulso, tramite digitalRead, ai 7 pin digitali configurati come Input. Gli altri 7 pin configurati come Output fanno eccitare i vari relè (tramite transistor), fino a che un nuovo impulso da pulsante non li disecciti. Fino a qui tutto facile e tutto funzionante.

Il problema è che all'accensione dell'Arduino UNO, fanno un brevissimo HIGH (di qualche decimo di secondo) che provoca l'eccitazione di tutti i relè e la conseguente accensione di tutti i fari, tutte le elettrovalvole e del compressore con evidenti problemi di assorbimento di rete. Ho provato a modificare lo sketch inserendo dei delay ma senza successo perchè questo problema si verifica prima che la scheda inizi a caricare il programma.

Non sò che pesci prendere... :~

Hai messo delle resistenze da 10kOhm tra base dei transistori e massa? Hai messo una resistenze tra base dei transistori e Pin Arduino? Ciao Uwe

Ciao Uwe! speravo in una tua risposta. ho collegato le due resistenze come da schema: www.logicaprogrammabile.it/come-pilotare-rele/pilotarele1/ grazie

Per evitare problemi potresti accendere prima arduino e poi dare corrente ai vari carichi, in pratica usare 2 switch. Uno per alimentare la logica e l'altro per dare corrente al resto.

Potrebbe essere una soluzione, cosi avrei anche la "memoria" delle utenze accese e spente in precedenza evitando che ad ogni accensione si resetti tutto e tutte le uscite vadano in stato LOW. Soluzione poco "elegante" ma comunque funzionale. Comunque a livello teorico mi piacerebbe capire e risolvere il problema

Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?

Hai ragione a dire che è poco elegante come soluzione, infatti il mio consiglio è di tenerla come estremis, se riesci ad evitare questi impulsi all'accensione sarebbe meglio.

Muccio: Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?

Usa le entrate analogiche come Pin digitali e non usare il Pin 0 e 1.

Ciao Uwe

Muccio: Un'altra csa: avendo bisogno di 7 out e quindi 7 in ho usato anche i pin 1 RX e 2 TX senza aver avuto problemi. E' corretto farlo o é meglio non usare questi canali?

Se nel tuo sketch non usi la seriale va bene. Ma se usi la seriale per il debug o passare comandi ad Arduino, non va bene. I pin RX e TX sono 0 e 1. Non puoi usare i pin dal 2 a 9? Hai anche altri sensori attaccati ad arduino?

Muccio: Ciao Uwe! speravo in una tua risposta. ho collegato le due resistenze come da schema: www.logicaprogrammabile.it/come-pilotare-rele/pilotarele1/ grazie

Mi sembra giusto. Non mi spiego la resistenza da 100 Ohm in serie al relé. Ci fai vedere il codice? ciao Uwe

inserisco il codice questa sera, ho tutto nel pc a casa. Ora sono col telefonino. Grazie a tutti!

Ecco il codice... non funzionante cioè funziona solo il pulsante1, stasera dopo cena mi ci metto col cervello e vedo di trovare l'inghippo. :P Sicuramente ci sarà un modo più elegante per scriverlo :), ma per ora mi interessa risolvere il problema primario...

#define LED1 1
#define BUTTON1 0
#define LED2 3
#define BUTTON2 2
#define LED3 5
#define BUTTON3 4
#define LED4 7
#define BUTTON4 6
#define LED5 9
#define BUTTON5 8
#define LED6 11
#define BUTTON6 10
#define LED7 13
#define BUTTON7 12
int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;
int val2 = 0;
int vecchio_val2 = 0;
int stato2 = 1;
int val3 = 0;
int vecchio_val3 = 0;
int stato3 = 1;
int val4 = 0;
int vecchio_val4 = 0;
int stato4 = 1;
int val5 = 0;
int vecchio_val5 = 0;
int stato5 = 1;
int val6 = 0;
int vecchio_val6 = 0;
int stato6 = 1;
int val7 = 0;
int vecchio_val7 = 0;
int stato7 = 1;
  
void setup() {  
  pinMode(LED1, OUTPUT);  
  pinMode(BUTTON1, INPUT);
  pinMode(LED2, OUTPUT);  
  pinMode(BUTTON2, INPUT);
  pinMode(LED3, OUTPUT);  
  pinMode(BUTTON3, INPUT);
  pinMode(LED4, OUTPUT);  
  pinMode(BUTTON4, INPUT);
  pinMode(LED5, OUTPUT);  
  pinMode(BUTTON5, INPUT);
  pinMode(LED6, OUTPUT);  
  pinMode(BUTTON6, INPUT);
  pinMode(LED7, OUTPUT);  
  pinMode(BUTTON7, INPUT);
}  
  
void loop() {  
  val1 = digitalRead(BUTTON1);
  val2 = digitalRead(BUTTON2); 
  val3 = digitalRead(BUTTON3); 
  val4 = digitalRead(BUTTON4); 
  val5 = digitalRead(BUTTON5); 
  val6 = digitalRead(BUTTON6); 
  val7 = digitalRead(BUTTON7); 
  //* tutto ok fino qui
  if ((val1 == HIGH) && (vecchio_val1 == LOW)){  
    stato1 = 1 - stato1;  
    delay(10);
  }   
  
  vecchio_val1 = val1;  
  
    if (stato1 == 1) {  
    digitalWrite(LED1, HIGH);
  }  
  else {  
    digitalWrite(LED1, LOW);
    delay(10);
  }
  //*fine pulante1
    if ((val2 == HIGH) && (vecchio_val2 == LOW)){  
    stato2 = 1 - stato2;  
    delay(10);
  }   
  
  vecchio_val2 = val2;  
  
    if (stato2 == 1) {  
    digitalWrite(LED2, HIGH);
  }  
  else {  
    digitalWrite(LED2, LOW);
    delay(10);
  }
  //*fine pulante2
    if ((val3 == HIGH) && (vecchio_val3 == LOW)){  
    stato3 = 1 - stato3;  
    delay(10);
  }   
  
  vecchio_val3 = val3;  
  
    if (stato3 == 1) {  
    digitalWrite(LED3, HIGH);
  }  
  else {  
    digitalWrite(LED3, LOW);
    delay(10);
  }
  //*fine pulante3
    if ((val4 == HIGH) && (vecchio_val4 == LOW)){  
    stato4 = 1 - stato4;  
    delay(10);
  }   
  
  vecchio_val4 = val4;  
  
    if (stato4 == 1) {  
    digitalWrite(LED4, HIGH);
  }  
  else {  
    digitalWrite(LED4, LOW);
    delay(10);
  }
  //*fine pulante4
    if ((val5 == HIGH) && (vecchio_val5 == LOW)){  
    stato5 = 1 - stato5;  
    delay(10);
  }   
  
  vecchio_val5 = val5;  
  
    if (stato5 == 1) {  
    digitalWrite(LED5, HIGH);
  }  
  else {  
    digitalWrite(LED5, LOW);
    delay(10);
  }
  //*fine pulante5
    if ((val6 == HIGH) && (vecchio_val6 == LOW)){  
    stato6 = 1 - stato6;  
    delay(10);
  }   
  
  vecchio_val6 = val6;  
  
    if (stato6 == 1) {  
    digitalWrite(LED6, HIGH);
  }  
  else {  
    digitalWrite(LED6, LOW);
    delay(10);
  }
  //*fine pulante6
    if ((val7 == HIGH) && (vecchio_val7 == LOW)){  
    stato7 = 1 - stato7;  
    delay(10);
  }   
  
  vecchio_val7 = val7;  
  
    if (stato7 == 1) {  
    digitalWrite(LED7, HIGH);
  }  
  else {  
    digitalWrite(LED7, LOW);
    delay(10);
  }
  //*fine pulante7
}

[quote author=uwefed link=topic=93482.msg703142#msg703142 ] Usa le entrate analogiche come Pin digitali e non usare il Pin 0 e 1. [/quote]

PaoloP: Se nel tuo sketch non usi la seriale va bene. Ma se usi la seriale per il debug o passare comandi ad Arduino, non va bene. I pin RX e TX sono 0 e 1. Non puoi usare i pin dal 2 a 9? Hai anche altri sensori attaccati ad arduino?

Non pensavo si potessero usare le entrate analogiche come fossero digitali. ok ci ragiono, grazie!

if (stato1 == 1) {  
    digitalWrite(LED1, HIGH);
  }  
  else {  
    digitalWrite(LED1, LOW);
    delay(10);
  }

puoi semplificarlo in:

digitalWrite(LED1, stato1);

Hai messo delle resistenze pulldown sulle entrate dei pulsanti?

Ciao Uwe

Eccomi! Questo weekend sono stato rapito da mio figlio ma finalmente sono riuscito a rimettere mano alla scheda e al codice.

Allora: il problema riportato in oggetto è dovuto all'uso dei PIN 1 e 2, lo stesso problema non si verifica usando tutti gli altri PIN digitali. Il codice è corretto, ma mi sono dimenticato le resistenze di pulldown (grazie Uwe), ho aggiunto quelle e tutto funziona! :blush:

Ora non mi resta che spostare i pulsanti negli Input analogici (grazie PaoloP) per non usare i PIN 1e2...

Grazie a tutti per le utilissime dritte!!

Gli ingressi analogici possono anche essere usati come digitali. :slight_smile:
I pin sono 0 e 1 e non 1 e 2. ]:smiley:

PaoloP:
Gli ingressi analogici possono anche essere usati come digitali. :slight_smile:
I pin sono 0 e 1 e non 1 e 2. ]:smiley:

Haahahahh si si quello che volevo scrivere :stuck_out_tongue:

Ho pensato di usare solo 4 ingressi analogici e lasciarne 2 per eventuali sensori
Quindi mescolo 4 ingressi analogici e 3 digitali
Per fare ciò ho modificato il codice così:

#define LED1 2
#define BUTTON1 0
#define LED2 3
#define BUTTON2 1
#define LED3 4
#define BUTTON3 2
#define LED4 5
#define BUTTON4 3
#define LED5 6
#define BUTTON5 10
#define LED6 7
#define BUTTON6 11
#define LED7 8
#define BUTTON7 12

int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;
int val2 = 0;
int vecchio_val2 = 0;
int stato2 = 1;
int val3 = 0;
int vecchio_val3 = 0;
int stato3 = 1;
int val4 = 0;
int vecchio_val4 = 0;
int stato4 = 1;
int val5 = 0;
int vecchio_val5 = 0;
int stato5 = 1;
int val6 = 0;
int vecchio_val6 = 0;
int stato6 = 1;
int val7 = 0;
int vecchio_val7 = 0;
int stato7 = 1;
  
void setup() {  
  pinMode(LED1, OUTPUT);  
  pinMode(BUTTON1, INPUT);
  pinMode(LED2, OUTPUT);  
  pinMode(BUTTON2, INPUT);
  pinMode(LED3, OUTPUT);  
  pinMode(BUTTON3, INPUT);
  pinMode(LED4, OUTPUT);  
  pinMode(BUTTON4, INPUT);
  pinMode(LED5, OUTPUT);  
  pinMode(BUTTON5, INPUT);
  pinMode(LED6, OUTPUT);  
  pinMode(BUTTON6, INPUT);
  pinMode(LED7, OUTPUT);  
  pinMode(BUTTON7, INPUT);
}  
  
void loop() {  
  val1 = analogRead(BUTTON1);
  val2 = analogRead(BUTTON2); 
  val3 = analogRead(BUTTON3); 
  val4 = analogRead(BUTTON4); 
  val5 = digitalRead(BUTTON5); 
  val6 = digitalRead(BUTTON6); 
  val7 = digitalRead(BUTTON7); 
  
  if ((val1 > 500) && (vecchio_val1 < 500)){  
    stato1 = 1 - stato1;  
    delay(10);
  }   
  
  vecchio_val1 = val1;  
  
    if (stato1 == 1) {  
    digitalWrite(LED1, HIGH);
  }  
  else {  
    digitalWrite(LED1, LOW);
    delay(10);
  }
  //*fine pulante1
    if ((val2 > 500) && (vecchio_val2 < 500)){ 
    stato2 = 1 - stato2;  
    delay(10);
  }   
  
  vecchio_val2 = val2;  
  
    if (stato2 == 1) {  
    digitalWrite(LED2, HIGH);
  }  
  else {  
    digitalWrite(LED2, LOW);
    delay(10);
  }
  //*fine pulante2
    if ((val3 > 500) && (vecchio_val3 < 500)){ 
    stato3 = 1 - stato3;  
    delay(10);
  }   
  
  vecchio_val3 = val3;  
  
    if (stato3 == 1) {  
    digitalWrite(LED3, HIGH);
  }  
  else {  
    digitalWrite(LED3, LOW);
    delay(10);
  }
  //*fine pulante3
    if ((val4 > 500) && (vecchio_val4 < 500)){ 
    stato4 = 1 - stato4;  
    delay(10);
  }   
  
  vecchio_val4 = val4;  
  
    if (stato4 == 1) {  
    digitalWrite(LED4, HIGH);
  }  
  else {  
    digitalWrite(LED4, LOW);
    delay(10);
  }
  //*fine pulante4
    if ((val5 == HIGH) && (vecchio_val5 == LOW)){  
    stato5 = 1 - stato5;  
    delay(10);
  }   
  
  vecchio_val5 = val5;  
  
    if (stato5 == 1) {  
    digitalWrite(LED5, HIGH);
  }  
  else {  
    digitalWrite(LED5, LOW);
    delay(10);
  }
  //*fine pulante5
    if ((val6 == HIGH) && (vecchio_val6 == LOW)){  
    stato6 = 1 - stato6;  
    delay(10);
  }   
  
  vecchio_val6 = val6;  
  
    if (stato6 == 1) {  
    digitalWrite(LED6, HIGH);
  }  
  else {  
    digitalWrite(LED6, LOW);
    delay(10);
  }
  //*fine pulante6
    if ((val7 == HIGH) && (vecchio_val7 == LOW)){  
    stato7 = 1 - stato7;  
    delay(10);
  }   
  
  vecchio_val7 = val7;  
  
    if (stato7 == 1) {  
    digitalWrite(LED7, HIGH);
  }  
  else {  
    digitalWrite(LED7, LOW);
    delay(10);
  }
  //*fine pulante7
}

Purtroppo mi funziona solo il primo “canale” e gli altri mi creano problemi.
Prima di continuare con il codice (che mi sembra corretto) voglio ultimare la parte hardware altrimenti ho paura di non riuscire a rendermi conto delle modifiche software (per ora sto spostando un pulsante e un relè nella varie uscite e faccio sicuramente qualche casino).

I pin analogici A0 fio A5 se li usi come pin digitali diventano i PIN 14 a 19. Ciao Uwe

uwefed: I pin analogici A0 fio A5 se li usi come pin digitali diventano i PIN 14 a 19. Ciao Uwe

Questa non la sapevo... allora uso sempre digitalRead e cambio i riferimenti ai pin. Grazie 1000!

sí.