Invio tramite xbee

Salve ragazzi il problema in questione è il seguente ho a disposizione due arduino e due moduli xbee. Su un arduino è montato il modulo coordinatore xbee ed un pulsante. Alla pressione di quest'ultimo dovrei mandare tramite la shield xbee un segnale HIGH all'altro arduino. L'altro arduino ogni qual volta riceve il segnale HIGH dall'xbee dovrebbe resettare un contatore. E' la prima volta che utilizzo i moduli xbee e non ho la minima idea di come si fa a livello software. Ho provato a realizzare due righe di codice ma da errore quando faccio la verifica.

#include <XBee.h>
XBee xbee = XBee();
int buttonPin=8;
int valButton=LOW;
void setup(){
xbee.begin(9600);
pinMode(buttonPin,INPUT);
}
void loop(){
  valButton= digitalRead(buttonPin);
  if(valButton==HIGH){
    xbee.send(HIGH);
    else{
      deley(100);
    }

Chiedo gentilmente se sapete suggerirmi qualche cosa anche per quanto riguarda l'altra parte del programma che al momento è così:

/**
/@author Christian Berti
/rilevatore di ingressi PROTOTIPO
**/
const int TxPin=6;//pin trasmissione seriale display LCD
#include <SoftwareSerial.h> //importo libreria seriale
SoftwareSerial mySerial = SoftwareSerial(255,TxPin);//dichiaro un oggetto della libreria
int FotoPin = 1;//dichiarazione attributo per memorizzazione lettura fotoresistore
int ledpin=13; //pin led riflettore fascio luminoso
int FotoValue;//attributo in cui viene memorizzato valore letto da fotoresistore
int controlPin=8;//pin led segnalatore passaggio
int contatore;//attributo dedito al conteggio 
int buttonpin=12; // pin lettura valore interruttore
int valbutton=LOW;//dichiarazione attributo per memorizzazione stato interruttore
int val=0;//attributo in cui viene memorizzato valore letto da interruttore
void setup() {//dichiarazione utilizzo pin
pinMode(ledpin,OUTPUT); //dichiarazione tipo di pin
pinMode(controlPin, OUTPUT);//dichiarazione tipo di pin
pinMode(buttonpin,INPUT);//dichiarazione tipo di pin
pinMode (TxPin, OUTPUT);//dichiarazione tipo di pin
mySerial.begin(9600);//dichiarazione velocità aggiornamento LCD
delay(100);
mySerial.write(12);//pulizia LCD

}
void loop() {
valbutton= digitalRead(buttonpin);//associo lettura digitale all'attributo
digitalWrite(ledpin,HIGH);//accende il led riflettore
FotoValue = analogRead(FotoPin);// assegna all'attributo il valore letto
if (valbutton==HIGH){ //confronto lettura interruttore con valore HIGH
  contatore=0;//azzero contatore
  mySerial.println("Sistema Azzerato");//stampa su LCD
  delay (2000);//ritarda di 2 secondi
}else if (valbutton==LOW){ //confronto lettura interruttore con valore LOW

if (FotoValue>280){//confronto attributo con soglia prefissata
  mySerial.write(12);//pulizia LCD
  digitalWrite(controlPin,HIGH);//istruzione eseguita solo se condizione precedente positiva; accende il led segnalatore
  Serial.println(FotoValue);// stampa su seriale il valore del fotoresistore
  contatore++;//incremente l'attributo
  mySerial.print("Persone: ");//stampa su LCD
  mySerial.println(contatore);//stampa su seriale l'attributo
  delay(1500);//aspetta un secondo e mezzo
  digitalWrite(controlPin,LOW);//spegne il led segnalatore
}
else{
delay(500);//aspetta mezzo secondo e riesegue la lettura del fotoresistore
}
}
}

identazione del codice e manca l'errore di compilazione...

Il problema purtroppo è che non so come funzionino i moduli xbee o meglio non so come funziona la libreria xbee! Pertanto rinnovo la domanda su come installare all'interno dell'IDE la libreria dei moduli xbee e su dove scaricarla! Infine credo che le funzioni che debbo utilizzare siano .send per il modulo che invia e l'altra ... Mah aspetto un vostro consiglio!

per gli xbee non devi installare nulla! ci parli via seriale, quello che gli scrivi è esattamente quello che viene trasmesso, e viceversa... esattamente come se parlassi con il PC

per esempio scrivo high sul pin TX? e nell'altro arduino quando sul pin RX arriva HIGH resetta il contatore per esempio?

no, se scrivi high sul pin tx "rompi" il protocollo seriale.

puoi inviare il caratte "h" o "H" e dall'atro arduino quando leggerai quel carattere farei qualcosa

quindi utilizzando un digitalWrite sul pin TX ed un digitalRead sul pin RX?

pres961:
quindi utilizzando un digitalWrite sul pin TX ed un digitalRead sul pin RX?

NO, Lesto ti stà dicendo che devi parlarci in "seriale" ... Serial - Arduino Reference ... inviando dei "caratteri" e ricevendo dei "caratteri", non lavorando come se fossero dei pin digitali :slight_smile:

Guglielmo

Quindi utilizzo i comandi della libreria serial print() e read()?

int TxPin=1;
#include <SoftwareSerial.h>
SoftwareSerial trasmissione = SoftwareSerial(255,TxPin);
int buttonPin=8;
int valButton=LOW;
void setup(){
  pinMode(buttonPin,INPUT);
  trasmissione.begin(9600);
}
void loop(){
  valButton=digitalRead(buttonPin);
    if(valButton==HIGH){
      trasmissione.write("h");
    }else{
      delay(100);
    }

}

Potrebbe essere una cosa del genere sul trasmettitore?

Ok questa è l'altra parte del codice ovvero il ricevitore del segnale ma non riesco a capire quale è l'errore che mi segnala l'IDE

/**
/@author Christian Berti
/rilevatore di ingressi PROTOTIPO
**/
int TxPin=6;//pin trasmissione seriale display LCD
const char tras= "h";
const int RxPin=0;
#include <SoftwareSerial.h> //importo libreria seriale
SoftwareSerial mySerial = SoftwareSerial(255,TxPin);//dichiaro un oggetto della libreria
SoftwareSerial ricezione = SoftwareSerial(255,RxPin);
int FotoPin = 1;//dichiarazione attributo per memorizzazione lettura fotoresistore
int ledpin=13; //pin led riflettore fascio luminoso
int FotoValue;//attributo in cui viene memorizzato valore letto da fotoresistore
int controlPin=8;//pin led segnalatore passaggio
int contatore;//attributo dedito al conteggio 
int buttonpin=12; // pin lettura valore interruttore
char valbutton;//dichiarazione attributo per memorizzazione stato interruttore
int val=0;//attributo in cui viene memorizzato valore letto da interruttore
void setup() {//dichiarazione utilizzo pin
  pinMode(ledpin,OUTPUT); //dichiarazione tipo di pin
  ricezione.begin(9600);
  pinMode(controlPin, OUTPUT);//dichiarazione tipo di pin
  pinMode(buttonpin,INPUT);//dichiarazione tipo di pin
  pinMode (TxPin, OUTPUT);//dichiarazione tipo di pin
  mySerial.begin(9600);//dichiarazione velocità aggiornamento LCD
    delay(100);
  mySerial.write(12);//pulizia LCD

}
void loop() {
  valbutton= ricezione.read();//associo lettura digitale all'attributo
    digitalWrite(ledpin,HIGH);//accende il led riflettore
    FotoValue = analogRead(FotoPin);// assegna all'attributo il valore letto
  if (valbutton==tras){ //confronto lettura interruttore con valore HIGH
    contatore=0;//azzero contatore
    mySerial.println("Sistema Azzerato");//stampa su LCD
    delay (2000);//ritarda di 2 secondi
  }else{ //confronto lettura interruttore con valore LOW

      if (FotoValue>280){//confronto attributo con soglia prefissata
        mySerial.write(12);//pulizia LCD
        digitalWrite(controlPin,HIGH);//istruzione eseguita solo se condizione precedente positiva; accende il led segnalatore
        Serial.println(FotoValue);// stampa su seriale il valore del fotoresistore
        contatore++;//incremente l'attributo
        mySerial.print("Persone: ");//stampa su LCD
        mySerial.println(contatore);//stampa su seriale l'attributo
        delay(1500);//aspetta un secondo e mezzo
        digitalWrite(controlPin,LOW);//spegne il led segnalatore
}
else{
      delay(500);//aspetta mezzo secondo e riesegue la lettura del fotoresistore
}
}
}

Per inviare ok.

per il ricevitore:
se ci dessi l'errore...

ah e prima di postare il codice fai tool->autoformat

l'errore è

sketch_mar28a:6: error: invalid conversion from ‘const char*’ to ‘char’

alla riga:

const char tras= "h";

lui dice che non può trasformare un array di caratteri (o meglio un puntatore di caratteri vedi il *?) in un carattere.
E infatti "ciao" o anche solo "c" è un ARRAY di caratteri (detta stringa, da non confondere con String che è una CLASSE che poi al suo interno contiene la stringa e un pò di funzioni per semplificare il suo utilizzo)
Invece se parliamo di un carattere allora vorrai usare 'c', o meglio 'h' nel tuo caso.

Attento che NON è errore scrivere 'ciao' ma in pratica viene preso il valore numerico di ogni singolo carattere (vedi tabelle ascii), sommato, trocato a 255 (il massimo valore numerico di un carattere) e preso sempre dalla tabella ascii il carattere corrispondente. Insomma un bel casino che nessuno usa se non in particolarissimi.

Quindi come deve essere dichiarato?

const char tras= 'h';

ps. ma spiego così male?

:slight_smile: :slight_smile: :slight_smile: Sorry è che tutto il giorno che provo e non avevo notato la differenza scusa ancora!