Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Senin, 13 September 2021

ESP8266 - @Telegram_Bot - Part 3 : Python Matplotlib Graph DHT11

 



Python sebagai bahasa pemrograman yang dikhususkan buat pecinta data science memiliki berbagai fasilitas dan module untuk visualisasi data. Saking banyaknya sampai tiap coder memiliki stylenya masing-masing tergantung yg disukainya. Namun yg paling umum dipakai adalah Matplotlib.


Matplotlib adalah library python yang cukup lengkap untuk membuat visualisasi statis, animasi, dan interaktif . Matplotlib membuat hal-hal mudah menjadi mudah dan hal-hal sulit menjadi mungkin. seperti :


Membuat

  • Kembangkan plot kualitas bagus hanya dengan beberapa baris kode
  • Gunakan figur interaktif yang dapat memperbesar, menggeser, memperbarui...


Sesuaikan

  • Kendalikan penuh gaya garis, properti font, properti sumbu...
  • Ekspor dan sematkan ke sejumlah format file dan lingkungan interaktif


Extended

  • Jelajahi fungsionalitas yang disesuaikan yang disediakan oleh paket pihak ketiga
  • Pelajari lebih lanjut tentang Matplotlib melalui banyak sumber belajar eksternal 

Tanpa berpanjang lebar lagi, saya akan lanjutkan pembahasan sebelumnya yaitu menulis data DHT11 - MQTT ke database SQLite ( disini ) , dan selanjutnya melalui matplotlib akan di ubah menjadi visualisasi grafis yang menarik. Script lengkapnya sebagai berikut :


import sqlite3
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


def graph_data():
# Connect to database
sqlite_file = 'humitemp.db' #sesuaikan nama db
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn-bright')

c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 50')
data = c.fetchall()

temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Data Lingkungan Kamar")

# Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Temperature [°C]")
ax1.plot_date(dates, temperature, '-', label="Temperature", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Humidity [% RH]")
ax2.plot(dates, humidity, '-', label="Humidity", color='b')

# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.show()
c.close()
conn.close()

if __name__ == '__main__':
graph_data()



Penjelasannya seperti berikut , modul python yg digunakan  :


import sqlite3
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


Untuk koneksi ke database, pastikan data sudah tersedia  dari praktek sebelumnya dan saya menggunakan 50 data terakhir pada database.


def graph_data():
# Connect to database
sqlite_file = 'humitemp.db' #sesuaikan nama db
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn-bright')

c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 50')
data = c.fetchall()


Setelah itu data dari database saya buatkan list, kemudian saya masukkan satu persatu dan tambahkan Xaxis berupa data waktu. 


    temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Data Lingkungan Kamar")


Berikut ini plotingnya berdasarkan time series, dan saya tambahkan Yaxis kedua (twinx) agar grafiknya lebih simple.


    # Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Temperature [°C]")
ax1.plot_date(dates, temperature, '-', label="Temperature", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Humidity [% RH]")
ax2.plot(dates, humidity, '-', label="Humidity", color='b')


Dan kemudian saya tampilkan grafiknya beserta legenda dan label-labelnya.


    # Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.show()
c.close()
conn.close()



Hasilnya seperti berikut :



Pada tulisan berikutnya akan saya kasi tahu cara menggabungkan kesemuanya, sehingga bot telegram dapat menampilkan data berupa grafik secara real time.
Share:

ESP8266 - @Telegram_Bot - Part 2 : Database

 



Perlu dipahami dan disadari bagi para pembaca sekalian, ESP8266 adalah microcontroller yang sangat terbatas resource nya, baik dalam ukuran ram/rom serta kemampuan untuk penggunaanya dalam komputasi lebih lanjut. Salah satunya adalah ketika penulis mencoba memanfaatkan micropython pada esp8266 apakah mampu langsung berkomunikasi dengan bot telegram? Ternyata limitasinya terjadi pada memori ram, yg kurang bersahabat saat menggunakan jalur SSL certificate. Apalagi ketika berbicara tentang database, mungkin bisa, namun sangat disarankan untuk menggunakan jembatan lainnya berupa komputer yang berbasis 32/64 bit seperti raspberry pi atau PC sekalipun.

Sebenarnya tujuan menulis di part 2 ini adalah jembatan untuk praktek akhir menampilkan grafik suhu dan kelembaban yang akan ditampilkan pada telegram bot. Untuk itu akan dibahas terlebih dahulu cara menyimpan data pembacaan sensor DHT11 pada database. Secara singkat jalan ceritanya seperti berikut:  pembacaan sensor DHT11 akan dikirimkan oleh wemos/esp8266 secara MQTT PUB ke broker, sedangkan PC saya yg terinstal SQL Lite dan  python sebagai bahasa pemrogramannya yg akan satu persatu menyisipkan data ke tabel dbase saat ada pesan SUB dari broker MQTT.


Langkah pertama adalah dengan melakukan instalasi SQLite pada website : https://www.sqlite.org/download.html , pilih yg sesuai dengan environtmet pc yg kamu gunakan lalu buatlah tabel dengan nama dht11 seperti gambar dibawah ini :



Jadi kita akan menyimpan pembacaan suhu dan kelembaban, ditambahkan juga kolom date yg merupakan waktu dari data sensor diterima. Pengiriman data ini dilakukan melalui MQTT, jadi sebelumnya harap dipahami praktek sebelumya disini : https://www.aisi555.com/2021/08/wemos-esp-8266-part-5-mqtt-ke-aplikasi.html , namun data yang kita kirim disini berupa  JSON teks dengan format seperti berikut :


'{"suhu":"30.00" , "humi":"89.0"}'


Untuk script Arduino-Esp8266-MQTT Publish data ke broker hivemq seperti berikut ini :


#include <ESP8266WiFi.h>
#include <PubSubClient.h> //library pubsub by o'leary
#include "DHT.h"


const char *ssid =  "Nama wifi";   // Gunakan sesuai wifi kamu
const char *pass =  "password";   //

//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama

// Daftar Topik disingkat, karena biasanya panjang-panjang namanya
#define TOPIC "/aisi555/dht"


//IO pin
const int dhtPin = 13; //pin DHT di wemos

#define DHTTYPE DHT11  //Sensor DHT11
DHT dht(dhtPin, DHTTYPE); 

//Timer
unsigned long previousMillis = 0;
const long interval = 5000;   // interval pengambilan dht 11

WiFiClient wclient;            //wifi client terhubung lib pubsub
PubSubClient client(wclient);

void setup() {
  //Inisialisasi broker & Callback sub message
  client.setServer(mqtt_server, mqtt_port);
  Serial.begin(9600);
  delay(10);
  Serial.println();
  Serial.println();
  setupwifi();
  dht.begin();
}

void setupwifi()
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Terhubung Ke Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi Terhubung");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void reconnectmqtt() //function mengatur koneksi ke broker 
{
   
    
      Serial.println("Connecting to MQTT server..");
     
      if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");   
      }
   
  
}



// Non-Blocking delay agar gak ganggu proses utama
void SendTempHumid(){
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= interval) {
    // cek interval  
    previousMillis = currentMillis;   
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
    }

    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" °C ");
    

   String jsondht="{\"suhu\" : \""+String(t)+"\" , \"humi\" : \""+String(h)+" \" } ";

    //yg dibawah ini metode pengiriman PUB ke TOPIC
    //dikirim perbyte message + header nya
    //sudah dimudahkan oleh library pubsub

    Serial.println("publish to topic: " );
    Serial.print(TOPIC);
    Serial.print(" : ");
    Serial.println(jsondht);
    char message_buff[jsondht.length() + 1];
    jsondht.toCharArray(message_buff, jsondht.length() + 1);
    client.publish(TOPIC,message_buff );

   

  }

}





void loop() {
 
  if (!client.connected()) 
   {
    reconnectmqtt();
   }
   else client.loop(); //cek terus kalau ada data masuk
  
  
  SendTempHumid();
  
}

 

Script diatas sudah sering saya bahas, jadi bila belum paham agar membaca dulu disini. Selanjutnya script untuk memasukkan nilai suhu (desimal) dan kelembaban (integer) ke dalam sqlite seperti dibawah ini, dan pastikan tabel database kamu type datanya sudah sesuai. 


from paho.mqtt import client as mqtt_client
import random, json, sqlite3, datetime, time

# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


def sql_insert(s,h):
db = sqlite3.connect("blog_aisi555.db") #sesuaikan nama DB
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()

# koneksi
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)

client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client

# subscribe ke mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message

def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()


if __name__ == '__main__':
run()


Penjelasannya seperti berikut :



Library yang dipakai bermacam, mulai dari mqtt sampai json .

from paho.mqtt import client as mqtt_client
import random, json, sqlite3, datetime, time


Inisialisasi MQTT broker :


# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


Koneksi ke broker dimulai pada routine berikut :



def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)

client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client


Sedangkan yang ini proses subscribe dari topik dan kemudian menungu pesan masuk :


def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message



Script diatas ada yg khusus berupa parsing data suhu dan kelembaban menggunakan json :



            data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)



Kemudian Routine sql_insert( t, h) akan memasukkan data suhu dan kelembaban menuju tabel database. Sebelumnya data waktu akan ikut dimasukkan juga :

 
def sql_insert(s,h):
db = sqlite3.connect("blog_aisi555.db")
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()


Dan hasilnya seperti berikut ini.




Untuk selanjutnya di tulisan berikutnya akan kita masukkan data suhu dan kelembaban pada database diatas kedalam grafik python MATPLOTLIB.
Share:

ESP8266 - @Telegram_Bot - Part 1 : LED dan DHT11

 


Telegram Messenger adalah layanan pesan instan dan voice over IP berbasis cloud. Anda dapat dengan mudah menginstalnya di smartphone Anda (Android dan iPhone) atau komputer (PC, Mac dan Linux). Ini gratis dan tanpa iklan. Ada fasilitas handalan dari Telegram yang memungkinkan Anda membuat bot yang dapat berinteraksi dengan pengguna.

“Bot adalah aplikasi pihak ketiga yang berjalan di dalam Telegram. Pengguna dapat berinteraksi dengan bot dengan mengirimi mereka pesan, perintah, dan permintaan sebaris. Anda mengontrol bot Anda menggunakan permintaan HTTPS ke Telegram Bot API.”

Kali ini ESP8266 akan berinteraksi dengan bot Telegram untuk menerima dan menangani pesan, serta mengirim tanggapan. Dalam tutorial ini saya akan mengajak kamu belajar bagaimana menggunakan Telegram untuk mengirim pesan ke bot yg kamu buat untuk mengontrol LED dan meminta pembacaan sensor dari mana saja (Jangan lupa perlu Internet untuk akses ke Telegram ya).


Buat BOT kamu pada BotFather Telegram



Setelah menginstall telegram pada HP smartphone kamu, langkah awal adalah dengan search @BotFather dan masuk ke dalam layar chat nya. Lakukan langkah berikut :


  1. Ketik " /start" 
  2. Buat bot baru dengan ketik "/newbot"
  3. Pilih username dan nama bot dengan pola "Nama_bot"
  4. Simpan token API yang diberikan oleh BotFather


Instalasi Library Telegram Bot Universal & ArduinoJson pada library manager




Untuk melancarkan praktek telegrambot, maka sebaiknya dibaca dulu bagian sebelumnya yg berteme mengontrol LED dan Membaca sensor DHT11 disini : https://www.aisi555.com/2021/08/wemos-esp8266-part-2-hello-tcp-ip.html .


Script Lengkap :

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "DHT.h"

// Wifi network username dan paswword
#define WIFI_SSID "nama wifi"
#define WIFI_PASSWORD "password"
// Telegram BOT Token (dapat Botfather)
#define BOT_TOKEN "XXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

const unsigned long BOT_MTBS = 1000; // waktu tunggu pesan

X509List cert(TELEGRAM_CERTIFICATE_ROOT); //SSL Certi
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // penanda waktu terakhir

const int ledPin = 2; //Pin Led pada ESP8266 
int ledStatus = 0;

const int dhtPin = 13; //Pin DHT11 , sesuaikan 
#define DHTTYPE DHT11  //Sensor DHT11
DHT dht(dhtPin, DHTTYPE); 


String SendTempHumid(){ 
 
    //pembacaan suhu dan kelembaban
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");

      t=0;
      h=0;
    }

    Serial.print("Humi: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temp: "); 
    Serial.print(t);
    Serial.println(" °C ");

    return ("Suhu : " + String(t) + " C Kelembaban :" + String(h) + " %rH");
  }

