Home

Sterownik Oświetlenia - UDP

Prace rozwojowe tytułowego sterownika cały czas posuwają się do przodu.
W poprzednim artykule poruszyłem temat czujnika temperatury opartego na DHT 11.
Projektując sterownik pomyślałem sobie dlaczego by nie rozszerzyć go o dodatkowe funkcje, przecież moduł który został wykorzystany ma sporo wolnych pinów które można by wykorzystać.
I tak narodziła się idea dołożenia czujnika temperatury oraz zmodyfikowaniu ewentualnie napisaniu od nowa aplikacji sterowniczej.

sterownik UDP

Jak możecie zobaczyć na załączonym schemacie do podstawowego układu został dołożony czujnik temperatury oraz jeden rezystor.
Konstrukcja banalnie prosta a dająca możliwość podglądu panującej temperatury w pomieszczeniu w którym został zamontowany moduł sterowniczy.
Czujnik został podłączony do płytki za pomocą pół metrowego trzy żyłowego przewodu po to żeby nie odczytywał ewentualnie temperatury sąsiadujących z nim elementów elektronicznych.
Rezystor który został dołożony między nóżki DHT 11 Vcc oraz Data trzeba dobrać doświadczalnie aby wskazanie z odczytu było zbliżone do rzeczywistej temperatury.
Ktoś mógłby zapytać a po co mi to?
Ja osobiście wynik pomiaru przekazuje na panel wyświetlacza smartfona w celach informacyjnych oraz dydaktycznych. Ale możliwości jest mnóstwo. Chociażby sterowanie żaluzjami, wentylatorem, piecem CO,
czy też instalacją alarmową gdy w pomieszczeniu jest zbyt wysoka lub niska temperatura.
Przy okazji zrealizowałem swoje wcześniejsze plany.
Otóż, zmieniłem całkowicie program dla „Wemoos ponieważ  od samego początku moim celem była komunikacja między urządzeniami w protokole UDP.
Dlaczego? Ponieważ komunikacja jest dużo łatwiejsza nie potrzebująca łączenia się ze sobą na stałe
współpracujących ze sobą urządzeń jak było w dotychczasowym projekcie.
Obecnie wystarczy że urządzenie zaloguje się do domowej sieci WiFi, następnie przechodzi w tryb nasłuchu.
Jeżeli tylko wykryje instrukcje które zostały dla niego adresowane natychmiast je pobiera i realizuje a jeżeli jest taka potrzeba odpowiada adresatowi przesyłając informacje czy też chociażby potwierdzenie że otrzymał rozkazy i je wykonuje.

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include "DHT.h"
#include <SimpleDHT.h>

int pinDHT11 = D3;
SimpleDHT11 dht11;

int msg;
int msg1;
int ipwr;
int powr;

const char* ssid = "Pdaazpl"; //nazwa domowej sieci WiFi. Wstaw swoją nazwę
const char* password = "902994f0d84736604"; // hasło domowej sieci WiFi. Wstaw swoje hasło

WiFiUDP Udp;

unsigned int localUdpPort = 3000;  // port na jakim będzie pracował sterownik. Ustal swój adres portu
char incomingPacket[255];  // wielkość bufora danych
char  replyPacekt[] = "Wiadomosc odebrana";  // odpowiedź jaka ma być wysłana

char packetBuffer[UDP_TX_PACKET_MAX_SIZE+1];

void setup()
{
pinMode(D1, OUTPUT);
digitalWrite(D1, HIGH);
pinMode(D2, OUTPUT);
digitalWrite(D2, HIGH);


 
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Lacze z %s ", ssid);
  WiFi.mode(WIFI_STA); //Moduł WiFi jako stacja robocza (WIFI_AP, WIFI_STA lub WIFI_AP_STA.)
  WiFi.begin(ssid, password);
 
  // nr IP pod jakim będzie pracował sterownik. Ustal swój adres IP i pszostałe parametry sieci
  WiFi.config(IPAddress(192, 168, 0, 160), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0));
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" polaczony");

  Udp.begin(localUdpPort);
  Serial.printf("Sterownik Oswietlenia IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}


void loop(){
for(int i=0;i<9900000;i++) // czas co jaki ma być dokonany i wysłany odczyt temperatury w ( ms ).

if (i<1)
{
   Serial.println(" ");
  Serial.println("Odczyt z czujnika");
 
  // Odczyt
  byte temperatura = 0;
  byte wilgotnosc = 0;
  if (dht11.read(pinDHT11, &temperatura, &wilgotnosc, NULL))
  {
    Serial.print("Awaria Czujnika");
    Udp.beginPacket(ipwr, powr);
    Udp.print ( "Awaria czujnika" );
    Udp.endPacket();
    delay(500);
    return;
  }
 
  Serial.print("Odczyt OK: ");
  Serial.print((int)temperatura); Serial.print(" *C, ");
  Serial.print((int)wilgotnosc); Serial.println(" %");

msg = ((int)temperatura);
msg1 = ((int)wilgotnosc);


 Udp.beginPacket(ipwr, powr);
 Udp.print ( msg ); Udp.print ( " şC    " ); Udp.print ( msg1 ); Udp.print ( " %" );
 Udp.endPacket();
   
  delay(500);
}
else
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Odpowiedzialem Nadawcy IP %d %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("Odebralem: %s\n", incomingPacket);

     Udp.read(incomingPacket,UDP_TX_PACKET_MAX_SIZE); 
   // Serial.println("Odebralem:"); 
    //kończymy je jak ciąg znaków znkiem NUL (0) 
    incomingPacket[packetSize]=0; 
    //wyświetlamy zawartość pakietu 
 //   Serial.println(incomingPacket); 
      
    if(incomingPacket[0]=='A'){ 
        digitalWrite(D1, LOW); 
       // Serial.println("LED1 ENABLED");
     }
     else
     {
     if(incomingPacket[0]=='B')
        digitalWrite(D1, HIGH); 
       // Serial.println("LED1 DISABLET"); 
     }

     if(incomingPacket[0]=='C'){ 
        digitalWrite(D2, LOW); 
       // Serial.println("LED2 ENABLED");
     }
     else
     {
     if(incomingPacket[0]=='D')
        digitalWrite(D2, HIGH); 
       // Serial.println("LED2 DISABLET"); 
     }
 
 
 ipwr = Udp.remoteIP();
 powr = Udp.remotePort();
   
    // wysyła wiadomość na IP i port z jakiego przyszło zapytanie
  Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacekt);
    Udp.endPacket();
  }
}
}


Jak się domyślacie daje to ogromne możliwości współpracy urządzeń w obrębie sieci.
W obecnej wersji zaprogramowałem tak sterownik że wykonuje polecenia „załącz, wyłącz dwóch kanałów
i przesyła wynik odczytu temperatury do urządzenia z którego zostało wysłane polecenie.
Oczywiście program sterowniczy na Androida również się zmienił.
Został napisany od nowa, ograniczony do dwóch kanałów ale za to został wyposażony w pole odczytu informacji jakie do niego będą przesyłały Wifi jednocześnie uproszczając mechanizm komunikacji.

Program został napisany w Arduino 1.65
Aplikacja do pobrania z mojego serwera Bulb-UDP v1