Pages: [1] 2   Go Down
Author Topic: trasmissione di n.5 temperature tra 2 Arduino 1  (Read 2581 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricollegandomi al topic creato da me in precedenza http://arduino.cc/forum/index.php/topic,123032.0.html
In pratica ho usato un Arduino A per leggere n.5 temperature in gradi C° per controllare una caldaia con bollitore e un Arduino B ( per mancanza di pin ) con ethernet shield per trasmettere i dati in tempo reale su un server remoto...
Ora la comunicazione delle 5 temperature  T1,T2,T3,T4,T5 potrei farla collegando l'Arduino A con l'Arduino B solo in due modi in base  ai pin che ho a disposizione :

-Modo 1 : collegando i pin tx1 e rx0 tra di loro invertiti ( ma dovrei rinunciare alla seriale per il debug da pc )
-Modo 2 : collegando 2 pin digitali tra di loro usando la libreria newsoftserial

A questo punto viene per me  il difficile...come elaborare gli sketch per trasmettere i dati analogici di temperatura dall'Arduino A all'Arduino B in modo tale che poi  ( e quello lo sò fare ) l'Arduino B con il metodo clientPrintln possa inviare i dati a Pachube-Cosm oppure a un Google Spreadsheet...

Mi rimane difficile capire con quale metodo inviare i dati da Arduino A a Arduino B con una cadenza temporale di 4-5 minuti ...char,stringhe,byte oppure altro ???
Per favore senza un esempio di sketch su qui lavorarci e adattare le mie esigenze sono perso nel vuoto ....Grazie
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma perchè devi utilizzare per forza due arduino? non puoi usarne uno unico per leggere i dati e poi inviarli?

Li invii con l'ethernet?

Per quanto riguarda l'invio ogni tot secondi basta che usi o una delay() oppure millis().

Code:

#define interval 300  //Intervallo di tempo
long previousMills = 0;  //Memorizza l'ultima volta che ho inviato un dato

void setup(){
     ...
}

void loop()
{
     if (millis() -  previousMills > interval ){
         previousMills = millis();  //Tiene in memoria l'ultimo invio

         //invio dati
     }
}
« Last Edit: September 22, 2012, 06:29:41 am by mancio » Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ma perchè devi utilizzare per forza due arduino? non puoi usarne uno unico per leggere i dati e poi inviarli?

Di solito ad un topic io personalmente non rispondo con un'altra domanda...ti rispondo che purtroppo ho i pin dell'Arduino A   TUTTI USATI tranne i PIN 0,1, e altri due digitali che mi sono lasciati liberi per la seriale emulata ...
Quote
In pratica ho usato un Arduino A per leggere n.5 temperature in gradi C° per controllare una caldaia con bollitore e un Arduino B ( per mancanza di pin ) con ethernet shield

Ora per non confondere gli altri ripeto ancora una volta che avrei bisogno di inviare 5 valori di temperatura da un'arduino A (al quale non è possibile inserire una ethernet shield per mancanza di PIN) ad un'altro Arduino B i quali comunicano con i piedini 0 Rx e 1 Tx tra di loro oppure ancora meglio con due pin rimasti liberi dell'Arduino A ( pin 8 e pin 9) e altri due a scelta dell'Arduino B tramite porta seriale emulata via software...

Una volta spediti lo sketch dell'Arduino B dovrebbe riconoscere i 5 valori e catalogarli come T1,T2,T3,T4,T5 e poi spedirli tramite ethernet shield sulla rete WEB al sito Pachube...
Per favore teste geniali mi sapete aiutare ??!! Grazieeee
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1308
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Caro Pietro,
l'amico mancio voleva solo aiutarti... non prendertela se non risponde come desideri.

Per rispondere alla tua domanda, questi i miei consigli:
1 - usa la SoftwareSerial che è standard con l'IDE 1.0.1 (la newSoftSerial forse ha qualcosa in più, ma non è standard!) così ti riservi il pin 0 ed 1 per comunicare con Arduino A ed Arduino B;
2 - usa per SoftwareSerial una velocità sostenuta (superiore a 9600 baud) in modo da ridurre i tempi e facilitare la comunicazione;
3 - usa la classe String e la sua funzione (non documentata) .toInt() per convertire in numero la stringa ricevuta;
4 - usa il SerialAux.print(Temp, x) per trasmettere i dati ove SerialAux è la porta virtuale, Temp è il float della temeperatura e x (opzionale) è il numero di cifre dopo la virgola;
5 - per il timer di invio dati fai in questo modo sull'Arduino A:
Code:
#include <SoftwareSerial.h>                          // libreria creazione porta seriale virtuale

byte Decimali = 1;                                   // numero decimali
unsigned long Timer = millis();                      // timer partito
const unsigned long TimeOut = 240000;                // tempo di invio dati in ms (4 min = 4*60*1000)

void setup() {
  Serial.begin(9600);                                // inizializza porta seriale
  SerialAux.begin(9600);                             // inizializza porta seriale ausiliaria
}

void loop() {
  if (millis() - Timer > TimeOut) {
  SerialAux.println(Temp1, Decimali);
  SerialAux.println(Temp2, Decimali);
  SerialAux.println(Temp3, Decimali);
  SerialAux.println(Temp4, Decimali);
  SerialAux.println(Temp5, Decimali);
    Timer  = millis();                               // timer resettato
  }
}

... e quest'altro su Arduino B
Code:
#include <SoftwareSerial.h>                          // libreria creazione porta seriale virtuale

int I = 0;
int J = 0;
String Z = "";

String SerRx = "";                                   // azzera buffer ricezione
const unsigned long TimeOut = 1000;                  // timeout 1 s
unsigned long Timer = millis();                      // timer partito

void setup() {
  Serial.begin(9600);                                // inizializza porta seriale
  SerialAux.begin(9600);                             // inizializza porta seriale ausiliaria
}

void loop() {

  SerRx = "";                                        // azzera buffer ricezione
  Timer = millis();                                  // timer partito

  while (millis() - Timer < TimeOut) {               // attesa timeout
    while (SerialAux.available() > 0) {              // ricezione da modulo
      SerTx += char(SerialAux.read());               // aggiungi carattere al buffer         
      Timer = millis();                              // reset timer
    }
  }

  if (SerRx.length() > 0) {                          // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
    J = 0;
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp1 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp2 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp3 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp4 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp5 = Z.toInt();
    }
  }
}

Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Complimenti Cyberhs...accidenti che sketch complicato....
Vediamo di capirci un pò e intanto grazie tante perchè così ho qualcosa su cui lavorare...


Code:
#include <SoftwareSerial.h>                          // libreria creazione porta seriale virtuale

byte Decimali = 1;                                   // numero decimali
unsigned long Timer = millis();                      // timer partito
const unsigned long TimeOut = 240000;                // tempo di invio dati in ms (4 min = 4*60*1000)

void setup() {
  Serial.begin(9600);                                // inizializza porta seriale
  SerialAux.begin(9600);                             // inizializza porta seriale ausiliaria
}

void loop() {
  if (millis() - Timer > TimeOut) {
  SerialAux.println(Temp1, Decimali);
  SerialAux.println(Temp2, Decimali);
  SerialAux.println(Temp3, Decimali);
  SerialAux.println(Temp4, Decimali);
  SerialAux.println(Temp5, Decimali);
    Timer  = millis();                               // timer resettato
  }
}

-Sugli sketch che mi ha postato Cyberhs non vedo la funzione che indica e programma i Pin da usare per la SoftwareSerial e li aggiungo;
-Per "Decimali" intendo che voglia intendere di mettere un numero tipo 1 o 2 che indica il numero di cifre dopo la virgola;
In questo sketch diciamo che ho quasi capito tutto e ti ringrazio ancora mille volte Cyberhs...

Code:
#include <SoftwareSerial.h>                          // libreria creazione porta seriale virtuale

int I = 0;
int J = 0;
String Z = "";

String SerRx = "";                                   // azzera buffer ricezione
const unsigned long TimeOut = 1000;                  // timeout 1 s
unsigned long Timer = millis();                      // timer partito

void setup() {
  Serial.begin(9600);                                // inizializza porta seriale
  SerialAux.begin(9600);                             // inizializza porta seriale ausiliaria
}

void loop() {

  SerRx = "";                                        // azzera buffer ricezione
  Timer = millis();                                  // timer partito

  while (millis() - Timer < TimeOut) {               // attesa timeout
    while (SerialAux.available() > 0) {              // ricezione da modulo
      SerTx += char(SerialAux.read());               // aggiungi carattere al buffer         
      Timer = millis();                              // reset timer
    }
  }

  if (SerRx.length() > 0) {                          // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
    J = 0;
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp1 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp2 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp3 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp4 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I)                      // sotto stringa dal carattere J al carattere I-1
      Temp5 = Z.toInt();
    }
  }
}


Ecco qui nel secondo Sketch ovvero l'Arduino che riceve i dati a dire il vero non mi è chiaro quasi niente...
-la funzione toInt è abbastanza complessa e ora ci studio un pò sopra per riuscire a capire le dinamiche di questa funzione...
-Poi non ho capito bene cosa sono i caratteri CR (carriage return) e LF...studierò anche su questo e intanto provo i due sketch...

Grazie tantissimo...
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1308
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ovviamente non ho inserito tutto (altrimenti non hai modo di divertirti  smiley-grin)

Le temperature vengono inviate con il serial.println() quindi aggiungono al valore numerico/stringa un carriage return ed un line feed.

Perciò il modulo B riceverà l'intera stringa composta ad esempio da: 50.9<CR><LF>65.1<CR><LF>45.0<CR><LF>70.5<CR><LF>92.3<CR><LF>
Il modulo B deve anche trasformare separare ogni singola stringa e convertirla in valore: a questo scopo intervengono le funzioni indexof(), substring() e toInt().

E' solo una bozza di quello che si dovrebbe fare e probabilmente si potrebbe fare meglio, ma per cominciare va bene.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6984
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi usare la libreria EasyTransfer.
--> http://arduino.cc/blog/category/languages/libraries/easytransfer/ --> http://www.billporter.info/easytransfer-arduino-library/ --> https://github.com/madsci1016/Arduino-EasyTransfer
Logged

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

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, forse per poca elasticitá mentale, io fisserei dei ruoli.  Vengo e mi spiego. In generale, se A invia ogni tot dei dati a B senza consultarlo, non è detto che B sia pronto per trattarli. Visto che B è quello che gestisce la comunicazione verso l'esterno, e sa quando può o meno fare il push, credo debba essere lui a richiedere i dati. B fa da master e A da slave. Se per esempio B non ha connessione verso l'esterno, può decidere di non chiedere dati ad A, o di chiederli e memorizzarli, su sd per esempio, per poi pusharli qundo torna la connessione. Che ne pensi? Ti sembra una via percorribile per la tua applicazione?
N.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 1
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, sono d'accordo con Superp anche se in modo inverso, considerando Arduino_A come un master e usando il B come una periferica, comunque questi due modi hanno senso se l'applicazione deve avere un livello di affidabilità alto, se no corri il rischio di scrivere un sacco di codice.
Facendo conto che l'applicazione ha un altro livello di affidabilità, e vista la scarsa disponibilità di pin su Arduino_A la SD potresti metterla su Arduino_B, questo non ti aiuta perché se capita di non avere connessione seriare tra A e B questa dovrà essere gestita.

Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ottime osservazioni...nel frattempo stò smanettando con quello che ho...
L'affidabilità del sistema alla fine è solo a livelli statistici...ovvero a fine giornata riesco a osservare l'andamento delle temperature interne al bollitore e alla caldaia al variare della temperatura esterna e in qualche modo tengo sotto osservazione i consumi ...

Quote
Ciao, forse per poca elasticitá mentale, io fisserei dei ruoli.  Vengo e mi spiego. In generale, se A invia ogni tot dei dati a B senza consultarlo, non è detto che B sia pronto per trattarli. Visto che B è quello che gestisce la comunicazione verso l'esterno, e sa quando può o meno fare il push, credo debba essere lui a richiedere i dati. B fa da master e A da slave. Se per esempio B non ha connessione verso l'esterno, può decidere di non chiedere dati ad A, o di chiederli e memorizzarli, su sd per esempio, per poi pusharli qundo torna la connessione. Che ne pensi? Ti sembra una via percorribile per la tua applicazione?

Ora per fare il controllo chiaramente io non avrei la più pallida idea da dove cominciare...è apprezzabile il fatto che magari quando non c'è connessione ethernet sull'Arduino B sia utile il fatto di scrivere il tutto su Scheda sd ma non avrei a quel punto data e ora e quindi a questo punto mi sevirebbe un RTC e le cose si complicano...

Chi comincia col dare un'idea di come fare  il controllo ???
Alla fine se perdessi alcuni dati (per assurdo anche un'ora senza rete web) non sarebbe un dramma...l'importante è che io riesca ad avere in linea di massima un buon colloquio seriale ( e su questo i due arduini sono collegati con 20cm di fili tra loro) con una percentuale di trasmissioni a buon fine dell' 80% ...mi acconteterei...

Il ragionamento è un'allenamento per la mente e una virtù per l'uomo...
Logged

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

1 - usa la SoftwareSerial che è standard con l'IDE 1.0.1 (la newSoftSerial forse ha qualcosa in più, ma non è standard!)
Giusto per correttezza d'informazione, la SoftwareSerial della versione 1.0.1 è la NewSoftSerial  smiley-wink
Vista la bontà della NewSoftSerial, la vecchia SoftSerial, che era bloccante perché non basata su interrupt, è stata sostituita dalla NewSoftSerial. Si vede anche aprendo il file /libraries/SoftwareSerial/SoftwareSerial.h dove si legge in cima:
Quote
SoftwareSerial.h (formerly NewSoftSerial.h) -
Logged


Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

EEEHHHH vai  funziona tutto...
Grazie a tutti ma un grazie particolare a Cyberhs...
Ho riscritto gli sketch e li ho modificati per il mio uso...

Codice per Arduino A in trasmissione

Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

byte Decimali = 1;                                   // numero decimali
unsigned long Timer = millis();                      // timer partito
const unsigned long TimeOut = 5000;// tempo di invio dati in ms (4 min = 4*60*1000)                     
int Temp1=0 ;     //dichiarazione della variabile Temp1
int Temp2=0 ;     //dichiarazione della variabile Temp2
int Temp3=0 ;     //dichiarazione della variabile Temp3
int Temp4=0 ;     //dichiarazione della variabile Temp4
int Temp5=0 ;     //dichiarazione della variabile Temp5



void setup()  {
 
  Serial.begin(9600);
  Serial.println("seriale tx inizio");
 
  mySerial.begin(19200);
  mySerial.println("seriale virtuale tx inizio");
 
}

void loop() {
  if (millis() - Timer > TimeOut) {
   
  Temp1 = analogRead(A0);
  Temp2 = analogRead(A1);
  Temp3 = analogRead(A2);
  Temp4 = analogRead(A3);
  Temp5 = analogRead(A4);
 
  Serial.println(Temp1, Decimali);
  Serial.println(Temp2, Decimali);
  Serial.println(Temp3, Decimali);
  Serial.println(Temp4, Decimali);
  Serial.println(Temp5, Decimali);
 
  mySerial.println(Temp1, Decimali);
  mySerial.println(Temp2, Decimali);
  mySerial.println(Temp3, Decimali);
  mySerial.println(Temp4, Decimali);
  mySerial.println(Temp5, Decimali);
    Timer  = millis();                               // timer resettato
  }
}
 
 
 

Codice per Arduino B in ricezione

Code:
#include <SoftwareSerial.h> // libreria creazione porta seriale virtuale

SoftwareSerial mySerial(2, 3); // RX, TX

int I = 0;
int J = 0;
String Z = "";
byte Decimali = 1; 

String SerRx = "";                                   // azzera buffer ricezione
const unsigned long TimeOut = 5000;                  // timeout 1 s
unsigned long Timer = millis();// timer partito

int Temp1=0 ;
int Temp2=0 ;
int Temp3=0 ;
int Temp4=0 ;
int Temp5=0 ;

void setup() {
  Serial.begin(9600);  // inizializza porta seriale
  Serial.println("seriale rx inizio");
  mySerial.begin(19200);
  mySerial.println("seriale virtuale rx inizio");                             // inizializza porta seriale ausiliaria
}

void loop() {

  SerRx = "";                                        // azzera buffer ricezione
  Timer = millis();                                  // timer partito

  while (millis() - Timer < TimeOut) {               // attesa timeout
    while (mySerial.available() > 0) {              // ricezione da modulo
      SerRx += char(mySerial.read());               // aggiungi carattere al buffer         
      Timer = millis();                              // reset timer
    }
  }

  if (SerRx.length() > 0) {                          // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
    J = 0;
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp1 = Z.toInt();
      J = I + 2;       // nuova posizione di ricerca
      mySerial.println(Temp1, Decimali);
      Serial.print("Temp1 = ");
      Serial.println(Temp1, Decimali);
     
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp2 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp2, Decimali);
      Serial.print("Temp2 = ");
      Serial.println(Temp2, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp3 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp3, Decimali);
      Serial.print("Temp3 = ");
      Serial.println(Temp3, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp4 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp4, Decimali);
      Serial.print("Temp4 = ");
      Serial.println(Temp4, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp5 = Z.toInt();
      mySerial.println(Temp5, Decimali);
      Serial.print("Temp5 = ");
      Serial.println(Temp5, Decimali);
    }
  }
}

In ricezione sulla seriale dell'Ide di Arduino B ricevo perfettamente i 5 valori di temperatura per il momento sotto forma di variabile intera ma mi và bene anche così....sono contentissimo...
E ora passiamo alla parte forse ancora più difficile:mandare i dati sul sito Pachube-COSM...
Ora però vado a nanna...

Logged

Milan
Offline Offline
Sr. Member
****
Karma: 0
Posts: 375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate si mi inserisco qui con domande che si distaccano un po dalle mie, ma è il post piu simile e alcuni mi hanno detto che c'era già questo post simile.
Voglio fare dei test usando solo il serial monitor.
Ho riadattato il programma del ricevente B in modo che lavori solo su serial.

Code:
int I = 0;
int J = 0;
String Z = "";
byte Decimali = 1; 

String SerRx = "";                                   // azzera buffer ricezione
const unsigned long TimeOut = 5000;                  // timeout 1 s
unsigned long Timer = millis();// timer partito

int Temp1=0 ;
int Temp2=0 ;
int Temp3=0 ;
int Temp4=0 ;
int Temp5=0 ;

void setup() {
  Serial.begin(9600);  // inizializza porta seriale
  Serial.println("seriale rx inizio");
}

void loop() {

  SerRx = "";                                        // azzera buffer ricezione
  Timer = millis();                                  // timer partito

  while (millis() - Timer < TimeOut) {               // attesa timeout
    while (Serial.available() > 0) {              // ricezione da modulo
      SerRx += char(Serial.read());       // aggiungi carattere al buffer         
      Timer = millis();                              // reset timer
    }
  }

  if (SerRx.length() > 0) {                          // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
    J = 0;
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp1 = Z.toInt();
      J = I + 2;       // nuova posizione di ricerca
//      Serial.println(Temp1, Decimali);
      Serial.print("Temp1 = ");
      Serial.println(Temp1, Decimali);
     
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp2 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
//      Serial.println(Temp2, Decimali);
      Serial.print("Temp2 = ");
      Serial.println(Temp2, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp3 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
//      Serial.println(Temp3, Decimali);
      Serial.print("Temp3 = ");
      Serial.println(Temp3, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp4 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
//      Serial.println(Temp4, Decimali);
      Serial.print("Temp4 = ");
      Serial.println(Temp4, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp5 = Z.toInt();
//      Serial.println(Temp5, Decimali);
      Serial.print("Temp5 = ");
      Serial.println(Temp5, Decimali);
    }
  }
}

Intanto una prima domanda.
Non vedo valorizzati i decimali.
Sbaglio io a leggere il codice?

Seconda domanda sull'utuilizzo del Serial Monitor.
Se premo INVIO manda Cr + LF alla seriale o devo comunque fare SEND dal bottone?

Nel mio esempio vorrei diciamo fare una domanda via seriale (Serial.println("Come ti chiami")) e aspettare di leggere il nome con un terminatore.
A quel punto diciamo che chiede quanti anni hai e aspetta la risposta e facciamo finta che a questo punto scriva ciao NOMe sei anto nel 19xx facendo un lavoro sul numero inserito.

Come potrei adattare l'esempio?
N





Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1308
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Contecavour

Le variabili Temp1-5 devono essere float e non intere!

Il Serial Monitor invia normalmente solo la stringa immessa.

Se vuoi che sia seguita da <CR><LF> devi personalizzare l'invio (in basso, affianco al baud rate) con "Sia NL (LF) sia CR".
Logged

Milan
Offline Offline
Sr. Member
****
Karma: 0
Posts: 375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie.

Quote
Le variabili Temp1-5 devono essere float e non intere!
Avevo copiato il codice nel post.

Quote
Il Serial Monitor invia normalmente solo la stringa immessa.

Se vuoi che sia seguita da <CR><LF> devi personalizzare l'invio (in basso, affianco al baud rate) con "Sia NL (LF) sia CR".

Quindi se io premo INVIO mentre sono nel serial monito equivale a premere SEND e mi manda solo il testo scritto (se lo lascio su NO ENDING LINE) senza nient'altro?

Se lo setto su BOTH NL & CR invece se premo invio fa il send accodando #13 #10 ?

Logged

Pages: [1] 2   Go Up
Jump to: