Přenos informací ze sériové linky

jenicek_sut
Příspěvky: 8
Registrován: 14 říj 2018, 14:55
Reputation: 0

Přenos informací ze sériové linky

Příspěvek od jenicek_sut » 23 úno 2019, 14:29

Ahoj.
Potřebuji mít informace z Arduina dostupné přes WiFi.
Predstava: Arduino Uno které vypisuje hlášky serial.print...
Wemos D1 přijímá z Arduina, připojí se k domácí WiFi sítí, běží na něm http server a přes prohlížeč si mohu údaje zobrazit.

Nebo Wemos jako WiFi sériový port v domácí siti, ke kterému se pomocí sériové konsole vzdálené připojím.

Díky.
J.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Přenos informací ze sériové linky

Příspěvek od jankop » 23 úno 2019, 14:36

Pokud nepotřebuješ příliš mnoho portů, pak není co řešit. Do Wemos D1 prostě naprogramuj ten http server a zbývající bižuterii prostě vynechej.

jenicek_sut
Příspěvky: 8
Registrován: 14 říj 2018, 14:55
Reputation: 0

Re: Přenos informací ze sériové linky

Příspěvek od jenicek_sut » 23 úno 2019, 16:04

Diky, ale asi bych to potřeboval víc "pro blbé" vysvětlit - nasměrovat na příklad. Nevím ani, jestli stačí přímo propojit tx-rx (Arduino bude napájet i Wemos mini).
Díky.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Přenos informací ze sériové linky

Příspěvek od jankop » 23 úno 2019, 17:09

Tys mi nerozuměl, já mluvím o tom, abys prostě vypustil Arduino a naprogramoval v Arduino IDE ten Wemos jako web server se vším ostatním. Arduino tam vůbec nedávat. Je to nejjednodušší, nejspolehlivější, nejlacinější a nejlepší.

jenicek_sut
Příspěvky: 8
Registrován: 14 říj 2018, 14:55
Reputation: 0

Re: Přenos informací ze sériové linky

Příspěvek od jenicek_sut » 23 úno 2019, 17:46

Tady je hrozně ostudný kód ve fázi vývoje i s komentáři, jeho funkcionalita je pro mě dostačující - plní vše co průmyslová řídící jednotka až na nemožnost změny parametrů (což jednoduchou změnou v programu dokáži i např. přes androidí telefon rychleji a lépe i s nahráním). Ošetření havarijních stavů je kromě kódu řešeno ještě HW a naprosto nezničitelně. Nejspíš je to napsáno zbytečně komplikovaně, ale já to neumím a takhle to pro mě bylo jednoduché a kupodivu i rychlé. Učím se to a pořád vidím možnosti zlepšení a změny a navázání dalších funkcí, ale tohle je nejspíš zatím opravdu dostačující. Pokud bych tento kód naprogramoval do wemos, tak do jakého http serveru - prosím příklad a do jaké jeho části?

Použiju-li původní myšlenku a např.: http://fritzing.org/projects/wifi-serial-monitor, mohu propojit piny TX-RX místo uvedeného ve schématu a pokud ano, jak změnit kód ve wemos? Pokud to musím udělat dle schématu, musím připojit odpory jak je uvedeno a pokud ano tak proč?

Díky

Kód: Vybrat vše

//Řídící jednotka pro automatický kotel
#include <OneWire.h>
#include <DallasTemperature.h>
#include <avr/wdt.h>

// nastavení čísla vstupního pinu DS18B20
const int pinCidlaDS = 4; // vytvoření instance oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS); // vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);
int tlacVENT = 9; //pin tlacitka manualniho ovladani ventilatoru
int tlacPOD = 10; //pin tlacitka manualniho ovladani podavace
int sigPOD = 8; //signalovy pin podavace
int sigVENT = 7; //signalovy pin ventilatoru
int sigHAV = 6; //signalovy pin havarijniho stavu
int relVENT = 12; //pin rele ventilatoru
int relPOD = 11; //pin rele podavace
int tepZAP = 24; //teplota pro zapnuti cyklu topeni ve °C
int tepVYP = 27; //pozadovana teplota kotle ve °C (pro vypnuti podavace a ventilatoru)
int tepHAV = 32; //havarijni teplota kotle ve °C pro odstaveni zarizeni
int tepMIN = 20; //teplota pro odstavení pri vyhasnuti
long int presPAL = 6000; //prestavka v dodavce paliva v milisekundách 
long int dodPAL = 2000; //doba dodavky paliva v v milisekundách 


//int dobPROD = 3500000; //doba prodlevy v ms - po uplynutí této doby se provede 1 cyklus přiložení a profouknutí
                      //pokud nedošlo za uvedenou dobu k cyklu topení
//int dobTOP = 3600000;  //doba topení v ms - po uplynutí této doby dojde k odstaveni zarizeni
                      //protože kotel nebyl schopen dosáhnout za tuto dobu požadovanou teplotu
void setup(void)
{
  wdt_enable(WDTO_8S); //8 sekundovy watchdog
  Serial.begin(9600);
  senzoryDS.begin();
  pinMode(relVENT, OUTPUT);
  pinMode(relPOD, OUTPUT);
  pinMode(tlacVENT, INPUT_PULLUP); //tlacitko pripojit na gnd
  pinMode(tlacPOD, INPUT_PULLUP);  //tlacitko pripojit na gnd
  pinMode(sigVENT, OUTPUT);
  pinMode(sigPOD, OUTPUT);
  pinMode(sigHAV, OUTPUT);
  digitalWrite(relPOD, HIGH);
  digitalWrite(relVENT, HIGH);

}

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
  // pomocí změny čísla v závorce (0) - pořadí dle unikátní adresy čidel
  Serial.println (" ");
  Serial.print("Teplota kotle je ");
  Serial.print(senzoryDS.getTempCByIndex(0));
  Serial.println("° Celsia.");
  Serial.print("Pozadovana teplota je ");
  Serial.print(tepVYP);
  Serial.println("° Celsia. ");
  Serial.print("Kotel se zapíná při poklesu teploty pod ");
  Serial.print(tepZAP);
  Serial.println("° Celsia.");
  Serial.println (" ");
  delay(2000);
  wdt_reset();
//pretopeni kotle
if      (senzoryDS.getTempCByIndex(0) > tepHAV) //pretopeni
        {digitalWrite(relVENT, HIGH);
        digitalWrite(relPOD, HIGH);
        digitalWrite(sigHAV, HIGH);
        Serial.println (" ");
        Serial.println ("!!!!!!!!!!!!Pretopeni kotle!!!!!!!!!!!!!!");
        Serial.print("Havarijní teplota nastavena na ");
        Serial.print(tepHAV);
        Serial.println("° Celsia.");
        wdt_reset();
        }
//hlaska se zobrazuje i pokud se kotel uz ochladil
if      (digitalRead(sigHAV)==HIGH)
        Serial.println("!!!!!!!!!!!!Pretopeni kotle!!!!!!!!!!!!!!");
//pokud dojde k vyhasnuti kotle, podavac a ventilator nebudou pracovat
if      ((senzoryDS.getTempCByIndex(0) < tepMIN) && (digitalRead(sigPOD)!=HIGH || digitalRead(sigVENT)!=HIGH) && 
        (senzoryDS.getTempCByIndex(0) != -127.00) && (senzoryDS.getTempCByIndex(0) != 85.00)) //Vyhasnuti kotle
        {digitalWrite(relVENT, HIGH);
        digitalWrite(relPOD, HIGH);
        Serial.println (" ");
        Serial.println("!!!!!!!!!!!!Vyhasnuti kotle!!!!!!!!!!!!!!");
        Serial.print("Minimální teplota nastavena na ");
        Serial.print(tepMIN);
        Serial.println("° C.");
        wdt_reset();
        }
//nefunkcni cidlo teploty
if      (senzoryDS.getTempCByIndex(0) == -127.00) //chyba cidla
        {digitalWrite(relVENT, HIGH);
        digitalWrite(relPOD, HIGH);
        Serial.println("!!!!!!!!!!Chyba cidla teploty kotle!!!!!!!!!!");
        wdt_reset();
        }
//nefunkcni cidlo teploty
if      (senzoryDS.getTempCByIndex(0) == 85.00)  //chyba cidla
        {digitalWrite(relVENT, HIGH);
        digitalWrite(relPOD, HIGH);
        Serial.println("!!!!!!!!!!Chyba cidla teploty kotle!!!!!!!!!!");
        wdt_reset();
        }
//pouze posila informaci na seriovou linku
if      (digitalRead(sigVENT)==HIGH)
        Serial.println("----------Rucni rizeni - ventilator zapnut----------");
//pouze posila informaci na seriovou linku
if      (digitalRead(sigPOD)==HIGH)
        Serial.println("----------Rucni rizeni - podavac zapnut----------");
        
//když je stisknuto tlačítko pro ruční ovládání ventilátoru a signálový pin je LOW protože není aktivní ruční řízení:
if      ((digitalRead(tlacVENT)==LOW) && (digitalRead(sigVENT)==LOW))  //rucni ovladani ventilatoru zap
        {digitalWrite(relVENT, LOW);
        digitalWrite(sigVENT, HIGH);
        Serial.print(" ");
        Serial.println("----------Rucni rizeni - ventilator zapnut----------");
        wdt_reset();
        delay(2000);}
        
//když je stisknuto tlačítko pro ruční ovládání podavače a signálový pin je LOW protože není aktivní ruční řízení:
if      ((digitalRead(tlacPOD)==LOW) && (digitalRead(sigPOD)==LOW))   //rucni ovladani podavace zap
        {digitalWrite(relPOD, LOW);
        digitalWrite(sigPOD, HIGH);
        Serial.print(" ");
        Serial.println("----------Rucni rizeni - podavac zapnut----------");
        delay(2000);
        wdt_reset();
        }
//když je stisknuto tlačítko pro ruční ovládání ventilátoru a signálový pin je HIGH (zapnutý ventilátor ručně):
if      (digitalRead(tlacVENT)==LOW && digitalRead(sigVENT)==HIGH) //rucni ovladani ventilatoru vyp
        {digitalWrite(relVENT, HIGH);
        digitalWrite(sigVENT, LOW);
        Serial.print(" ");
        Serial.println("Rucni rizeni - ventilator vypnut.");
        delay(1000);
        wdt_reset();
        }
//když je stisknuto tlačítko pro ruční podávání a signálový pin je HIGH (zapnutý podavač ručně):
if      (digitalRead(tlacPOD)==LOW && digitalRead(sigPOD)==HIGH)    //rucni ovladani podavace vyp
        {digitalWrite(relPOD, HIGH);
        digitalWrite(sigPOD, LOW);
        Serial.print(" ");
        Serial.println("Rucni rizeni - podavac vypnut.");
        delay(1000);
        wdt_reset();
        }
//když poklesne teplota pod tepZAP nebo je spuštěný ventilátor a
//teplota kotle je menší nebo stejná než tepVYP a
//není aktivní ruční režim a
//nedošlo k vyhasnutí kotle a
//nedošlo k poruše čidla teploty a
//teplota kotle je menší než tepHAV a
//nedoslo k pretopeni kotle
if      ((senzoryDS.getTempCByIndex(0) < tepZAP || digitalRead(relVENT)==LOW) &&
        (senzoryDS.getTempCByIndex(0) <= tepVYP) &&
        (digitalRead(sigPOD)!=HIGH && digitalRead(sigVENT)!=HIGH) &&
        (senzoryDS.getTempCByIndex(0) > tepMIN) &&
        (senzoryDS.getTempCByIndex(0) != -127.00) &&
        (senzoryDS.getTempCByIndex(0) != 85.00) &&
        (senzoryDS.getTempCByIndex(0) < tepHAV) &&
        (digitalRead(sigHAV)!=HIGH))
        {digitalWrite(relVENT, LOW);
        digitalWrite(relPOD, HIGH);
        Serial.println(" ");
        Serial.println("**********Topim - ventilator zapnut**********");
        Serial.println("Podavac vypnut");
        Serial.print("Cas prestavky v dodavce paliva nastaven na ");
        Serial.print(presPAL/1000);
        Serial.println(" sekund.");
        Serial.print("Cas dodavky paliva nastaven na ");
        Serial.print(dodPAL/1000);
        Serial.println(" sekund.");
         delay(presPAL/15); wdt_reset(); //prestavka v dodavce paliva rozdeleno kvuli wdt
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         Serial.print("Teplota kotle je ");
         Serial.print(senzoryDS.getTempCByIndex(0));
         Serial.println("° Celsia.");
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         Serial.print("Teplota kotle je ");
         Serial.print(senzoryDS.getTempCByIndex(0));
         Serial.println("° Celsia.");
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         Serial.print("Teplota kotle je ");
         Serial.print(senzoryDS.getTempCByIndex(0));
         Serial.println("° Celsia.");
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         delay(presPAL/15); wdt_reset();
         Serial.print("Teplota kotle je ");
         Serial.print(senzoryDS.getTempCByIndex(0));
         Serial.println("° Celsia.");
        digitalWrite(relPOD, LOW);
        Serial.println("Podavac zapnut.");
        delay(dodPAL/10 ); wdt_reset (); //bezi dodavka paliva rozdeleno kvuli wdt
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         Serial.print("Teplota kotle je ");
         Serial.print(senzoryDS.getTempCByIndex(0));
         Serial.println("° Celsia.");
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
         delay(dodPAL/10 ); wdt_reset ();
        digitalWrite(relPOD, HIGH);}

//když teplota je větší než tepVyp a současně není aktivní ruční režim a neběží cyklus topení vypni podavač i ventilátor:
if    ((senzoryDS.getTempCByIndex(0) > tepZAP) && (digitalRead(sigPOD)!=HIGH || digitalRead(sigVENT)!=HIGH) && (digitalRead(relPOD)!=LOW || digitalRead(relVENT)!=LOW))
        {digitalWrite(relVENT, HIGH);
        digitalWrite(relPOD, HIGH);
        Serial.println (" ");
        Serial.println("**********Netopim**********");}
} 

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Přenos informací ze sériové linky

Příspěvek od RomanB » 23 úno 2019, 21:02

Ty odpory tam jsou kvůli rozdílným napěťovým úrovním, WEMOS pracuje s 3,3V a NANO s 5V. To aby jsi nezničil 5 volty vstup do WEMOS , ale pro NANO odporů není třeba, protože úroveň 3,3V pro vstup jako log. 1 NANO akceptuje.

Mě se líbí https://hackaday.io/project/5680-hardwa ... -with-wifi Jediný problém je v tom, WEMOS se neprogramuje přes Arduino. Je v jazyku LUA.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Přenos informací ze sériové linky

Příspěvek od jankop » 24 úno 2019, 01:15

RomanB píše:
23 úno 2019, 21:02
Jediný problém je v tom, WEMOS se neprogramuje přes Arduino. Je v jazyku LUA.
A to je pouze tvoje iluze. Wemos je pochopitelně podporován v Arduino IDE. Nehodlám tady propagovat vlastnosti Esp8266, ale má víc paměti, je rychlejší a dovede se připojovat na WiFi. Není problém. Mám s ESP8266 poměrně dost zkušeností, s ním dovedu poradit.

jenicek_sut
Příspěvky: 8
Registrován: 14 říj 2018, 14:55
Reputation: 0

Re: Přenos informací ze sériové linky

Příspěvek od jenicek_sut » 24 úno 2019, 04:19

Ok. Rozumím tedy proč odpory, ale proč není použit na wemosu PIN RX ale D7? Jak použít pouze Wemos bez Arduina? V kódu používám často delay - to mi ovšem vyhovuje, ale pro použití jedné desky Wemos by asi mohl být problém?

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Přenos informací ze sériové linky

Příspěvek od RomanB » 24 úno 2019, 08:13

Pin D7 je taky RX2
wemos.jpg



@jankop Myslel jsem v tomto případě https://hackaday.io/project/5680-hardwa ... -with-wifi

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Přenos informací ze sériové linky

Příspěvek od jankop » 24 úno 2019, 09:23

V případě zařízení na bázi ESP8266 s funkcí delay() není problém. Na rozdíl od běžného Arduina se tento "prázdný" čas využívá pro WiFi komunikaci .
Tenhle program http://esp8266.fancon.cz/esp8266-web-ba ... meter.html bys pravděpodobně mohl nahrát jako demo rovnou do svého Wemosu. Je to vlastně webový server v režimu station včetně OTA, tedy včetně upgrade firmware přes WiFi.
Pokud chceš programovat Wemos jako Arduino:
1. Doporučuji aktualizovat na poslední verzi Arduino IDE tj. 1.8.8
2. podívej se na odkaz https://github.com/esp8266/Arduino, tam je postup
3. ten spočívá ve vložení odkazu na externí manažer desek
4. a stažení potřebného balíku desek s daným čipem
Je to v podstatě velmi jednoduché.
Ve tvém odkazu autor přímo píše, že teď by ten sériový port dělal pouze s ESP8266
*************** UPDATE: (8th March 2016): *********************************************************************
I started this project almost a year ago. At that time arduino core for esp was in pre alpha stage so it was logical to use nodemcu. If you use nodemcu the serial port is already reserved for issuing commands to esp so I could not use it for sniffing traffic.

If I started now I wouldn't use arduino...

I would just flash arduino core on esp8266 and be done with it. It would be a lot easier to make.

Odpovědět

Kdo je online

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