Go Down

Topic: Invio dati float (Read 2001 times) previous topic - next topic

Guido_Laferrari

Ciao a tutti,
so che questo argomento se ne è parlato tanto e non so quanti post ho letto. Devo far comunicare una variale ti tipo float fra due Arduino uno, una volta caricati i due sketch leggo correttamente sul display il numero con virgola impostato, subito dopo lo cambio e lo leggo giusto, ma se lo cambio dopo 30/40 secondi il numero sul display non cambia, per vederlo cambiare devo premere il pulsante di reset di Arduino dove è collegato il display. Non riesco capire il perché, ho il sospetto di aver scritto una sequenza errata sullo sketch ricevente.   
Grazie a tutti in anticipo

Invio il numero:

Code: [Select]


#include <SoftwareSerial.h>
float val       = 55.2;
int val_1       = 0;
const int rxpin = 10;                   
const int txpin = 11;                   
SoftwareSerial mySerial(rxpin, txpin);   
//=====================================
void setup() {
  mySerial.begin(9600);                 
  Serial.begin(9600);
}
//====================================
void loop() {
  val_1 = val * 10;
  Serial.println(val_1);
  mySerial.write (val_1 & 0xFF);
  mySerial.write (val_1 >> 8);
  delay (1000);

}



Ricevo il numero:

Code: [Select]


// SDA PIN A4
// SCL PIN A5

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int val         = 0;
float val_1     = 0;
const int rxpin = 10;                   
const int txpin = 11;                   
SoftwareSerial mySerial(rxpin, txpin);   
LiquidCrystal_I2C lcd(0x3F, 20, 4);
//======================================
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);               
  lcd.init();
  lcd.backlight();                     
  lcd.setCursor(0, 0);
  lcd.print("**PROVA  BLUETOOTH**");
  lcd.setCursor(0, 1);
  lcd.print("********************");
}
//=====================================
void loop() {
  if  (mySerial.available() == 2 ) {   
    byte a = mySerial.read();
    Serial.println(a);
    byte b = mySerial.read();
    Serial.println(b);
    val = a + b * 256;
    Serial.println(val);
  }
  val_1 = val * 0.1;
  lcd.setCursor(0, 2);
  lcd.print(val_1);
  delay(1000);
}



ORSO2001

ciao,

il delay(1000) nel ricevente non mi piace...prova ad eliminarlo ed inserisci tutto all'interno di quel:
Code: [Select]
if  (mySerial.available() == 2 )

Guido_Laferrari

Ciao a tutti

grazie ORSO2001 ho provato spostare quel delay ma non ottengo nessun risultato.

grazie docsavage è il dubbio che ho avuto fin dall'inizio,purtroppo non so da che parte iniziare, saresti cosi gentile da darmi una dritta ?

Guido

Guido_Laferrari

Ciao docsavage

ok cerco nei tuoi vecchi post.

Guido

Guido_Laferrari

ok è molto interessante
ci studio sopra,poi ti faccio sapere

Guido

ORSO2001

ciao...senza ombra di dubbio docsavage ne sa mooolto più di me...ma giusto per essere chiari...il delay(1000) dovevi eliminarlo non spostarlo.

Guido_Laferrari

Ciao docsavage
Sto studiando il tuo post, incomincio a comprendere  qualcosa, volevo solo dirti che io non ho bisogno di una variabile float cosi grande, in sostanza dovrei leggere (in un altro locale) il valore di umidità del sensore DHT22 : magari dirò una stupidata ma il meccanismo della ricezione dovrebbe essere lo stesso vero ? 
Guido   

Guido_Laferrari

OK  grazie docsavage

domani posto i due sketch secondo le mie necessità cosi vediamo.

Guido.

Guido_Laferrari

Ciao a tutti

eccomi docsavage come da contratto ti invio i due sketch.
devo assolutamente dire che senza il tuo prezioso aiuto non ce l'avrei mai fatta,è da un paio d'ore che lo sto testando,funziona benissimo  << HAI FATTO DI ME UN PENSIONATO IPER CONTENTO >>. Dato che il sensore restituisce due dati float uno è la temperatura e l'altro è l'umidità vorrei leggerli insieme sul display, appena riesco ( se riesco ) ti invio i due sketch modificati.
Per ora ti saluto e grazie ancora.

Invio:

Code: [Select]

#include <DHT.h>
#include <SoftwareSerial.h>

DHT dht(7, DHT22);                   
const int rxpin = 10;                   
const int txpin = 11;                   
SoftwareSerial mySerial(rxpin, txpin);
   
//======================================
void setup() {
  mySerial.begin(9600);               
  dht.begin();
}
//======================================
void loop() {
  float t = dht.readTemperature();       // Leggo il valore di temperatura
  mySerial.print('#');
  mySerial.print(t);
  mySerial.print('*');
  delay(10000);

}
 

Ricevo:

Code: [Select]


#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
float valore;
float ricevuta  = 0;
float divisore  = 1;
char rx;
byte stato      = 0;         // 0 non in ricezione / 1 in ricezione / 2 in ricezione dopo un punto
const int rxpin = 10;
const int txpin = 11;
SoftwareSerial mySerial(rxpin, txpin);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
//===================================================================================
void setup() {
  mySerial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("**PROVA  BLUETOOTH**");
  lcd.setCursor(0, 1);
  lcd.print("********************");
  lcd.setCursor(0, 2);
  lcd.print("TEMPERATURA ");
}
//===================================================================================
void loop() {
  if (mySerial.available()) {
    rx = mySerial.read();          // Leggo il primo carattere  se è il cancelletto
    if (rx == '#') {               // Comincio la lettura
      stato = 1;
      ricevuta = 0;                // Ricevuta è la variabile di appoggio dove faccio i calcoli
    }
    if (rx == '*') {               // Fine trasmissione
      valore = ricevuta;           // Aggiungo la variabile valore
      stato = 0;
      lcd.setCursor(12, 2);
      lcd.print(ricevuta);
      lcd.print(" ");
      lcd.print("C");
      lcd.print((char)223);
    }
    if (rx == '.') {               // Un punto
      stato = 2;                   // Comincio a contare i decimali
      divisore = 1;
    }
    if (rx <= '9' && rx >= '0') {  // Una cifra
      if (stato == 1) {            // Parte intera
        ricevuta = ricevuta * 10 + rx - '0';// Shiftare di una cifra e aggiungere l'ultima
      }
      if (stato == 2) {
        divisore = divisore * 10;   // Parte decimale
        ricevuta = ricevuta + (rx - '0') / divisore;// Ogni cifra è un decimo della precedente
      }
    }
  }

}





     

Guido_Laferrari

Ciao a tutti

nel pomeriggio ho buttato giù qualcosa ma senza esito
prendo in considerazione il primo caso il secondo è fuori portata
ti ringrazio per la dritta vedo cosa riesco fare
buona serata

Guido

Guido_Laferrari

docsavage quando mi dici

"in alternativa potresti tentare di assegnare marcatore di termine contigui

ovvero che siano tutti uno di seguito all'altro nel codice ASCII

e fare un test omnibus e usare uno switch case"

purtroppo mi metti in seria difficoltà riesco a fare solo lo " switch case"
comunque non ti preoccupare per me è un successo inviare e leggere un solo dato sono contento cosi
ti ringrazio ancora per il tuo disturbo

Guido

Claudio_FF

#11
Oct 05, 2017, 10:09 pm Last Edit: Oct 05, 2017, 10:43 pm by Claudio_FF
Quote from: docsavage
per terminatore = £ si trasmette
Ocio che '£' non è ASCII standard. Per l'op, con il sistema doc sono da usare solo i caratteri stampabili ASCII, che sono solo questi più lo spazio:
Code: [Select]
!"#$%&\'()*+,-./
0123456789
:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\\]^_`
abcdefghijklmnopqrstuvwxyz
{|}~

Oggi mi sento creativo (effetto fine ferie), riconosce sequenze:
<preambolo><tipo><valoreconpunto><terminatore>
come #$3.141* con almeno una cifra prima e dopo il punto, oppure stessa cosa ma con cifre intere senza punto (sempre almeno una cifra):
Code: [Select]
byte  rxBufi = 0;  // indice buffer
char  rxBuf[16];   // buffer ricezione
byte  rxStat = 0;  // stato iniziale ricezione
//--------------------------------------------------------
void setup(){
    Serial.begin(9600);
}
//--------------------------------------------------------
byte transition[7][6] = {
    { 1, 0, 0, 0, 0, 0 },
    { 1, 2, 0, 0, 0, 0 },
    { 1, 0, 3, 0, 0, 0 },
    { 1, 0, 3, 4, 6, 0 },
    { 1, 0, 5, 0, 0, 0 },
    { 1, 0, 5, 0, 6, 0 },
};
//--------------------------------------------------------
byte eventDetect(byte n){
    switch(n)
    {
        case '#': return 0;
        case '$':
        case '&':
        case '?': return 1;
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9': return 2;
        case '.': return 3;
        case '*': return 4;
        default:  return 5;
    }
}
//--------------------------------------------------------
bool ricevuto(){
    if(rxStat == 6) rxStat = 0;
    if(rxStat < 2)  rxBufi = 0;
    if(Serial.available())
    {
        byte c = Serial.read();
        if(c != '*') rxBuf[rxBufi++] = c;
        rxStat = transition[rxStat][eventDetect(c)];
    }
    return rxStat == 6;
}
//--------------------------------------------------------
void loop(){
    if(ricevuto())
    {
        Serial.println(rxBufi);  // quantita` char ricevuti

        for(byte i=0; i<rxBufi; i++) Serial.write(rxBuf[i]);
        Serial.println();
    }
}
//--------------------------------------------------------
* * * * Una domanda ben posta è già mezza risposta * * * *

Guido_Laferrari

Ciao a tutti

docsavage  ho provato a riordinare le idee ed è uscito questo:

INVIO:

Code: [Select]

#include <DHT.h>
#include <SoftwareSerial.h>

DHT dht(7, DHT22);
const int rxpin = 10;
const int txpin = 11;
SoftwareSerial mySerial(rxpin, txpin);

//======================================
void setup() {
  mySerial.begin(9600);
  dht.begin();
}
//======================================
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();   //   Leggo il valore di temperatura
  mySerial.print("#");               // # Comincio la lettura
  delay(50);
  mySerial.print('*');               // * Per temperatura
  mySerial.print(t);                 //   Valore temperatura
  delay(50);
  mySerial.print('+');               // + Per umidita'
  mySerial.print(h);                 //   Valore umidita'
  delay(10000);

}


RICEVO:

Code: [Select]


#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
float temperatura;
float umidita;
float ricevuta    = 0;
float divisore    = 1;
char rx;
byte stato      = 0;    // 0 non in ricezione / 1 in ricezione / 2 in ricezione dopo un punto
const int rxpin = 10;
const int txpin = 11;
SoftwareSerial mySerial(rxpin, txpin);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
//==============================================
void setup() {
  mySerial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("**PROVA  BLUETOOTH**");
  lcd.setCursor(0, 1);
  lcd.print("********************");
  lcd.setCursor(0, 2);
  lcd.print("TEMPERATURA ");
  lcd.setCursor(0, 3);
  lcd.print("UMIDITA'");
}
//==============================================
void loop() {
  if (mySerial.available()) {
    rx = mySerial.read();          // Leggo il primo carattere  se è il cancelletto
    if (rx == '#') {               // Comincio la lettura
      stato = 1;
      ricevuta = 0;                // Ricevuta è la variabile di appoggio dove faccio i calcoli
    }
    if (rx == '*' || rx == '+' ) { // Fine trasmissione
      if (rx == '*') {
        temperatura = ricevuta;    // Aggiorno la temperatura
      }
      if (rx == '+') {
        umidita = ricevuta;        // Aggiorno umidita
      }
      stato = 0;
    }
    if (rx == '.') {               // Un punto
      stato = 2;                   // Comincio a contare i decimali
      divisore = 1;
    }
    if (rx <= '9' && rx >= '0') {  // Una cifra
      if (stato == 1) {            // Parte intera
        ricevuta = ricevuta * 10 + rx - '0';         // Shiftare di una cifra e aggiungere l'ultima
      }
      if (stato == 2) {
        divisore = divisore * 10;   // Parte decimale
        ricevuta = ricevuta + (rx - '0') / divisore; // Ogni cifra è un decimo della precedente
      }
    }
  }
  lcd.setCursor(12, 2);
  lcd.print(temperatura);
  lcd.print(" ");
  lcd.print("C");
  lcd.print((char)223);
  lcd.setCursor(12, 3);
  lcd.print(umidita);
  lcd.print("%");
}








purtroppo l'esito è negativo leggo temperatura  0.00  umidita'  0.50  i decimali dell'umidita' variano

ho la sensazione  che lo sketch INVIO non sia corretto
grazie ancora
Guido

Guido_Laferrari

Ciao a tutti

docsavage  come al solito l'unico compitino che mi hai dato da fare l'ho toppato alla grande , ne devo fare ancora

di strada!!!!!   ti prometto che mi impegnerò di più

comunque ora funziona tutto benissimo

docsavage  non so come ringraziarti sei un GRANDE

Guido 

Go Up