// routine untuk mengecek pesan masuk dari bot
void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;
    //cek nama pengirim dari telegram
    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/ledon") //cek pesan masuk
    {
      digitalWrite(ledPin, LOW); // Hidupin LED (active Low)
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led : ON", "");
    }

    if (text == "/ledoff")
    {
      ledStatus = 0;
      digitalWrite(ledPin, HIGH); // Matikan LED (aktif low)
      bot.sendMessage(chat_id, "Led : OFF", "");
    }

    if (text == "/status")  //baca status Led dan DHT11
    {
      if (ledStatus)
      {
        bot.sendMessage(chat_id, "Led : ON", "");
      }
      else
      {
        bot.sendMessage(chat_id, "Led : OFF", "");
      }
        //kirim pembacaan DHT11
       bot.sendMessage(chat_id, "\n" + SendTempHumid(), "");
    }
    if (text == "/keyboard") //permintaan tampil keyboard
    {
      String keyboardJson = "[[\"/ledon\", \"/ledoff\"],[\"/status\"]]";
      bot.sendMessageWithReplyKeyboard(chat_id, "Pilih Tombol Di Bawah Ini", "", keyboardJson, true);
    }
    if (text == "/start")
    {
      String welcome = "Halo " + from_name + ", Selamat datang di ESPBOT Aisi555.\n";
      welcome += "Pilih dibawah ini untuk melakukan praktek:  .\n\n";
      welcome += "/ledon : ngidupin Led ON\n";
      welcome += "/ledoff : matikan Led OFF\n";
      welcome += "/status : liat status LED & DHT 11 \n";
      welcome += "/keyboard : kontrol lewat keyboard\n";
      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}


void setup()
{
  Serial.begin(9600);
  Serial.println();

  pinMode(ledPin, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(ledPin, HIGH); // initialize pin as off (active LOW)
  dht.begin();
  
  // attempt to connect to Wifi network:
  configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
  secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  // Check NTP/Time, usually it is instantaneous and you can delete the code below.
  Serial.print("Retrieving time: ");
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
}

void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();
  }
}


Penjelasan : 


BOT TOKEN merupakan token unik yang didapat dari @BootFather


// Telegram BOT Token (dapat Botfather)
#define BOT_TOKEN "XXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


Library yg dipakai :


#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "DHT.h"



Inisialisasi Wifi :


#define WIFI_SSID "nama wifi"
#define WIFI_PASSWORD "password"


Penentuan Pin I/O


const int ledPin = 2; //Pin Led pada ESP8266 
int ledStatus = 0;

const int dhtPin = 13; //Pin DHT11 , sesuaikan 
#define DHTTYPE DHT11  //Sensor DHT11
DHT dht(dhtPin, DHTTYPE); 


Membuat BOT dan certificate keamanan SSL


const unsigned long BOT_MTBS = 1000; // waktu tunggu pesan
X509List cert(TELEGRAM_CERTIFICATE_ROOT); //SSL Certi
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // penanda waktu terakhir


Tiap ada pesan dari BOT Telegram akan diolah di routine ini :


void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;
    //cek nama pengirim dari telegram
    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";


Menentukan jawaban / respon terhadap pesan yg diterima dari bot, lalu melakukan proses yg diharapkan semisal contoh dibawah menyalakan LED. Jangan lupa juga esp8266 akan membalas / reply ke BOT di smartphone  pengguna .


 if (text == "/ledon") //cek pesan masuk
    {
      digitalWrite(ledPin, LOW); // Hidupin LED (active Low)
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led : ON", "");
    }


Memberi reply berupa tombol keyboard yg lebih menarik pada telegram bot, menggunakan json text.


    if (text == "/keyboard") //permintaan tampil keyboard
    {
      String keyboardJson = "[[\"/ledon\", \"/ledoff\"],[\"/status\"]]";
      bot.sendMessageWithReplyKeyboard(chat_id, "Pilih Tombol Di Bawah Ini", "", keyboardJson, true);
    }


Routine membaca DHT11


String SendTempHumid(){ 
 
    //pembacaan suhu dan kelembaban
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");

      t=0;
      h=0;
    }

    Serial.print("Humi: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temp: "); 
    Serial.print(t);
    Serial.println(" °C ");

    return ("Suhu : " + String(t) + " C Kelembaban :" + String(h) + " %rH");
  }


Untuk mengecek agar reply tidak membalas pesan yg lawas, maka waktu pengiriman harus dibandingkan dengan waktu sekarang melalui time NTP /  jam internet.


configTime(0, 0, "pool.ntp.org");  
void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();
  }
}

Jangan lupa karena contoh diatas dapat diakses dari mana saja, maka bisa melakukan filter terhadap chat_id yang diijinkan masuk, kira-kira sisipkan script dibawah ini pada lokasi yang sesuai:


  #define CHAT_ID "XXXXXXXXXX" //id telegram kamu
for (int i=0; i<numNewMessages; i++) {
    // Chat id of the requester
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID){
      bot.sendMessage(chat_id, "Unauthorized user", "");
      continue;
    }

Cara mencari chat id bisa menggunakan bot IDBOT atau klik link ini di HP kamu : https://t.me/myidbot





Jadi tidak sembarang orang dapat mematikan dan menyalakan lampu rumah dan mengetahui kondisi rumah kamu ( semisal alat ini kamu pakai untuk aplikasi smarthome). Ohh iya jangan lupa semua perintah pada bot mengikuti standar bot telegram, seperti untuk memulai awal, ketik " /start ".

Selamat mencoba !




Bagaimana jika data pembacaan sensor dimasukkan ke dalam database SQL ? Lanjut di pembahasan berikutnya yuk !


Courtesy of: RandomNerd & Brian lough
Share:

Jumat, 03 September 2021

Python ESP8266 - Part 6 - MQTT DHT11 Ke Smartphone

 


Hihihi...tulisan ini bukan buat jual-beli kaset jadul ya kawan pembaca, ini cuman selingan agar tidak stress digigit ular python dengan scriptnya yang semakin memusingkan. Namun jika diambil untung ruginya ya banyak untungnya karena jika anda ingin bermain I/O menggunakan raspberry pi maka mau tidak mau harus memahami bahasa ULO. Jadi pada pembahasan kali ini kita lanjutkan MQTT pada tulisan sebelumnya, dan saya akan menjelaskan bagaimana caranya mengirim data penari ular yg kepanasan, dengan sensor DHT11 menuju smartphone. Tentunya dengan menggunakan protocol MQTT dan broker kesayangan HIVEMQ.


boot.py

import time
from umqttsimple import MQTTClient
import ubinascii
import machine
from machine import Pin
import micropython
import network
import esp
import dht
esp.osdebug(None)
import gc
gc.collect()

ssid = 'nama wifi' #sesuaikan dengan wifi kamu
password = 'password'
#broker dan topik yg digunakan
mqtt_server = 'broker.hivemq.com'
client_id = ubinascii.hexlify(machine.unique_id())
topic_suhu = b'/aisi555/suhu'
topic_humi = b'/aisi555/humi'
topic_ledesp = b'/aisi555/ledesp'
topic_ledsck = b'/aisi555/ledsck'
#delay pembacaan
last_message = 0
message_interval = 10

#PIN GPIO sensor dan LED
sensor = dht.DHT11(Pin(13)) #sesuaikan pin DHT
ledESP = Pin(2, Pin.OUT)
ledSCK = Pin(14, Pin.OUT)
ledESP.value(1) #matikan dulu active low

#koneksikan wifi
station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Koneksi Wifi Siap')
ip=station.ifconfig()
print('IP : {}'.format(ip[0]))


Script diatas merupakan script untuk inisialisasi awal dari MQTT , DHT11 dan pin LED ESP / SCK. Sedangkan untuk script utamanya seperti berikut :


main.py

def sub_cb(topic, msg):
  print('Pesan Diterima, Topik : {0} , Pesan :{1}'.format(topic, msg))
  if (topic == topic_ledesp and msg == b'on'):
      ledESP.value(0)
  if (topic == topic_ledesp and msg == b'off'):
      ledESP.value(1)
  if (topic == topic_ledsck and msg == b'on'):
      ledSCK.value(1)
  if (topic == topic_ledsck and msg == b'off'):
      ledSCK.value(0)

def connect_and_subscribe():
  global client_id, mqtt_server, topic_sub
  client = MQTTClient(client_id, mqtt_server)
  client.set_callback(sub_cb)
  client.connect()
  client.subscribe(topic_ledesp)
  client.subscribe(topic_ledsck)
  print('Terhubung ke  MQTT broker %s' % mqtt_server)
  return client

def read_sensor():
  try:
    sensor.measure()
    temp = sensor.temperature()
    hum = sensor.humidity()
    print ('suhu : {0:3.1f}, humi: {1:3.1f}'.format(temp, hum))
    return(temp,hum)
  except OSError as e:
    print ('dht error')  
    return(0,0)

