DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Arduino_tele
Příspěvky: 4
Registrován: 02 lis 2017, 20:57
Reputation: 0

DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od Arduino_tele » 08 lis 2017, 17:12

Ahoj už jsem bezradný a prosím o pomoc.

Potřeboval bych napsat kód pro arduino vysílač který bude číst přes One wire 4 teploty z čidel DS18B20 a tyto hodnoty posílat do dalšího arduina které to zobrazí na LCD 20X4 I2C

Dokázal jsem (ač jsem laik) splácat z toho co je na netu návody kód pro čtení a zobrazení těchto teplot ale pouze na jednom arduinu.

Zkoušel jsem jako základ použít tento návod:

http://www.arduino8.cz/lekce-35-arduino ... ost-1200m/

Bohužel v tomto návodu se posílá hodnota z analogového výstupu rovnou ale já mám proměnnou s desetinnou čárkou (čili asi flow) a to není to stejné.A hlavně je pouze jedna která se pořád opakuje.

Já jaksi pořád nedokážu pochopit to jak se to ukládá do toho bufferu vlastně to jak mám označit ve vysílači proměnnou tak abych si ji v příjmači zase tu konkretní vytáhnul a nechal ji zobrazit na LCD.

Nevíte někdo o nějakém návodu kde by toto konkrétně řešili abych se mohl inspirovat.Ať hledám jak hledám tak nenalézám.Nebo něco kde by bylo fakt pro blbce vysvětlena komunikace po RS485 kde bych se to mohl naučit?

V průvodci světem arduina to není dostatečně popsáno v přikladech abych tomu porozuměl.Nemáte někdo případně tuto knihu :

http://www.martinus.cz/?uItem=249563#description

je to tam lépe popsáno.

Děkuji za jakoukoliv radu,pomoc nakopnutí. Honza

pavel1tu
Příspěvky: 1029
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od pavel1tu » 08 lis 2017, 22:31

Nějakou free knihu o arduinu mám "průvodce světem arduina", napiš mi do PM email, pošlu

Pokud vyčítáč správně čidla,
tak jak jsem koukal a nevím proč, odesílají vše do druhého arduina jako text.
Ulož hodnotu čidla do proměnné třeba "teplota1" a pak "sprintf (buff,"%d",teplota1)" převede teplotu na text atd.....

oni toiž
deklarují proměnnou char buff[10]; což je pole pro 10 znaků
sprintf (buff,"%d", analogRead(A0)); z A0 převedou odečtenou hodnotu do textu a uloží do "buff" jako text
SendData(1, 1,buff); odešlou na adresu "1" výpis z čidla "1" s textem uloženým v "buff"

bud vyčíst všechny čidla do ruzných proměnných
a odeslat na adresu "1", postupně z čidel "1" až "3" text "buuf1"až "buff3"
nebo vyčíst čidlo "x" a odeslat a další a další

odeslání se aktivuje tím zavoláním void SendData(byte address, byte var, char data[])
a musíš splnit že "adress" bude byte,číslo čidla "var" bude byte a odesílaná hodnota "data" bude typu char, jinak se to neprovede

já bych to dělal postupně po 1 čidlu, pak trochu počkal a další čidlo

nemohu to vyzkoušet, ale nevypadá to jako těžké, a neumím to popsat jednodušeji

PS: ve veškerých příkladech postrýdám detechci chyb a chybových hlášení, ale nevím jestli to aduino podporuje ...., stejně jednoduše plánuji posílat z 20 skleníků (20 arduin) 2 teploty + 2 vlhhkosti po wirelees do centrály :-)
UNO, NANO, Mikro, PRO mini, DUE
http://pavel1tu.8u.cz/

pavel1tu
Příspěvky: 1029
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od pavel1tu » 09 lis 2017, 08:11

Ještě jsem se na to jednou podíval a ten český příklad je nic moc .... jako většina, bohužel.

Před odesláním vůbec nezkouší, zda linka žije (druhá strana poslouchá) a že není linka obsazena - když jak tvrddí odesílá ze dvou arduin.
Naměřenou hodnotu převádí na "text" ještě před odesláním, netuším proč, já bych odesílal naměřenou hodnotu, třeba jen zaokrouhlenou na 1 des. místo - mohu pak v arduinu, kde to přijmu tyto hodnoty dále zpracovávat .... ukládat min/max, ukládat do pole a vytvářet grafy atd.

Lápe je to vysvětlené včetně příkladů:
https://www.arduino.cc/reference/en/lan ... on/serial/
https://www.arduino.cc/en/Reference/SoftwareSerial

PS: na konci článku pisatel píše, že je 485 nespolehlivé, nevím, potkávám se v práci s tímto protokolem již 10let a naopak je velmi odolné rušení.
Jsem dost zmaten, že v článku odesílá data ze 2 zařízení do jednoho - normálně se to řeší na 1 lince opačně, že jeden máster vyčítá ostatních několik slave stanic. Nelprve naváže se stanicí spojení a pak se přenáší data. Osobně jsem z RS232 a 485 u arduina tak zmaten(z příkladů), že jsem se doma raději rozhodl použít knihovnu a protokol CANbus.
UNO, NANO, Mikro, PRO mini, DUE
http://pavel1tu.8u.cz/

Arduino_tele
Příspěvky: 4
Registrován: 02 lis 2017, 20:57
Reputation: 0

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od Arduino_tele » 16 lis 2017, 10:00

Ahoj děkuji za příspěvek tak jsem na to kouknul se docílil jsem toho že vyčítám teplotu ze 4 čidel , tu ukládám do proměnných a postupně je posílám do druhého arduina a v něm výstup jen prasácky zobrazuji rovnou na serial monitor.

Můj momentální problém je že nevím jak tu hodnotu ve druhém arduinu opět uložit do proměnné abych ji mohl nějak "uchopit" a určit kde na LCD ji má zobrazit.

V dalších dvou přispěvcích bych s dovolením přiložil kód vysílače a příjmače. Pokud by někdo měl chuť schopnosti a čas mi nějak pomoci.Nevím jak je to naročné na čas snad to není zcestný požadavek.

Arduino_tele
Příspěvky: 4
Registrován: 02 lis 2017, 20:57
Reputation: 0

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od Arduino_tele » 16 lis 2017, 10:01

VYSILAČ

// Vysílač - funguje čtení 4 teplot z DS18B20 a jeho převod do proměnné typu float(a,b,c,d) a tu následně posílám na serial monitor tohoto arduina a následně ji posílám taky RS485.

/


// připojení knihoven
#include <OneWire.h>
#include <DallasTemperature.h>


#include <SoftwareSerial.h> // inicializijeme knihovnu

#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin

#define SSerialTxControl 3 // RS modul pin 3

SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX






// nastavení čísla vstupního pinu
const int pinCidlaDS = 4;
// vytvoření instance oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS);
// vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);

void setup(void) {
// komunikace přes sériovou linku rychlostí 9600 baud
Serial.begin(9600);





// nastartujeme software serial
RS485Serial.begin(14400);





// zapnutí komunikace knihovny s teplotním čidlem
senzoryDS.begin();
}

void loop(void) {
// načtení informací ze všech připojených čidel na daném pinu
senzoryDS.requestTemperatures();
// výpis teploty na sériovou linku, při připojení více čidel
// na jeden pin můžeme postupně načíst všechny teploty
// pomocí změny čísla v závorce (0) - pořadí dle unikátní adresy čidel


Serial.print("Teplota cidla 1: ");
float a=senzoryDS.getTempCByIndex(0);
Serial.print(a);
Serial.println(" stupnu Celsia");
// pauza pro přehlednější výpis
delay(2000);



Serial.print("Teplota cidla 2: ");
float b=senzoryDS.getTempCByIndex(1);
Serial.print(b);
Serial.println(" stupnu Celsia");
// pauza pro přehlednější výpis
delay(2000);


Serial.print("Teplota cidla 3: ");
float c=senzoryDS.getTempCByIndex(2);
Serial.print(c);
Serial.println(" stupnu Celsia");
// pauza pro přehlednější výpis
delay(2000);

Serial.print("Teplota cidla 4: ");
float d=senzoryDS.getTempCByIndex(3);
Serial.print(d);
Serial.println(" stupnu Celsia");
// pauza pro přehlednější výpis
delay(2000);


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
RS485Serial.write(" Teplota 1:"); // odešle text
char buff[10];
dtostrf(a, 6, 2, buff);
RS485Serial.write(buff);
delay(2000);
RS485Serial.write(" Teplota 2:"); // odešle text
dtostrf(b, 6, 2, buff);
RS485Serial.write(buff); // odešle znak kového řádku
digitalWrite(SSerialTxControl, 0); // Zakáže odesílání na modulu RS485
delay(2000);

RS485Serial.write(" Teplota 3:"); // odešle text
dtostrf(c, 6, 2, buff);
RS485Serial.write(buff); // odešle znak kového řádku
digitalWrite(SSerialTxControl, 0); // Zakáže odesílání na modulu RS485
delay(2000);

RS485Serial.write(" Teplota 4:"); // odešle text
dtostrf(d, 6, 2, buff);
RS485Serial.write(buff); // odešle znak kového řádku
digitalWrite(SSerialTxControl, 0); // Zakáže odesílání na modulu RS485
delay(2000);

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



}

Arduino_tele
Příspěvky: 4
Registrován: 02 lis 2017, 20:57
Reputation: 0

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od Arduino_tele » 16 lis 2017, 10:02

Přijmač



// tento kod umí číst to co pošlu přes RS485 a sprostě jo vytisknout na serial monitor ale já potřebuji tu hodnotu nějak uchopit uložit do proměnné abych mohl určit kam ji vytisknout na LCD
//viz poznámka vysílač



#include <SoftwareSerial.h>

#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin

#define SSerialTxControl 3 // RS modul pin 3


// vytvorime seriovy port na pinu 10 a 11
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

int byteReceived;

void setup()
{
// Inicializujeme seriový port na klasickém pin 0 a 1 (TX a RX)
Serial.begin(9600);

pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, 0); // Povolí přijímaní na modulu RS485


RS485Serial.begin(14400); // rychlost RS485 musí být nastavená stejně jako na vysílači
}


void loop() {

// když jsou nějaká data přijata na RS485
if (RS485Serial.available())
{
byteReceived = RS485Serial.read(); // Přečte byte z modulu RS485
Serial.write(byteReceived); // a odešle je na Serial Monitor
}

}

pavel1tu
Příspěvky: 1029
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od pavel1tu » 16 lis 2017, 12:39

Nemám jak vyzkoušet, mám jen 1 arduino, megu a nano jsem už vrátil.
Také mám na přenos jen moduly 433MHz ale to je asi jedno, je to připojené přes stejnou linku.
Já to také budu řešit - 20 skleníků, 20 arduin, každé 2 teploty a 2 vlhkosti ...
UNO, NANO, Mikro, PRO mini, DUE
http://pavel1tu.8u.cz/

martinius96
Příspěvky: 419
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od martinius96 » 16 lis 2017, 13:04

OneWire funguje až na 300 metrov (taký je rekord) :D Takže si tých 20 sklenníkov môžeš napojiť na jedno Arduino! :) Dá sa to urobiť aj tak, nemusíš využiť ani RS485.

pavel1tu
Příspěvky: 1029
Registrován: 26 říj 2017, 08:28
Reputation: 1
Bydliště: Trutnov
Kontaktovat uživatele:

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od pavel1tu » 16 lis 2017, 18:53

martinius96 píše:
16 lis 2017, 13:04
OneWire funguje až na 300 metrov (taký je rekord) :D Takže si tých 20 sklenníkov môžeš napojiť na jedno Arduino! :) Dá sa to urobiť aj tak, nemusíš využiť ani RS485.
Poslal bych foto - proto se každý skleník měří na 2 místech.
Jsou to i 30m dlouhé skleníky. Do 300m byc to nedal a kudy to tahat ?
Je to jen na léto, mají hydrailické větrání a už se jim jednou zaseklo a půlka skleníku v čudu.
Taky jde o jaro, kdy připravují v 5 skleníkách sadbu pro lidi.

Už mi letí 10ks RFM69W - jdou uspávat (pak žerou jen mikroA), jde u nich řídit výkon vysílání a citlivost příjmu (kvůli přeslechům u těch neblíže) snad jdou i kryptovat, už se na ně těším.
UNO, NANO, Mikro, PRO mini, DUE
http://pavel1tu.8u.cz/

milos_cb10
Příspěvky: 1
Registrován: 04 lis 2019, 14:40
Reputation: 0

Re: DS18B20_onewire - posílat přes RS 485 do druhého Arduina

Příspěvek od milos_cb10 » 04 lis 2019, 15:45

Dobrý den, mám podobný problém jak dostat naměřenou teplotu na jednom arduínu a přenést po RS na druhé. Potřebuji celou naměřenou hodnotu pro další zpracování. Nemáte něco již zpracovaného. Moc děkuji za jakoukoli pomoc. Miloš

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti