chtěl bych někoho požádat o kontrolu programů, řeším odesílání dat z Arduino UNO na Arduino MEGA pomocí 433Mhz modulů.
Arduino UNO je jako vysílač a k němu mám připojené čidlo teploty ds18b20, které mi na serial vypisuje aktuální teplotu to funguje a odesílá ji pomocí programu níže na druhé ARDUINO
Kód: Vybrat vše
#include <LwTx.h>
#include <EEPROM.h>
#include <OneWire.h> //knihovna pro teplomer
byte data[] = {0,0,0,0,0,0,0,0,0,0};
OneWire ds_1(9); // čidlo 1
//--------------------------------zacatek teplomeru_1
float teplomer1() {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius_1, fahrenheit_1;
if ( !ds_1.search(addr)) {
// Serial.println("No more addresses.");
Serial.println();
ds_1.reset_search();
delay(250);
//return;
}
//Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
//Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
// return;
}
ds_1.reset();
ds_1.select(addr);
ds_1.write(0x44, 1); // start conversion, with parasite power on at the end
present = ds_1.reset();
ds_1.select(addr);
ds_1.write(0xBE); // Read Scratchpad
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_1.read();
//Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.println();
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius_1 = (float)raw / 16.0;
fahrenheit_1 = celsius_1 * 1.8 + 32.0;
float stupne_1 = celsius_1;
return stupne_1;
}
//------------------------------------konec teplomeru_1
void setup()
{
// Zapne ser. komunikaci
Serial.begin(9600);
// Data do vysílače jsou na pin 3.
// Další číslo je počet opakovaní vysílaní
// za sebou, v našem připadě 2x
lwtx_setup(3, 4, 0, 140);
Serial.println("nastaveni setupu");
}
void loop()
{
int hodnota = teplomer1();
Serial.println(teplomer1());
data[9] = hodnota;
data[8] = hodnota >> 8;
// když je vysílač nezaneprázdněn
if (lwtx_free())
{
lwtx_send(data);
// odešle zprávu na serial o odeslání
Serial.println("Data odeslana");
delay(5000);
}
}
v přijímači což je Arduino MEGA mám program níže, který by měl
na serial vypisovat teplotu poslanou z Arduino UNO
Kód: Vybrat vše
#include <LwRx.h>
#include <EEPROM.h>
int teplota = 0;
void setup() {
// nastaví datový vývod přijmače na pin 2
lwrx_setup(2);
// zapne seriovou komunikaci
Serial.begin(9600);
Serial.println("konec setupu");
}
void loop() {
// proměná pro 10 hodnot
byte data[10];
// proměnná pro delku dat
byte delka = 10;
//když jsou přijata data
if (lwrx_message())
{
// ulož data do promené data
lwrx_getmessage(data,delka);
teplota = data[9] + (data[8] >>8);
Serial.print(" ");
Serial.println(teplota);
}
delay(10000);
}
Je to celé funkční UNO ukazuje teplotu a odešle ji, MEGA ji přijme
jenže tady nastává problém
UNO mi ukazuje teplotu např: 23.81, ale MEGA mi zobrazí jen to 23
a to ".81" mi tam chybí a není mi úplně jasné, ve kterém programu
mám chybu? Možná, že to mám zbytečně složité a šlo by to jednodušeji
mohl by mi s tím někdo prosím poradit?
Předem děkuji za případnou pomoc