Go Down

Topic: Funzione If che su Arduino Due non Funziona [Problema aggirato] (Read 1 time) previous topic - next topic

deepocean

Jan 26, 2013, 08:29 pm Last Edit: Jan 27, 2013, 07:12 pm by deepocean Reason: 1
Ciao,

riuscite a spiegarmi questo mistero??????

Premetto che sono sicuro di sbagliare io........ ma su Auduino Uno funziona e sul Due no.

Ho semplificato un pochino lo sketch prendendo solo la parte che non funziona,
in pratica l' if (digitalRead(pinON) == HIGH && digitalRead(pinFlussom) == HIGH)
con Arduino Due non va.

Forse va scritto in un altro modo??? io sono giorni che cerco la soluzione e non mi riesce di trovarla.
Si accettano suggerimenti.

int pinValvola=9;     //Pin rele' valvola a tre vie
int pinFlussom=7;     //Pin Flussometro
int pinON= 2;        //Pin Accensione

void setup()
{
pinMode(pinFlussom, INPUT);      // inizializza pin digitale come Input
pinMode(pinValvola, OUTPUT);     // inizializza pin digitale come Output
pinMode(pinON, OUTPUT);          // inizializza pin digitale come Output

}
void loop()
{
 
   digitalWrite(pinON, HIGH);
   if (digitalRead(pinON) == HIGH && digitalRead(pinFlussom) == HIGH)
   {
     digitalWrite(pinValvola, HIGH);

   }
   else {

     digitalWrite(pinValvola, LOW);
   }  
}

Approfitto per rigraziare tutti perchè leggendo il Forum ho imparato tantissimo.


uwefed

#1
Jan 26, 2013, 08:33 pm Last Edit: Jan 26, 2013, 08:35 pm by uwefed Reason: 1
Hai messo una resistenza pullup 0 pulldown?
Ciao Uwe

deepocean

Si, la resistenza c'è.

Aggiungo che se scrivo if (digitalRead(pinFlussom) == HIGH) funziona anche su Arduino Due.
Ma mi serve fare il controllo anche sul pinON.

Grazie

PaoloP


deepocean

Si, il tutto fa parte di un codice che tramite una pagina web  tramite pinON accende una stufa a pellet.

BrainBooster

Ma se è un output sei tu che lo setti e quindi sai sempre lo stato del pin

deepocean

c'è tutta una parte del codice che controlla lo stato di pinOn in funzione della temperatura della casa, mentre il pinValvola si deve attivare quando pinFlussometro passa ad HIGH per permettere la produzione dell'acqua calda sanitaria ma questo puo avvenire solo se la il pinON è HIGH

uwefed


Ma se è un output sei tu che lo setti e quindi sai sempre lo stato del pin

@BrainBooster
Sí é vero ma non é sbagliato leggere lo stato di un uscita.
@deepocean
Hai provato di stampare sulla seriale lo stato delle 2 letture
digitalRead(pinON) e digitalRead(pinFlussom)?
Ciao Uwe

deepocean

#8
Jan 26, 2013, 10:52 pm Last Edit: Jan 27, 2013, 12:35 am by UweFederer Reason: 1
Ho seguito il tuo consiglio,

e verificando sulla seriale il digitalRead(pinON) è sempre a low.

codice:

Code: [Select]
int pinValvola=9;     //Pin rele' valvola a tre vie
int pinFlussom=7;     //Pin Flussometro
int pinON= 2;        //Pin Accenzione

void setup()
{
Serial.begin(9600);
pinMode(pinFlussom, INPUT);      // inizializza pin digitale come Input
pinMode(pinValvola, OUTPUT);     // inizializza pin digitale come Output
pinMode(pinON, OUTPUT);          // inizializza pin digitale come Output

}
void loop()
{
 
   digitalWrite(pinON, HIGH);
   if (digitalRead(pinON) == HIGH && digitalRead(pinFlussom) == HIGH)
   {
     digitalWrite(pinValvola, HIGH);

   }
   else {

     digitalWrite(pinValvola, LOW);
   }  

Serial.println(" ");
Serial.print("Stato pinFlussom ") and Serial.println(digitalRead(pinFlussom), DEC);
Serial.print("Stato pin ON ") and Serial.println(digitalRead(pinON), DEC);
Serial.print("Stato pinValvola ") and Serial.println(digitalRead(pinValvola), DEC);
delay(1000);
}



risultato sulla seriale con pinFlussom a 0 :

Stato pinFlussom 0
Stato pin ON 0
Stato pinValvola 0

risultato sulla seriale con pinFlussom a 1 :

Stato pinFlussom 1
Stato pin ON 0
Stato pinValvola 0


codice modificato nella funzione if :


Code: [Select]
int pinValvola=9;     //Pin rele' valvola a tre vie
int pinFlussom=7;     //Pin Flussometro
int pinON= 2;        //Pin Accenzione

void setup()
{
Serial.begin(9600);
pinMode(pinFlussom, INPUT);      // inizializza pin digitale come Input
pinMode(pinValvola, OUTPUT);     // inizializza pin digitale come Output
pinMode(pinON, OUTPUT);          // inizializza pin digitale come Output

}
void loop()
{
 
   digitalWrite(pinON, HIGH);
   if (digitalRead(pinFlussom) == HIGH)
   {
     digitalWrite(pinValvola, HIGH);

   }
   else {

     digitalWrite(pinValvola, LOW);
   }  

Serial.println(" ");
Serial.print("Stato pinFlussom ") and Serial.println(digitalRead(pinFlussom), DEC);
Serial.print("Stato pin ON ") and Serial.println(digitalRead(pinON), DEC);
Serial.print("Stato pinValvola ") and Serial.println(digitalRead(pinValvola), DEC);
delay(1000);
}



risultato sulla seriale con pinFlussom a 0 :

Stato pinFlussom 0
Stato pin ON 0
Stato pinValvola 0

risultato sulla seriale con pinFlussom a 1 :

Stato pinFlussom 1
Stato pin ON 0
Stato pinValvola 1


quindi non legge lo stato di pinON !!!

e siccome anche pinValvola e un output non mi spiego il perchè?

leo72

Andiamo per gradi. Sembra che l'errore derivi da una incapacità del SAM3X di leggere lo stato di un proprio pin.
Escludiamo quindi questo problema con un test semplicissimo:

Code: [Select]
byte pinON= 2;        //Pin AccenSione :-P
void setup() {
  delay(2000); 
  Serial.begin(9600);
  pinMode(pinON, OUTPUT);         
  digitalWrite(pinON, HIGH);
  Serial.println(digitalRead(pinON), DEC);
}

void loop() {}

Che dice?


leo72


sempre 0 !!!

Ok. Quindi il SAM3X non è capace di leggere lo stato dei suoi pin, secondo il tuo test...

Ora guarderò il datasheet, nel frattempo devi solo implementare una semplice variabile di tipo boolean in cui memorizzare lo stato di quel pin, tutto lì.
Quindi, tutte le volte che metti HIGH il pin pinON, farai:
digitalWrite(pinON, HIGH);
stato_pinON = HIGH;

e tutte le volte che metti il pin su LOW farai:
digitalWrite(pinON, LOW);
stato_pinON = LOW;

Il controllo diventa:
if (stato_pinON == HIGH && digitalRead(pinFlussom) == HIGH)

deepocean

nel post precedente se vedi i risultati sulla seriale legge sia quello dei pinValvola che quello di pinFlussom,
ora prendendo il tuo codice ho fatto la prova sul pin 9 (pinValvola) e come risultato da 0
Code: [Select]

byte pinON= 9;      //Pin Accen[u]S[/u]ione .... :-P 
void setup() {
  delay(2000); 
  Serial.begin(9600);
  pinMode(pinON, OUTPUT);         
  digitalWrite(pinON, HIGH);
  Serial.println(digitalRead(pinON), DEC);
}

void loop() {}

leo72

PS:
che poi non credo sia un limite del chip ma più del core.

deepocean

@ leo72

Quindi, tutte le volte che metti HIGH il pin pinON, farai:
digitalWrite(pinON, HIGH);
stato_pinON = HIGH;

e tutte le volte che metti il pin su LOW farai:
digitalWrite(pinON, LOW);
stato_pinON = LOW;

Il controllo diventa:
if (stato_pinON == HIGH && digitalRead(pinFlussom) == HIGH)

si mangia un po di memoria ma cmq funziona e si aggira il problema.
:) :) :)

Go Up