Mancato invio di valori di fotoresistenza e termistore

Buongiorno a tutti. Sto sistemando un progetto con Arduino che dovrei portare tra qualche giorno agli esami di stato. Il progetto in sostanza riguarda un'abitazione composta da 4 led (esterni ad essa), 4 led (interni ad essa), una ventola ed un sensore di luminosità ed uno per la temperatura. In pratica io mi interfaccio con arduino mediante il modulo bluetooth HC-05, servendomi di un'applicazione android da me creata. Inoltre io alimento arduino attraverso una batteria da 9v. Il problema, per ora più fastidioso, è quello che se io utilizzo la carica della batteria, quando mi interfaccio, sull'app non ricevo o meglio arduino non invia i valori di fotoresistenza e termistore. Invece, quando esso è collegato mediante il cavo usb (io ho provato inoltre con il monitor seriale per vedere se effettivamente inviava e riceveva), arduino invia tranquillamente i valori, oltre che ricevere i comandi impostati. Ora vorrei sapere se può essere un fattore hardware o software, anche perchè se quando è collegato via usb invia i dati non credo sia un problema dello sketch. Voi che ne pensate? Se ritenete che il problema sia lo sketch ditemelo che ve lo posto. Vi prego di rispondere quanto prima, visto che mancano 8 giorni all'inizio degli esami :disappointed_relieved: . Grazie mille in anticipo.

secondo me hai solo la batteria scarica

Le batterie da 9V di solito hanno una capacità di 5/600mAh, troppo pochi per supportare Arduino con collegate varie periferiche. Prendi un pacchetto di 4 AAA da 1.5V, con il supporto, di solito vanno sui 1200/1300 mAh.

