Diskusní téma: Lekce 20 - Arduino a využití 433,92 MHz
Datum | 03.02.2017 |
---|---|
Vložil | ALFicek |
Titulek | Re: asj |
Taky jsem řešil a hledal nějaké elegantní řešení a našel jsem toto... je to skvělé řešení... ukázka mého prog
V podstatě jde o to že data strukturuji, oděšlu přes bezdrát (433,92 SuperHet) a pak tu strukturu na druhé straně rozložím na původní data. je to část STRUCT a za int temp1 může být x-dalších a nejen int ale klidně float atd.
ten kontainer musí být na obou stranách stejný. v příkladu vyčítám jeden sensor DS18B20 ale v podstatě není problém jich použít více či i kombinovat více senzorů.... co nacpete na jedné straně do "kontaineru", na druhé vyleze.
Používám pro Přenost knihovnu VirtualWire (nyní je z ní RadioHead a VW už není rozvíjena)
použitý RF kit https://www.geeetech.com/433mhz-superheterodyne-3400-rf-link-kits-p-167.html
v rámci domu funguje bez problému jen s kouskem drátku
vysílač:
#include <VirtualWire.h>
#include <VirtualWire_Config.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const int led = 4;
const int transmit_pin = 12;
boolean SenseSuccess = false;
float DS18B20 = 0.0;
void setup(void)
{
Serial.begin(9600);
sensors.begin();
// nastaveni vysilace 433MHz
vw_set_tx_pin(transmit_pin);
vw_set_ptt_inverted(true);
vw_setup(2000); // rychlost prenosu 2000bps
}
void loop(void)
{
SenseSuccess = PollSensors();
if(SenseSuccess == true)
{ TransmitData();
}
else {
LEDBlink();
LEDBlink();
LEDBlink();
}
delay(5000);
}
boolean PollSensors()
{
sensors.requestTemperatures();
DS18B20 = sensors.getTempCByIndex(0);
if( isnan(DS18B20))
{
return false;
}
else {
return true;
}
}
void TransmitData()
{
struct wData_STRUCT {
byte identifierB;
int temp1;
};
wData_STRUCT wData;
wData.identifierB = 100;
wData.temp1 = (DS18B20*100);
vw_send((uint8_t *)&wData, sizeof(wData));
vw_wait_tx();
LEDBlink();
}
void LEDBlink()
{
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
}
Přijímač:
#include <VirtualWire.h>
const int led = 2;
const int receive_pin = 12;
struct wData_STRUCT {
byte identifierB;
int temp1;
};
wData_STRUCT wData;
float ts1 = 0.0;
void setup()
{
delay(1000);
Serial.begin(9600);
// Initialise the IO and ISR
vw_set_rx_pin(receive_pin);
vw_set_ptt_inverted(true);
vw_setup(2000); // 2000bps
vw_rx_start(); // Start prijimace
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
if (buflen == sizeof(wData_STRUCT))
{
memcpy( &wData, buf, sizeof(wData));
ts1 = (wData.temp1/100);
Serial.println(ts1);
LEDBlink();
}
else {
Serial.println("error");
LEDBlink();
LEDBlink();
LEDBlink();
}
}
}
void LEDBlink()
{
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
}
———
Zpět na diskuzi