Stazione meteo, problemi con rf 433MHz

Salve a tutti, sto svolgendo il mio progetto d’esame.
Ho scelto di svolgere una stazione meteo divisa in 2 parti: una interna ed una esterna, interfacciate tramite i moduli rf 433MHz.
La stazione esterna comprende un pannello solare per l’alimentazione, DHT11, BMP180, Sensore di pioggia e fotoresistenza, mentre quella interna è munita di DHT11, BMP180 e display 16x4 i2c.
Sto avendo dei problemi a trasmettere tutti i dati dall’esterno all’interno, o meglio riesco a trasmetterne solo 2 (quelli del DHT).
Qualche anima pia più aiutarmi o orientarmi per riuscire a trasmettere tutti i dati dall’esterno all’interno senza che ci siano dei dati sbagliati?
Grazie.

** Grazie Guglielmo per la segnalazione**

Questi sono i moduli che sto usando: RF 433MHz

Le librerie che sto usando sono:
-VirtualWire

La distanza fra le 2 stazione attualmente non è rilevante visto che in fase di progetto verranno tenute a meno di 3 metri di distanza.

In questo progetto vengono usati 2 Arduino UNO.

Per il momento sto usando questi 2 codici per provare che tutto vada bene:

Trasmettitore:

//Libraries
#include <DHT.h>
#include <SFE_BMP180.h>
#include <VirtualWire.h>
#include <Wire.h>
//Definitions
const int sensorMin = 0;
const int sensorMax = 1024;
#define dhtPin 4
#define dhtType DHT11
#define offset 2.5
DHT dht(dhtPin, dhtType);
//Variables
int tempExt = 0;
int humExt = 0;
char msg0[3]; //temperature
char msg1[3]; //humidity
char msg2[3]; //pression
SFE_BMP180 pressure;

void setup() //One cicle 
{  
Serial.println("setup");    
Serial.begin(9600);   // Debugging only  
Serial.println();   
vw_set_tx_pin(7);     // Initialise the IO and ISR     
vw_set_ptt_inverted(true); // Required for DR3100     
vw_setup(2000);  // Bits per sec 
}   

void loop()//Continuous cicles 
{ 
  //-------------
  // RAIN SENSOR
  //-------------
   Serial.print("Sky status: ");
  int sensorReading = analogRead(A0);
  Serial.println(sensorReading);
  int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
  switch (range){
    case 0:
    Serial.println("Raining");
    break;
    case 1:
    Serial.println("Rain Allert");
    break;
    case 2:
    Serial.println("Clear");
    break;
  }
  
//-------------------------
// BMP180: Pressure sensor
//-------------------------
  char status;
  double PExt,T;
  status=pressure.getPressure(PExt,T);
  if (status != 0){
      Serial.print("Pressure: ");
      Serial.print(PExt,2);
      Serial.println(" hPa");
  }
  else 
      Serial.println("BMP180 Error"); //Check
      
//-----------------------------
//DHT11: Temperature, Humidity 
//-----------------------------
humExt = dht.readHumidity();
tempExt = (dht.readTemperature()  -  offset);
Serial.print(humExt, 1);
Serial.print("\t\t");
Serial.print(tempExt, 1);
Serial.print("\t\t");

//----------
// Tx data
//----------
itoa(PExt, msg2, 10);
itoa(humExt, msg1, 10);
itoa(tempExt, msg0, 10);
strcat (msg0,msg2);
vw_send((uint8_t *)msg0, strlen(msg0));
vw_wait_tx();
delay(1000);
}

Ricevitore:

#include <Wire.h>
#include <VirtualWire.h>
#include <LiquidCrystal_I2C.h>

const int sensorMin = 0;
const int sensorMax = 1024;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
int i;
void setup() {
  lcd.begin(16,4);                  // Defining the LCD
  //lcd.createChar(1, degreesymbol);  // Creating the degree symbol at place 1
  Serial.begin(9600);              // For debugging purpose
  vw_setup(2000);                  // VirtualWire communication speed
  vw_rx_start();                   // Getting redy to receive
  vw_set_rx_pin(7);                // VirtualWiore receive pin
  lcd.clear();                     // Clear the LCD
   }

void loop(){
 uint8_t buf[VW_MAX_MESSAGE_LEN];      // Variable to hold the received data
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  // Variable to hold the length of the received data
  lcd.setCursor(0,0);  
 // lcd.print("Temp: ");
 lcd.print("Reception");
 lcd.setCursor(0,1); 
  if (vw_get_message(buf, &buflen))    // If data is received
  {
   lcd.print("Temp:");
    for (i=0;i<2;i++)               // Get the two first bytes
  {
  Serial.write(buf[i]);                // Debugging purpose
  lcd.write(buf[i]);                   // Write the first bytes on the LCD
  }  
  Serial.println();                    // Debugging purpose
 // lcd.write(1);                        // Write the degree symbol on the LCD
  lcd.print("C "); 
  lcd.print("Hum:"); 
    for (i=2;i<4;i++)              // Get the two last bytes
    {
      Serial.write(buf[i]);                // Debugging
      lcd.write(buf[i]);                    // Write the last bytes on the LCD
    }  
  lcd.print("%");      
  }

Per il settaggio dei esterni:
DHT11 > Pin 4
BMP180 > SCL > A5

SDA > A4
TX 433Mhz > Pin 7
Sensore di pioggia > A0
FotoResistenza > attualmente non collegata

Per quelli interni invece:
Display I2C > SCL > A5

SDA > A4
RX 433MHz > 7

Buongiorno,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO … Grazie.

Guglielmo

Poi … dato che qui nessuno ha la “palla di vetro” per indovinare, DEVI …

… mettere un link hai moduli 433MHz che stai usando
… mettere un link alla libreria che stai usando per interfacciartici
… il codice che stai usando (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra)
… che hardware Arduino stai usando
… uno schema delle connessioni
… a che distanza si trovano le due cose
… ecc. ecc. ecc.

Guglielmo

Post modificato

Primo, la VirtualWire è obsoleta ed è stata sostituita dalla RadioHead, devi scegliere il driver RH_ASK.

Secondo, non vorrei deluderti, ma quei moduli a 433 fanno letteralmente schifo (... e il prezzo la dice lunga) e qui quasi tutti hanno rinunciato ad usarli ... un dato arriva 10 no. Oltretutto, alimentati a 5V ... quando vanno, hanno una portata ridicola ...

Insomma ... la vedo grigia ... ::slight_smile:

Guglielmo

Quei trasmettitori sono osceni ... un transistor come oscilatore libero, bloccato dai dati per fare da modulazione, con un SAW in uscita che alla fine cancella i tre quarti della potenza perche' fuori banda o armoniche ... :roll_eyes:

Puoi fare un tentativo per vedere se riesci ad aumentare leggermente la portata, costruendoti un dipolo in quarto d'onda (circa 17cm per braccio, a 433MHz, ovviamente dal trasmettitore devi partire con cavo schermato adeguato e portare anche la massa, non solo il terminale antenna), oppure un "quasi-dipolo" verticale con un pezzo di cavo schermato (con la parte terminale di circa 17cm e mezzo ed altrettanto il tubo di massa), o al limite un'assimmetrica verticale "al volo" (un supporto verticale isolante, plastica o legno, polo caldo superiore di circa 50cm e polo di massa inferiore di circa 17cm, misure tutte volanti perche' per accordarle correttamente servirebbe strumentazione che in genere la gente non ha in casa), ma non sperare di riuscire a guadagnarci piu di tanto, comunque, perche' proprio manca potenza in uscita dal modulo ... ed oltretutto amplificarli sarebbe in teoria fuorilegge ...

... oppure vai QUI e compri dei moduli a 433MHz degni di tale nome (... certo NON li paghi 3 € la coppia) :stuck_out_tongue_closed_eyes:

Guglielmo

P.S.: Il negozio on-line per quei moduli si trova QUI

I moduli ASK/FSK sono tra i piu' performanti considerando il rapporto qualita' prezzo.
Non sono sicuro consiglierei all'utente di spendere altri soldi, ma forse di riuscire a ottenere un risultato positivo con gli strumenti che ha a disposizione, considerando che sono quelli di piu' basso livello.

Ciao Crycore. Questi modulini hanno un range potenziale molto elevato. Utilizzando la libreria PJON (di cui sono il principale sviluppatore da 4 anni a questa parte), riesco a raggiungere un range di 5km in linea ottica usanto le STX882 e le SRX882 da 1 dollaro su ebay: GitHub - gioblu/PJON: PJON (Padded Jittering Operative Network) is an experimental, arduino-compatible, multi-master, multi-media network protocol.
Qui trovi la documentazione tecnica riguardante i moduli radio 433:
Home · gioblu/PJON Wiki · GitHub

Sono d'accordo con la proposta di Etemenanki per il tipo di antenna una quarter wavelength dipole antenna e' una soluzione molto azzeccata soprattutto se si sta cercando una antenna pseudo omnidirezionale.

Consiglio di droppare l'uso di VirtualWire in ogni caso, perche' ormai obsoleta sostituita da RadioHead.

Io ho usato quei moduli economici per decodificare un telecomanto e poi comandare la presa e hanno funzionato. Confermo che, senza antenna, la distanza coperta è di pochi metri anche in linea d’aria. Del resto in quei moduli l’antenna è prevista.

Salve a tutti, anch’io utilizzo questi moduli 433 economici con buon risultato. In pratica li utilizzo come radiocomando per impartire comandi a un piccolo robot. Invio 9 valori di variabili 10 ms e non ho mai riscontrato grossi problemi se non la portata. Considera però che l’antenna sull’ rx e praticamente inesistente date le dimensioni del robottino, sara di 4-5 cm ben lontana dai 17cm del 1/4 d’onda. Anche l’RX è limitato in quanto lo alimento a 5v, perciò non eroga tutta la potenza di cui ha potenziale. Però a 3m non ha problemi e in linea d’aria raggiunge distanze maggiori, perciò se a te servono 3 metri e puoi mettere un’antenna adeguata penso che non hai problemi. Ti posto il codice che ho usato io, tieni conto però che è un progetto passato e uso wirtualWire.

Codice TX:

void TX() {

  byte ingX1 = IngressoX & 0xFF;               // unico valore di 4 cifre separato
  byte ingX2 = (IngressoX & 0xFF00) >> 8;//
  byte ingY1 = IngressoY & 0xFF;               // altro valore di 4 cifre separato
  byte ingY2 = (IngressoY & 0xFF00) >> 8;//
  byte IAtx = IA & 0xFF;                     // valore 0/1
  byte stmagtx = stabmagn & 0xFF;     //    "
  byte stsontx = stabsonar & 0xFF;      //    "
  byte motOntx = MotorON & 0xFF;     //    "
  byte veltx = vel & 0xFF;                   //    "
  char msg[9] = {ingX1, ingX2, ingY1, ingY2, IAtx, stmagtx, stsontx, motOntx, veltx}; // invio 
  vw_send((uint8_t *)msg, 9 );
  vw_wait_tx();


}

e RX:

void RX() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) {
    digitalWrite(13, LOW);
    
    rx = (int(buf[1] << 8) + buf[0]);  // unisce due valori
    ry = (int(buf[3] << 8) + buf[2]);  // unisce due valori
    
    IA = int (buf[4]);               // valori = 0/1
    stdON = int (buf[5]);
    stabOn = int (buf[6]);
    MotorOn = int (buf[7]);
    vel = int (buf[8]);
}