Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW

szczepulek 26 Oct 2019 08:43 2619 2
Nazwa.pl
  • ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW
    *

    Witam po dłuższej przerwie, tym razem dział mikro kontrolerów.

    Wymagania dla projektu / założenia:
    Pomiar w pomieszczeniu/obudowie urządzenia/w zbiorniku temperatury powietrza/cieczy na wejściu i wyjściu. Wyświetlenie na żywo aktualnych wartości temperatur na wyświetlaczu LED x2. Wykrywanie przekroczenia ustalonych granic i alarmowanie poprzez przekaźnik sygnalizacją świetlną. Gdy urządzenie zewnętrzne daje sygnał o pracy do układu ESP ten co 5 min wysyła dane z czujników do bazy danych mysql poprzez stronę PHP na serwerze.

    Sprzęt:
    * ESP8266-12E - do komunikacji przez wifi do serwera z bazą danych
    * Arduino Mega2560 - pobranie temp. z czujników, wyświetlanie temperatur, wysyłanie po Serial pomiarów do ESP, i informacji o alarmach, Nr np. linii produkcyjnej/ pomieszczeniu/ urządzeniu monitorowanemu.
    * Arduino UNO r3 - do testów komunikacji po Serial/SoftwareSerial
    * DS18B20 x2 - czujniki temperatur w wersji wodoodpornej.
    * Moduł wyświetlacza czterocyfrowego LED 8 segmentowy na TM1637 x2 - wyświetlanie aktualnych temperatur, i parametrów urządzenia.
    * Kable, przekaźniki, i inne pierdołki.

    Na wstępie, projekt przedstawiłem na innym forum, nie ograniczam się do jednej społeczności forum, bo ludzie szukają rozwiązań w różnych miejscach, i pomocy.

    Początkowe problemy jakie miałem to:

    - Zbyt długi czas pomiaru na DS18B20 (przy 2 czujnikach ponad 1400ms /12bit rozdzielczość)
    + Częściowo rozwiązany poprzez ustawienie rozdzielczości na 9bit, czas pomiaru 1 czujnika około 35ms

    - Obsługa czujników DS na 1-wire i konieczność zaprogramowania na nowo płytki w momencie wymiany uszkodzonego czujnika na przykład
    + Rozwiązano poprzez wpięcie na różnych pinach osobno czujnika wejściowej temp, i wyjściowej. Co do konieczności zmiany indywidualnego znacznika każdego czujnika, ich numer jest na początku pobierany/odczytany dla obu linii komunikacyjnych i zapisywany tymczasowo w tablicy. Działa.

    - Wyświetlanie na dwóch wyświetlaczach/modułach LED z tm1637 (komunikacja po 2 przewodach, brak indywidualnych adresów wyświetlaczy)
    + Podłączenie na osobnych pinach każdego z modułu. Co do czasu na obsługę wyświetlacza około 42ms. sporo...

    - Wymiana informacji o pomiarach i podstawowych parametrach między płytkami pomiaru i wysyłania danych na serwer.
    + Rozwiązano, może nie profesjonalnie, ale działa. Niestety wszelakie poradniki, przykłady w sieci, nie działały.. lub były nie w pełni opisane/napisane. To mi zjadło najwięcej zdrowia. Po oglądnięciu kanału Elektromaniak'a, i zlepku informacji kilku stron o łączności szeregowej, itp. udało się połączyć ze sobą narazie Mega i Uno, ESP potem zajmę się.

    - Ustawienia i zapamiętanie na Mega 2560 wartości dla progu alarmu, wyświetlenie wartości na jednym z wyświetlaczy. A także zmiana nr pomieszczenia/urządzenia monitorowanego.
    + Do rozwiązania ... teraz za to się biorę.

    - Wysyłanie wartości zmierzonych do bazy danych.
    + jeszcze nie napisany kod, nie utworzona baza. W olejnych krokach będzie rozwiązywany ten punkt.

    UWAGI:

    Przede wszystkim na co należy zwrócić uwagę, jak zawsze.. czy prawidłowo podłączone okablowanie, zasilenie układów, modułów, dla komunikacji po serial'u nie zapomnieć połączyć GND obu płytek, a w przypadku ESP8266 linie TX, RX podłączyć przez konwerter stanów logicznych. Aha, do obsługi czujników temperatury użyłem biblioteki DS18B20.h ale w wersji 1 !!!, nowsze biblioteki lub Texas'a nie uwzględniają parametru rozdzielczości pomiarów dla linii kodu
    sensor_airout.begin(9);
    wyrzucając błąd. Parametr w nawiasach w dla biblioteki w wersji 1.0 odpowiada rozdzielczości pomiarów. Czyli co 0.5 stopnia C.

    A teraz nieco kodu..
    Pomiar, wyświetlanie, serial TX - Arduino Mega2560
    Code: c
    Log in, to see the code


    Kod dla UNO (dla testów, domyślnie ESP) odbiór parametrów i pomiarów poprzez serial. Wyświetlenie w serial monitor czy wszystko przebiega prawidłowo.
    Oczywiście w materiale źródłowym wykorzystano kilka linii kodu do liczenia sum kontrolnych. Ja to pominąłem. Sprawdzane podczas odbioru są tylko znaki początkowe i końcowe przesyłanych danych, jeśli są poprawne i identyczne to wykonuje się zapis do tablic danych, i przeliczenie ich na wartość temperatur w postaci z ułamkiem.. np 21.50 *C,

    Code: c
    Log in, to see the code


    Jeszcze sporo pracy do wykonania.
    Postaram się na bieżąco informować o postępach.
    Zaznaczam że jestem mocno początkujący.. i osoby siedzące w temacie na pewno znajdą wiele uproszczeń i błędów, będę wdzięczny za sugestia..
    Chcę również podziękować RFM za pomoc i podpowiedzi. Postaram się w niedalekiej przyszłości wykorzystać je.

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    szczepulek
    Level 12  
    Offline 
    pasjonuje się elektroniką i innymi dziedzinami powiązanymi od młodzieńczych lat
    Has specialization in: CVS
    szczepulek wrote 156 posts with rating 25. Live in city Bielsko-Biała. Been with us since 2006 year.
  • Nazwa.pl
  • #2
    kulpen
    Level 11  
    wydaje mi się że w nowszych bibliotekach dallasa rozdzielczość ustawia się komendą:

    #define TEMPERATURE_PRECISION 9
  • #3
    szczepulek
    Level 12  
    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW


    Witam, PROJEKT ostatecznie ukończony :D

    wersja ostateczna programów dla płytek MASTER Arduino Mega2560 i SLAVE ESP8266-12E

    Testowałem urządzenie przez kilka dni, w międzyczasie dokonałem kilku przeróbek, jak w kodzie tak i w połączeniach PIN itp.
    Usunięte zostały wykryte błędy, najważniejsze to obsługa klawiszy i błąd podczas modyfikacji bez zapisu - blokada dodawania wartości ustawień tylko zmniejszanie działało, i drugi błąd to literówka w linii kodu przy komunikatach dla Err1 i 2, dokładnie to pobranie nowych adresów DS18B20 pomieszane było.

    Na WSTĘPIE:
    Spora część kodu zapisanego jest moja, nie kopiowana bezpośrednio z kursów programowania itp., dlatego proszę o zrozumienie. ZASTRZEGAM sobie prawo do całości kodu , bądź jego części napisanej na potrzeby własnego projektu przeze mnie (własność intelektualna ;] ).
    NIE ZEZWALAM na kopiowanie w/w kodu i umieszczanie go/wykorzystanie przez osoby trzecie w celu brania udziału w: konkursach, egzaminach, artykułach publikacjach i tym podobne, bez mojej wyraźnej zgody.
    Jak najbardziej można używać do celów własnych i modyfikowanie, z wyżej wymienionymi zastrzeżeniami. Proszę o uszanowanie mojego czasu i wysiłku :-)

    Odnośnie testów słów kilka, główny problem stanowiły czujniki DS18B20. Nie sama ich obsługa i wyświetlanie, a PODATNOŚĆ NA ŁADUNKI ELEKTROSTATYCZNE.
    Objawiało się to wyświetlaniem Err1 lub Err2 po zamontowaniu na produkcji, duża ilość elementów z tworzyw sztucznych w pobliżu czujnika podczas pocierania i obijania sie o siebie wytwarzała ładunki, które to powodował prawdopodobnie zmianę polaryzacji prądu w czujniku (zamiast minusa występowały tam dodatnie ładunki, a na plusie wtedy niższy potencjał)
    Efektem tego było chwilowe nagrzanie się czujnika do około 80 st.C !!! w internecie sporo informacji znalazłem ,że i owszem grzeją się te układy gdy zamienimy + z -.
    Byłem przez to zmuszony do wymiany czujników na analogowe a dokładnie użyłem Termistory NTC 5k Ohm (-50 +150 *C; beta 3490; 0.5%)
    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW

    Zatem podaję dwa szkice dla Mega2560, dla różnych czujników. Oraz jeden szkic do ESP8266-12E
    Raz jeszcze powtarzam, niektóre PINy pełnią inne funkcje niż wcześniej. Na Mega2560 dodana funkcja RESETU/RESTARTU programowego gdy Err1 lub 2 zbyt długo nie znikają. PIN 9 daje stan niski na PIN Reset

    Do pobrania w ZIP'ach szkice dla Arduini IDE .ino

    Mega2560 MASTER, czujnik cyfrowy DS18B20 :
    PomiarTemp...S18B20.zip Download (9.19 kB)

    Code: c
    Log in, to see the code


    Mega2560 MASTER, czujnik analogowy NTC 5k ohm :
    2PomiarTem..._NCT5k.zip Download (39.18 kB)

    UWAGA ze względu na ograniczenie ilości znaków 65000 w jednym poście, poniższy KOD nie jest pełny, pobierz plik aby mieć całość..
    Code: c
    Log in, to see the code


    ESP8266-12E SLAVE łączący się z bazą danych, zapis poprzez plik PHP [i]wyslijpomiar.php :
    PomiarTemp...nMySQL.zip Download (3.7 kB)

    Code: c
    Log in, to see the code


    Wyświetlanie bazy danych i zapisów też zrealizowałem za pomocą PHP.
    Serwer WWW i baza danych MySQL utworzona za pomocą XAMPP na komputerze w sieci LAN.

    Ostrzegam :) pisane starodawną techniką piętnaście lat wstecz bez CSS wszędzie DIV-ów itp :) strona miała być prosta tylko do szybkiego odczytu danych. Ostatecznie pomiary wyświetlane są w programie pisanym na Windows, w tabelach i prostym wykresie.
    Zawartość pliku[i] wyslijpomiar.php znajdujący się w katalogu strony serwera WWW:
    Code: php
    Log in, to see the code


    Jeśli chcesz wyświetlić dane posegregowane wg. linii (w moim przypadku) i podziałem tabeli wyników na strony.. pobierz pliki PHP.
    esp8266 da...na WWW.zip Download (4.6 kB)

    Oto kilka screen'ów z wyświetlania wyników w tabeli, budowy urządzenia/rejestratora, struktury tabeli 'pomiary' w bazie danych.

    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW
    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW
    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW

    ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW ESP8266-12 + Mega2560 + DS18B20 + LED 7-seg TM1637 = wysyłanie pomarów MySQL WWW