Diskusní téma: Lekce 20 - Arduino a využití 433,92 MHz

Datum
Vložil
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

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.