def restart_and_reconnect():
  print('Gagal Terhubung MQTT broker. Reconnecting...')
  time.sleep(10)
  machine.reset()

try:
  client = connect_and_subscribe()
except OSError as e:
  restart_and_reconnect()

while True:
  try:
    client.check_msg()
    if (time.time() - last_message) > message_interval:
      t,h = read_sensor()
      client.publish(topic_suhu, str(t))
      client.publish(topic_humi, str(h))
      last_message = time.time()
  except OSError as e:
    restart_and_reconnect()


Penjelasan :

def connect_and_subscribe():
  global client_id, mqtt_server, topic_sub
  client = MQTTClient(client_id, mqtt_server)
  client.set_callback(sub_cb)
  client.connect()
  client.subscribe(topic_ledesp)
  client.subscribe(topic_ledsck)
  print('Terhubung ke  MQTT broker %s' % mqtt_server)
  return client

Function diatas untuk melakukan koneksi ke broker MQTT dan melakukan Subscribe ke topiknya.

def restart_and_reconnect():
  print('Gagal Terhubung MQTT broker. Reconnecting...')
  time.sleep(10)
  machine.reset()

Ini merupakan metode untuk error handling saat koneksi ke server / broker MQTT gagal.


def read_sensor():
  try:
    sensor.measure()
    temp = sensor.temperature()
    hum = sensor.humidity()
    print ('suhu : {0:3.1f}, humi: {1:3.1f}'.format(temp, hum))
    return(temp,hum)
  except OSError as e:
    print ('dht error')  
    return(0,0)

Script diatas untuk membaca sensor dan memberikan nilai suhu dan kelembaban kepada yg memanggilnya


def sub_cb(topic, msg):
  print('Pesan Diterima, Topik : {0} , Pesan :{1}'.format(topic, msg))
  if (topic == topic_ledesp and msg == b'on'):
      ledESP.value(0)
  if (topic == topic_ledesp and msg == b'off'):
      ledESP.value(1)
  if (topic == topic_ledsck and msg == b'on'):
      ledSCK.value(1)
  if (topic == topic_ledsck and msg == b'off'):
      ledSCK.value(0)

Function ini merupakan callback, dimana akan dipanggil saat ada pesan yg masuk tentunya dari broker MQTT. Juga dilakukan proses filtering pesan yg masuk dan kemudian melakukan action kepada LED yang ingin dinyalakan atau dimatikan.


try:
  client = connect_and_subscribe()
except OSError as e:
  restart_and_reconnect()

while True:
  try:
    client.check_msg()
    if (time.time() - last_message) > message_interval:
      t,h = read_sensor()
      client.publish(topic_suhu, str(t))
      client.publish(topic_humi, str(h))
      last_message = time.time()
  except OSError as e:
    restart_and_reconnect()

Fungsi script utama diatas adalah melakukan looping dan menunggu sampai jeda timer habis lalu mengirimkan hasil pembacaan DHT11.  Hasilnya pada Smartphone dengan aplikasi IOT MQTT Panel seperti berikut ini :











Share:

Pyhton ESP8266 - Part 5 - Komunikasi MQTT Pada MicroPython

 



Kenapa serem sih ? Aneh ya  ? Saya gambarkan pembahasan kali ini agak jenaka, ular digigit nyamuk sesuai dengan Python = Ular , MQTT (Mosquitto orang gampang menyebutnya) = Nyamuk. Sebenarnya untuk python dan mqtt server di raspberry pi, sudah pernah saya bahas disini, begitu juga penggunaan protokol Pub Sub pada python melalui library/package paho-mqtt disini. Jadi sebenarnya apa itu protokol MQTT ? Saya cuplik gambar dan penjelasan  dibawah (yg asli lebih lengkap disini).

Protokol MQTT adalah standar de-facto untuk pesan IoT. Distandarisasi oleh OASIS dan ISO, protokol publish/subscribe MQTT menyediakan cara yang terukur dan andal untuk menghubungkan perangkat melalui Internet. Saat ini, MQTT digunakan oleh banyak perusahaan untuk menghubungkan jutaan perangkat ke Internet.



Klien MQTT memublikasikan pesan ke broker MQTT dan klien MQTT lainnya berlangganan pesan yang ingin mereka terima. Implementasi klien MQTT biasanya memerlukan footprint minimal sehingga sangat cocok untuk diterapkan pada perangkat kecil yang dibatasi dan sangat efisien dalam kebutuhan bandwidth mereka.

Jadi sesuai gambar diatas, nantinya ESP8266 dan sensor yg terhubung ke GPIO nya akan melakukan publish ke MQTT broker yang saya pilihkan HIVEMQ yang merupakan broker MQTT gratis dan paling sering dipakai testing atau belajar protokol ini. Namun karena Micropython pada ESP8266 tidak menyediakan library / package paho-mqtt maka sudah ada yg membikinkan script python nya untuk mengolah MQTT secara sederhana, bisa diunduh di :


https://raw.githubusercontent.com/RuiSantosdotme/ESP-MicroPython/master/code/MQTT/umqttsimple.py


Namun sebelumnya saya akan menjelaskan bagaimana cara membuat ESP8266 dapat menjalankan script micropython secara stand alone tanpa membutuhkan IDE  atau interpretter lagi. Nah untuk itu langkah pertama adalah menggunakan IDE python Thonny.org untuk menyimpan file /script python pada device nya langsung, seperti yg saya lakukan terhadap file umqttsimple.py diatas.



Selanjutnya ada  2 file yg penting yaitu boot.py sebagai script paling awal yg di load lalu kemudian me-RUN main.py. Script boot.py umumnya berisikan package/library serta inisialisasi pin dan sensor sedangkan main.py berisikan script yg dieksekusi secara looping. Untuk praktek kali ini boot.py saya pilihkan sebagai berikut :


import time
from umqttsimple import MQTTClient
import ubinascii
import machine
import micropython
import network
import esp
esp.osdebug(None)
import gc
gc.collect()

ssid = 'nama wifi' #sesuaikan dengan wifi kamu
password = 'paswordku'
mqtt_server = 'broker.hivemq.com'
#berikut server dan topik yg digunakan
client_id = ubinascii.hexlify(machine.unique_id())
topic_sub = b'/aisi555/testsub'
topi_pub = b'/aisi555/testpub'

last_message = 0
message_interval = 5 # jarak jeda kirim pesan
counter = 0

#koneksikan wifi
station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Koneksi Wifi Siap')
ip=station.ifconfig()
print('IP : {}'.format(ip[0]))


Sedangkan untuk main.py kali ini akan saya pilihkan script untuk mengirim PUB  dan menunggu SUB  broker saja, dan kemudian dengan aplikasi MQTT klien pada pc/desktop maupun smartphone dapat saling kirim terima pesan. Simpan semua file pada device lalu tekan tombol reset pada modul ESP8266.


def sub_cb(topic, msg):
  print('Pesan Diterima, Topik : {0} , Pesan :{1}'.format(topic, msg))

def connect_and_subscribe():
  global client_id, mqtt_server, topic_sub
  client = MQTTClient(client_id, mqtt_server)
  client.set_callback(sub_cb)
  client.connect()
  client.subscribe(topic_sub)
  print('Terhubung ke  MQTT broker %s, subscribe ke topik %s ' % (mqtt_server, topic_sub))
  return client

def restart_and_reconnect():
  print('Gagal Terhubung MQTT broker. Reconnecting...')
  time.sleep(10)
  machine.reset()

try:
  client = connect_and_subscribe()
except OSError as e:
  restart_and_reconnect()

while True:
  try:
    client.check_msg()
    if (time.time() - last_message) > message_interval:
      msg = b'Hello nomer ke #%d' % counter
      client.publish(topic_pub, msg)
      last_message = time.time()
      counter += 1
  except OSError as e:
    restart_and_reconnect()



Hasil proses PUB dari ESP8266 micropython akan mengirimkan nomer counter tiap 10 detik seperti gambar hasil capture pada MQTT FX.


 



Untuk proses SUB pada topik /aisi555/testsub , hasilnya seperti ini :





Pada bagian selanjutnya kita akan mencoba mengirimkan pembacaan DHT11 dan mengontrol LED pada aplikasi smartphone IOTMQTTPANEL , jadi untuk sedikit memahaminya dapat dibaca dulu pembahasan sebelumnya disini : https://www.aisi555.com/2021/08/wemos-esp-8266-part-5-mqtt-ke-aplikasi.html

Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (11) arduino (27) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (74) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika