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
- DHT
- SFE_BMP180
- LiquidCrystal I2C
- Wire.h
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