Per supporto intendo questo ![](http://i.ebayimg.com/t/CONTENITORE-PORTA-BATTERIA-PER-BATTERIE-MINI-STILO-TIPO-AAA-4-POSTI-/00/s/MzAzWDMwMA==/$(KGrHqNHJBcE-dPs9M,cBPs9B2ff5w~~60_35.JPG) Di solito hanno l'attacco come le 9V così non devi modificare altro nel tuo circuito.

p.s. Il giorno dell'esame portati anche altre 4 batterie nuove. :grin:

Grazie infatti ho notato che a volte la tensione di Arduino stenta a mantenere, come ad esempio i tre led dei 4 esterni, che tutto ad un tratto riducono la loro intensità come quasi a spegnersi. Comunque giusto per curiosità, come metodo di scrittura, va bene quello da me utilizzato:

void sendData(String message) {
  Serial.println(message);
  char caratteri[message.length()];
  message.toCharArray(caratteri, message.length());
  for (int i = 0; i < message.length(); i++) {
    bluetooth.write(caratteri[i]);
    Serial.write(caratteri[i]);
  }
  bluetooth.write(0xA);
  Serial.write(0xA);
  bluetooth.flush();  
}

Per la batteria vedrò di cambiarla ma dovrò vedere bene con lo spazio in quanto, la stanza che ho affidato ad Arduino non è molto grande…

Sono riuscito a capire qual'era il problema. In pratica capitava spesso (non dipendava da batteria o usb) che quando arrivava un comando ad Arduino, per fargli capire di essere connesso, tale comando arrivava staccato e quindi non riusciva ad interpretare e siccome non aveva ricevuto il comando, egli non inviava nessun valore. Unica cosa che non riesco a comprendere è come mai Arduino invii due volte i valori di temperatura e luminosità, inviando:

temp: 28.39
temp: 28.3
lum: 1023
lum: 102

Elimina in pratica l'ultima cifra al secondo invio, e quindi quello che io ricevo è il secondo non il primo. Il problema secondario sarebbe oltretutto che la fotoresistenza registra sempre lo stesso valore ovvero 1023..

Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Senza vedere il codice è difficile dirti perché l'invio avviene due volte e per giunta troncato. E' probabile che la condizione per l'invio del codice avvenga due volte o è il tuo codice che richiama due volte l'invio dello stesso messaggio.

void sendData(String message) {
  Serial.println(message);
  char caratteri[message.length()+1];
  message.toCharArray(caratteri, message.length()+1);
  for (int i = 0; i < message.length()+1; i++) {
    bluetooth.write(caratteri[i]);
    Serial.write(caratteri[i]);
  }
  bluetooth.write(0xA);
  Serial.write(0xA);
  bluetooth.flush();  
}

Diciamo, che per non far troncare il messaggio ho aumentato di uno l’array che veniva creato solo che invece magari di avere “Hello World”, che in verità mi mandava come “Hello Worl” adesso ottengo "Hello World "… Unica pecca che ancora non riesco a capire come mai è il fatto che la fotoresistenza registra costantemente un valore oscillante tra i 1021 e i 1023… :expressionless:

PaoloP:
Le batterie da 9V di solito hanno una capacità di 5/600mAh, troppo pochi per supportare Arduino con collegate varie periferiche.
Prendi un pacchetto di 4 AAA da 1.5V, con il supporto, di solito vanno sui 1200/1300 mAh.

Se parliamo di batterie alcaline
Sono ca 200mAh per il blocca da 9V e ca 2000mAh per quelli AA.

Ciao Uwe

J_aX95:

void sendData(String message) {

Serial.println(message);
  char caratteri[message.length()+1];
  message.toCharArray(caratteri, message.length()+1);
  for (int i = 0; i < message.length()+1; i++) {
    bluetooth.write(caratteri[i]);
    Serial.write(caratteri[i]);
  }
  bluetooth.write(0xA);
  Serial.write(0xA);
  bluetooth.flush(); 
}



Diciamo, che per non far troncare il messaggio ho aumentato di uno l'array che veniva creato solo che invece magari di avere "Hello World", che in verità mi mandava come "Hello Worl" adesso ottengo "Hello World ".. Unica pecca che ancora non riesco a capire come mai è il fatto che la fotoresistenza registra costantemente un valore oscillante tra i 1021 e i 1023.. :|

Vedere il codice intendiamo TUTTO il codice e non estratti.

Mi sembra strano che tanti non sanno che errore hanno nello sketch, ma sanno benissimo che si trova in una certa porzione dello sketch.

Ciao Uwe

Si scusate XD… Comunque per chiarimenti non esitate a chiedere. Cose strane come quel “false” o “true” tra virgolette rappresentate da String o non boolean è perchè nel momento in cui venivano mandati/ricevuti, i boolean non venivano mandati a differenza delle stringhe.

#include <SoftwareSerial.h>
 
int bluetoothTx = 0;
int bluetoothRx = 1;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

//Led interni alla casa
int ledInterno_1 = 3;
int ledInterno_2 = 4;
int ledInterno_3 = 5;
int ledInterno_4 = 6;

//Led esterni alla casa
int ledEsterno_1 = 9;
int ledEsterno_2 = 10;
int ledEsterno_3 = 11;
int ledEsterno_4 = 12;

int fan = 8;
int fotoresistenza = A4;
int termistore = A5;

String ledEsterni = "false";
String ledInterni = "false";
String fanStato = "false";

int tempFIX = 28;
int lumFIX = 800;
 
void setup() 
{ 
  Serial.begin(9600);
  setupBluetooth();
  pinMode(ledInterno_1, OUTPUT);
  pinMode(ledInterno_2, OUTPUT);
  pinMode(ledInterno_3, OUTPUT);
  pinMode(ledInterno_4, OUTPUT);
  pinMode(ledEsterno_1, OUTPUT);
  pinMode(ledEsterno_2, OUTPUT);
  pinMode(ledEsterno_3, OUTPUT);
  pinMode(ledEsterno_4, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(fotoresistenza, INPUT);
  pinMode(termistore, INPUT);
} 

unsigned char c;
char comando[20] = {};
String string = "";
String str_lum = "";
String str_tem = "";
int ind = 0;
int invia = 1000;
int val_lum = 0;
double val_tem = 0;
String isConnected = "false";
boolean started = false;

void loop() {
  readData();
  if(isConnected=="true"){
    if(invia==1000){
      val_lum = analogRead(fotoresistenza);
      val_tem = (5.0 * analogRead(termistore) * 100.0)/1024.0;
      str_tem = "t"+doubleToString(val_tem);
      str_lum = "v"+String(val_lum);
      sendData(str_tem);
      sendData(str_lum);
      if(started){
        sendData("i"+ledInterni);
        sendData("e"+ledEsterni);
        sendData("f"+fanStato);
        started = false;
      }
      invia = 0;
    }
    invia++;
  }else{
    autoManagment();
  }
}

void sendData(String message) {
  Serial.println(message);
  char caratteri[message.length()+1];
  message.toCharArray(caratteri, message.length()+1);
  for (int i = 0; i < message.length()+1; i++) {
    bluetooth.write(caratteri[i]);
    Serial.write(caratteri[i]);
  }
  bluetooth.write(0xA);
  Serial.write(0xA);
  bluetooth.flush();  
} 

void readData(){
  while (bluetooth.available()) {
    c = bluetooth.read();
    if(c != 0x9 && c != 0xA && c != 0xC && c != 0xD){
      comando[ind] = c;
      ind++;
    }
  }
    
  for(int i=0; i<ind; i++){
    string+=comando[i];
  }
  
  Serial.println(string);
  
  char comando[20] = {};
  if(string.equals("lampOn_EXT")){
    digitalWrite(ledEsterno_1, HIGH);
    digitalWrite(ledEsterno_2, HIGH);
    digitalWrite(ledEsterno_3, HIGH);
    digitalWrite(ledEsterno_4, HIGH);
    ledEsterni = "true";
  }else if(string.equals("lampOff_EXT")){
    digitalWrite(ledEsterno_1, LOW);
    digitalWrite(ledEsterno_2, LOW);
    digitalWrite(ledEsterno_3, LOW);
    digitalWrite(ledEsterno_4, LOW);
    ledEsterni = "false";
  }else if(string.equals("lampOn_INT")){
    digitalWrite(ledInterno_1, HIGH);
    digitalWrite(ledInterno_2, HIGH);
    digitalWrite(ledInterno_3, HIGH);
    digitalWrite(ledInterno_4, HIGH);
    ledInterni = "true";
  }else if(string.equals("lampOff_INT")){
    digitalWrite(ledInterno_1, LOW);
    digitalWrite(ledInterno_2, LOW);
    digitalWrite(ledInterno_3, LOW);
    digitalWrite(ledInterno_4, LOW);
    ledInterni = "false";
  }else if(string.equals("fanOn")){
    digitalWrite(fan, HIGH);
    fanStato = "true";
  }else if(string.equals("fanOff")){
    digitalWrite(fan, LOW);
    fanStato = "false";
  }else if(string.equals("isConnected")){
    isConnected = "true";
    started = true;
  }else if(string.equals("disconnected")){
    isConnected = "false";
    started = false;
     comando[20] = {};
    invia = 1000;
    string = "";
    str_lum = "";
    str_tem = "";
    ind = 0;
    invia = 1000;
    val_lum = 0;  
    val_tem = 0;
  }
  
  string = "";
  ind = 0;
}
 
void setupBluetooth() {
  bluetooth.begin(115200);
  bluetooth.print("$$");
  delay(100);
  bluetooth.println("U,9600,N");
  bluetooth.begin(9600);
}

String doubleToString(double input){
  String str = String((int)(input*pow(10,2)));
  return str.substring(0, str.length()-2) + "." + str.substring(str.length()-2);
}

void autoManagment(){
   val_lum = analogRead(fotoresistenza);
   val_tem = (5.0 * analogRead(termistore) * 100.0)/1024.0;
   if(val_lum >= lumFIX){
     digitalWrite(ledEsterno_1, HIGH);
     digitalWrite(ledEsterno_2, HIGH);
     digitalWrite(ledEsterno_3, HIGH);
     digitalWrite(ledEsterno_4, HIGH);
     ledEsterni = "true";
   }else if(val_lum < lumFIX){
     digitalWrite(ledEsterno_1, LOW);
     digitalWrite(ledEsterno_2, LOW);
     digitalWrite(ledEsterno_3, LOW);
     digitalWrite(ledEsterno_4, LOW);
     ledEsterni = "false";
   }
    
   if(val_tem >= tempFIX){
     digitalWrite(fan, HIGH);
     fanStato = "true";
   }else if(val_tem < tempFIX){
     digitalWrite(fan, LOW);
     fanStato = "false";
   }
}

Novità? Posso aggiungere una domanda? Secondo voi come diamine è possibile che appena mi sono alzato quel cavolo ti termistore ha deciso così per suo volere di iniziare a inviarmi valori tra i -175° e i -160°??

J_aX95:
…Comunque per chiarimenti non esitate a chiedere. Cose strane come quel “false” o “true” tra virgolette rappresentate da String o non boolean è perchè nel momento in cui venivano mandati/ricevuti, i boolean non venivano mandati a differenza delle stringhe.

Io ti suggerirei di evitare quel false/true fatti con String, sono molto pesanti. Puoi usare i boolean e poi se devi spedirli basta una if:

if( fanStato ) 
  Serial.print("Vero");
else
  Serial.print("Falso");

J_aX95: Novità? Posso aggiungere una domanda? Secondo voi come diamine è possibile che appena mi sono alzato quel cavolo ti termistore ha deciso così per suo volere di iniziare a inviarmi valori tra i -175° e i -160°??

Falso contatto? piedino sfilato dalla breadboard/connettore? Ciao Uwe

E per quanto riguarda la fotoresistenza come mai acquisisce valori da 1021 a 1023??

l’hai messa una resistenza, come in figura ?

fotores.png

Certamente! Ora non ricordo però di quanto sia la resistenza messa :/... In caso di quanto deve essere? Forse ho messo una 10k

dipende da che fotoresistenza hai, comunque 10K va' anche bene. Pero' c'e' qualche collegamento errato, visto che se legge 1023 vuol dire che su quel pin c'e' sempre 5V

Dopo aver effettuato dei controlli con il tester sono giunto alla conclusione che il termistore sia andato, in quanto arriva la tensione ma dal piedino andante alla porta logica di Arduino non passa nessun valore. Invece per quanto riguarda la fotoresistenza mi sono reso conto che nel momento in cui saldai i cavi, malauguratamente ho scambiato il cavo della VCC con il cavo destinato alla porta logica di Arduino. Piccolo inconveniente.. non trovo un termistore :fearful: