Project weather logger part 3 : komunikasi UDP

Posted: 1 Juli 2017 in Otomasi dan Robotika

Grafik Suhu dan Kelembapan

Grafik Suhu dan Kelembapan

Grafik Tekanan Udara

Grafik Tekanan Udara

Assalamu’alaikum Wr. Wb.

Oke saya lanjutkan.  remind lagi ini adalah seri berantai dari posting berikut ya

  1. https://tarecha.wordpress.com/2015/10/26/project-raspberry-pi/
  2. https://tarecha.wordpress.com/2017/06/05/project-weather-logger-part-1/
  3. https://tarecha.wordpress.com/2017/06/26/project-weather-logger-part-2-tambahan-sensor-tekanan-udara/

 

Sebenarnya masih mau saya edit lagi skema rangkaiannya. tapi nanti saja. saya posting dulu. oh ya ini saya tambahkan resistor 10K untuk sensor DHT sebagai pull up resistor dan 4,7K di sensor BMP 280 sebagai pull up resistor. setelah baca-baca ternyata komunikasi I2C itu memang memerlukan pull up resistor. sebelumnya sih normal-normal saja bacanya cman kadang error. terutama di sensor DHT yang pembacaan suhu dan kelembapannya 1 dan 2 point saja. ini kejadikan ketika sumber powernya dari cas hp. kalau laptop jarang sekali ada masalah. saya yakin ini karena gk kuat catu dayanya atau gk stabil . nanti saja saya perbaiki. dan juga mau saya tambahkan buzzer sebagai penanda kalau error baca. next posting saja.

oke yang pertama adalah

  1. Coding komunikasi UDP pada NodeMCU, sebelumnya saya coba pakai TCP tapi kadang2 ribet gk konek. berikut codingnya. intinya antara update data sensor saya gak pakai delay karena nanti kalau request datang ter delay nanti tidak konek. mau pakai blink without delay pakai millis() seperti di posting berikut https://tarecha.wordpress.com/2014/01/26/touchless-rotary-encoder/ s   malah error serialnya berhenti. tapi komunikasi UDP nya masih jalan. kemungkinan karena millis() dipakai oleh library sensor, tapi saya coba blink without delay yang pakai millis() saja tetep hang. jadi saya putuskan waktu tunggunya pakai perulangan if (delayKirimDataSensor > 100000) seterusnya.
    #include "DHT.h"
    #include <Wire.h>
    #include <Adafruit_Sensor.h>
    #include <Adafruit_BMP280.h>
    #include <ESP8266WiFi.h>
    #include <WiFiUdp.h>
    
    Adafruit_BMP280 bmp; // I2C
    DHT dht;
    WiFiUDP Udp;
    byte localUdpPort = 80;  // local port to listen on
    char incomingPacket[255];  // buffer for incoming packets
    char  replyPacket[255];
    
    
    
    //untuk server
    const char* ssid = "tarecha";
    const char* password = "12345678a";
    const String aHostname = "N1";
    String dataSensor;
    String infoNode;
    unsigned long delayKirimDataSensor = 0;
    
    void setup()
    {
    
      Serial.begin(9600);
      dht.setup(D0); // untuk sensor DHT 22
      Wire.begin(D2, D1); //Sensor BMP
      WiFi.begin(ssid, password);
      if (!bmp.begin()) {
        Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
        while (1);
      }
      //bagian setup wifi
      Serial.printf("Connecting to %s ", ssid);
      WiFi.mode(WIFI_STA);
      WiFi.hostname(aHostname);
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
    
      }
      Serial.println(" connected");
      Udp.begin(localUdpPort);
      infoNode = (String)"Restart reason : " + ESP.getResetReason().c_str() + "\n MAC : " + WiFi.macAddress().c_str() + "\n Hostname : " + WiFi.hostname().c_str() + "\n Signal Stringth : " + WiFi.RSSI() +
                 "\n Local IP : " + WiFi.localIP().toString().c_str() + "\n Port : " + localUdpPort + "\n CPU Freq : " + String(ESP.getCpuFreqMHz()) + " MHz\n Sketch Size : " + ESP.getSketchSize()
                 + "\n Free Space Sketch Size : " + ESP.getFreeSketchSpace();
    
    
    
      Serial.println(infoNode);
    
    
    
    }
    
    void loop()
    {
    
      if (delayKirimDataSensor > 100000)
      {
        UpdateSensor();
        Serial.println(dataSensor);
        delayKirimDataSensor = 0;
      }
      delayKirimDataSensor++;
      requestHandler();
    
    }
    
    void UpdateSensor()
    {
      delay(dht.getMinimumSamplingPeriod());
      float dhtHum = dht.getHumidity();
      float dhtTemp = dht.getTemperature();
      while (dhtHum < 3 && dhtTemp < 3)
      {
        Serial.println("Akan restart karena dht 22 error");
        delay(10000);    
        ESP.restart();
      }
      dataSensor = (String)aHostname + "," + dhtHum + "," + dhtTemp + "," + bmp.readTemperature() + "," + bmp.readPressure() + "," + bmp.readAltitude(1013.25);
    }
    
    void requestHandler()
    {
      int packetSize = Udp.parsePacket();
     
      if (packetSize)
      {
        // receive incoming UDP packets
        Serial.printf("Received %d bytes from %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("UDP packet contents: %s\n", incomingPacket);
        if (incomingPacket[0] == 'd') //get info
        {
          dataSensor.toCharArray(replyPacket, 255);
        }
        else if (incomingPacket[0] == 'i') //get data sensor
        {
          infoNode.toCharArray(replyPacket, 255);
        }
        else
        {
          String lain = "masuk else";
          lain.toCharArray(replyPacket, 255);
        }
    
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.write(replyPacket);
        Udp.endPacket();
        Serial.printf("isi reply packet %s\n", replyPacket);
    
      }
    
    
    }
    
    
    

untuk mencobanya bisa pakai packet sender bisa didownload di link ini https://packetsender.com/download

dalam percobaan ini saya kirimkan data “d” untuk data, “i” untuk info, dan “a” sebagai percobaan masuk else nya. begitu data dikirim maka nodemcu akan menerima data lalu dipilah masuk mana kemudian kirim balasan sesuai yang diinginkan . yang “d” saya kirim balasan dengan pemisah “,” agar bisa langsung save .csv (comma separated value) sehingga gk perlu rubah-rubah lagi.

Percobaan kirim data UDP

Percobaan kirim data UDP

2. Coding Python 2.7

Untuk menerima data dan menyimpannya saya menggunakan python 2.7, alasannya saya berencana pakai raspberry untuk simpan data di mysql jadi nanti gk perlu coding ulang. python ini sangat simpel sekali. berikut codingnya . simpan dalam client.py lalu jalankan. beberapa komentar berisi penjelasan “mengapa” .  ketika save pakai mode ‘a’ yang artinya append, nambahkan file yang ada.

import socket
import sys
import datetime
import time
 
UDP_IP = "192.168.3.192"
UDP_PORT = 80
MESSAGE = "d"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.settimeout(10) #dalam 10 detik setelah kirim tunggu data, kalau lewat bypass

while True:
         
        try :
                #Set the whole string
                sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
                 
                # receive data from client (data, addr)
                d = sock.recvfrom(1024)
                #pemisahan data dengan karakter "," nanti buat save di mysql
                reply = d[0].split(",")
                addr = str(d[1][0])
                
                curmin = datetime.datetime.now().time().minute
                cursec = datetime.datetime.now().time().second
                curhour = datetime.datetime.now().time().hour
                curtime = str(curhour)+':'+str(curmin)+':'+str(cursec)

                #tiap 10 menit simpan di file csv, karena dalam 10 menit lama
                #untuk mencegah save berulang di menit ke 10 dilihat detiknya
                #selama kurang dari 6 maka di save karena ada sleep 5 detiknya
                
                if (curmin % 10 ==0)and (cursec < 6)  :
                        with open('data2.csv','a') as file:
                                file.writelines(d[0]+','+curtime+'\n')
                        print 'data disimpan' + str(reply) +' '+ curtime
                              
                #print 'Server node : ' + reply[0]
                print 'Server reply : ' + str(reply) +' '+curtime
        
             
        except socket.error:
                print 'Tidak konek node'
                #tidak pernah exit karena kalau tidak konek dilewati dan ngulang
                #5 detik kemudian
                #sys.exit()  
        time.sleep(5)

python running

python running

hasil save csv

hasil save csv

dan kita bisa mengolahnya jadi gini

Grafik Tekanan Udara

Grafik Tekanan Udara

Grafik Suhu dan Kelembapan

Grafik Suhu dan Kelembapan

 

 

 

 

 

 

 

 

 

 

Oke done sekian dlu.

next posting akan ada tambahan save ke mysql sekalian grafik php nya kalau ada. dan juga perbaikan jalur powe 3.3 v nya dan 5 v nya mau saya cek apakah tegangannya terlalu tinggi atau terlalu rendah kalau pakai cas hp sehingga mengakibatkan error pembacaan sensor DHT.

terima kasih.

Wassalamu’alaikum Wr. Wb.

 

Iklan

Tinggalkan Balasan

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s