Go Down

Topic: trasmissione di n.5 temperature tra 2 Arduino 1 (Read 3 times) previous topic - next topic

pietro78

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

mancio

#1
Sep 22, 2012, 01:25 pm Last Edit: Sep 22, 2012, 01:29 pm by mancio Reason: 1
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: [Select]


#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
    }
}

pietro78

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

cyberhs

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: [Select]

#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: [Select]
#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();
    }
  }
}


pietro78

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


Code: [Select]
#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: [Select]
#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...

Go Up