Pages: [1] 2   Go Down
Author Topic: Funzione If che su Arduino Due non Funziona [Problema aggirato]  (Read 1314 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

« Last Edit: January 27, 2013, 01:12:42 pm by deepocean » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21502
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai messo una resistenza pullup 0 pulldown?
Ciao Uwe
« Last Edit: January 26, 2013, 02:35:13 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PinON è settato come Output.  smiley-slim
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21502
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho seguito il tuo consiglio,

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

codice:

Code:
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:
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è?
« Last Edit: January 26, 2013, 06:35:06 pm by UweFederer » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22658
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sempre 0 !!!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22658
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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() {}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22658
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ 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.
 smiley smiley smiley
Logged

Pages: [1] 2   Go Up
Jump to: