Zdravím,
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:
#include <LwTx.h>
#include <EEPROM.h>
#include <OneWire.h> //knihovna pro teplomer
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;
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?
Zkus vynasobit na vysilaci hodnotu k odeslani treba 1000. Na prijimaci to pak udelej opacne ze prijaty parametr vydelis 1000. Zbavis se te desetinne tecky v prenosu. Mozna je to jen formatem toho parametru.
No to je jasné. Máš problém se synchronizací. Vysílač má delay(5000), tak vysílá "zprávu" každých 5 sekund.
Příjmač má delay(10000), tak čte jednou za 10 sekund. Tj. přijme 2x "zprávu". Potom záleží, jak je napsaná knihovna LwRx.
Vypadá to, že v interruptu připojeného na pin, čte příchozí data a ukládá je jako bajty do bufferu.
Bohužel, když máš v bufferu dvě zprávy, nejde nijak rozlišit, kde "zpráva" začíná a kde končí.
Podívej se na vzorové příklady s touto knihovnou. Kombinují tam při čtení i funkci millis(), pomocí které lze "udělat" jakousi synchronizaci.
dal jsem si do serialu tu hodnotu a je to taky jen 23, takže to vypadá, že se odesílá jen 23 a proto mi přijímač nic víc nezobrazí asi je tam chyba v tom co odchází
Zaveď si pevnou proměnnou "data" třeba
float data = 23.50;
pak si dej celej teploměr bokem za // a vyzkoušej si posílat pořád dokola jen
lwtx_send(data);
delay(5000);
a uvidíš, kde se ti to ztrácí...
Já si myslím, že to bude formátem, buď to budeš posílat jako řetězec nebo jako čísla.
Zkoušel sis posílat třeba text "Ahoj" ?
Synchronizace může hrát taky roli, ale modul, jak jsem četl, pracuje v knihovně s přerušením, tak by se dal program upravit tak, aby vždy když něco zachytí, odeslal zachycené do proměnné a až na to v programu přijde řada, tak se to nechá zobrazit nebo zpracovat dál...
EDIT: tohle zřejmě nepůjde, protože jsem si dostatečně nepročetl ten tutoriál...
Měl jsem za to, že to bude běhat na podobném principu jako SoftwareSerial..., omlouvám se - mazat to nebudu, ať nenaruším průběh diskuse
Naposledy upravil Cowley dne čt prosinec 03 2015, 20:38, celkově upraveno 2 krát.
Trochu jsem pročetl ten odkaz na tutoriál a viděl bych to tak, že by se dala teplota odesílat ve dvou pozicích (celé číslo v jednom a desetiny v druhém) a potom to po přijetí zase složit.
V principu se zdá, že se do jedné buňky (byte[]) dá uložit jen číslo 0-15.
V tom tutoriálu je ale naznačeno, jak předat hodnoty větší než 15 i větší než 255, proto ti nic nebrání zbavit se v přenosu té desetinné čárky vynásobením třeba 100, odeslat to jako velké celé číslo a po příjmu si to převést na (float prijatahodnota) a zase to vydělit tou 100.
kód:
rozložení před vysláním
unsigned int hodnota = 46795;
data[9] = hodnota;
data[8] = hodnota >> 4;
data[7] = hodnota >> 8;
data[6] = hodnota >> 12;
----------------------------
složení po příjmu
// spojí rozlozenou hodnotu
// dvou 4-bitových cisel do 8-bitového
teplota = data[9] + (data[8] << 4);
Naposledy upravil Cowley dne čt prosinec 03 2015, 21:04, celkově upraveno 4 krát.
Založen: Jan 12, 2009 Příspěvky: 7096 Bydliště: Plzeňsko
Zaslal: čt prosinec 03 2015, 20:19 Předmět:
A překvapuje to někoho???
Jestli někdo pojmenuje typ proměnné byte a bude mít jiný počet bitů než 8, tak zaslouží vytahat. _________________ Sháním hasičák s CO2 "sněhový", raději funkční.
(Nemusí mít platnou revizi.)
(Celkově budu raději, když se to obejde bez papírů.)
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;
Ještě koukám, zda se v programu u vysílače netlučou ty dva data[] parametry, jeden je pro přenos a druhej pro teploměr
Modul 433MHz sice doma nemám, ale začíná se mi líbit
Samozřejmě bude potřeba zapracovat i záporné hodnoty naměřené teploty.
Ty ale nebude problém umístit do rezervní buňky data[0], třeba jako parametr 1 pro mínus a parametr 0 pro plus.
Naposledy upravil Cowley dne čt prosinec 03 2015, 21:48, celkově upraveno 1 krát.
... Bohužel, když máš v bufferu dvě zprávy, nejde nijak rozlišit, kde "zpráva" začíná a kde končí....
Přijímač zapisuje pořád do stejných buněk, proto když čte jednou za 10s, přijde o hodnotu která tam byla vyslaná a uložená před 5-ti vteřinama, jinak se nic neděje.
Pokud teda nepřijde během 5-ti sekund ze zimy pařák
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2, 3Další
Strana 1 z 3
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.