Iftar alert with ESP8266 | ইফতার অ্যালার্ট
NodeMCU মডিউলগুলো শুধু ইন্টারনেটের মাধ্যমে নিয়ন্ত্রনই করা যায় না, এগুলো ইন্টারনেটের সাথে সংযুক্ত থেকে যেকোনো ডেটার আপডেট দেখাতে পারে। যেমন ক্রিকেট স্কোর, স্বর্ণের দাম, প্রতিমূহুর্তে কোনো শহরের তাপমাত্রা, ফেসবুকের নোটিফিকেশন, ইউটিউব ভিডিওর ভিউয়ের সংখ্যা ইত্যাদি। NodeMCU কে কোনো একটি API এর সাথে ইন্টিগ্রেট করে লাইভ ডেটা দেখানোর কাজগুলো সাধারনত করা হয়। API(Application Programming Interface) হল এমন একটি ইন্টারফেস যেটি ব্যবহার করে আমরা একটি বিশাল HTML কোড থেকে শুধুমাত্র আমাদের প্রয়োজনীয় ডেটাটুকু আলাদা করে নিতে পারি।
এই এক্সপেরিমেন্টে NodeMCU একটি API ব্যবহার করে বাংলাদেশের একটি পত্রিকার ওয়েবসাইট থেকে এই রমজান মাসের প্রতিদিনের ইফতারের সময়টা একটি এলসিডিতে দেখাবে এবং ইফতারের সময় হয়ে গেলে একটি অ্যালার্ম বাজাবে। বাইরের যেসব দেশে আজান খুব একটা শোনা যায়না সেসব দেশে বসবাসরত মাইক্রোকন্ট্রোলারপ্রিয় মুসলিম ভাইবোনেরা ব্যক্তিগত সুবিধার জন্য এমন একটি অ্যালার্ম সিস্টেম তৈরী করে নিতে পারেন।
প্রয়োজনীয় যন্ত্রপাতি | পরিমাণ | প্রডাক্ট লিংক |
ESP8266 NodeMCU V2 Development Board with CP2102 | 1 | এখানে ক্লিক করুন |
LCD module advanced | 1 | এখানে ক্লিক করুন |
Buzzer | 1 | এখানে ক্লিক করুন |
Male to male jumpers | 10 | এখানে ক্লিক করুন |
Breadboard | 1 | এখানে ক্লিক করুন |
সার্কিটঃ NodeMCU এবং এলসিডি মডিউলের মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।
ESP8266 NodeMCU V2 Development Board with CP2102 | LCD module advanced |
3V3 | VCC |
GND | GND |
RS | GPIO13 |
EN | GPIO15 |
D4 | GPIO 14 |
D5 | GPIO2 |
D6 | GPIO0 |
D7 | GPIO4 |
Buzzer এবং NodeMCU এর মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।
ESP8266 NodeMCU V2 Development Board with CP2102 | Buzzer |
GPIO16 | + |
GND | – |
আমাদের পুরো সার্কিটটি ছিল এরকমঃ
HTML কোড Inspect করা
প্রথমে আমাদের ঠিক করতে হবে কোন ওয়েবসাইট থেকে আমরা ইফতারের সময়টার আপডেট নেব। এই এক্সপেরিমেন্টে আমরা ইফতারের সময়ের আপডেট নিয়েছি https://www.observerbd.com থেকে।
এই ওয়েবসাইটে সাহরি ও ইফতারের সময়সূচি দেওয়া হয় এভাবে।
এবার ইফতারের সময়ের অংশটুকু ক্লিক হাইলাইট করে রাইট ক্লিক করে Inspect এ ক্লিক করি।
InSpect ক্লিক করার পর ওয়েবপেইজটির এইচটিএমএল কোড দেখা যাবে এবং ইফতারের সময়ের অংশটুকু আলাদাভাবে চিহ্নিত করা থাকবে।
ইফতারের সময়ের অংশটুকুতে রাইট ক্লিক করে Copy>copy x path সিলেক্ট করি।
নিচের ছবিটির মতো কিছু স্ট্রিং জেনারেট হবে। এটিকে আমাদের পরবর্তী ধাপের কাজের জন্য অবশ্যই সেইভ করে রাখতে হবে।
API দিয়ে URL generate করাঃ
১) https://thingspeak.com এ ভিজিট করি।এই ওয়েবসাইটে একটি অ্যাকাউন্ট খোলা আবশ্যক। অ্যাকাউন্ট না থাকলে প্রথমে sign up এ ক্লিক করে অ্যাকাউন্ট খুলে নিতে হবে। অ্যাকাউন্ট খোলার পর লগিন করি।
২)লগিন করার পর Apps অপশনে গিয়ে ThingHTTP সিলেক্ট করি।
৩)নিচের ছবির মতো একটি উইন্ডো ওপেন হবে। প্রজেক্টের যেকোনো একটি নাম দিই। URL অংশে যে ওয়েবসাইট থেকে ডেটা নেব তার লিংক(আমাদের ক্ষেত্রে https://www.observerbd.com) পেস্ট করি। Method হিসেবে GET এবং HTTP version 1.0 সিলেক্ট করি।
৪) Parse String অপশনে আগের ধাপে জেনারেট হওয়া স্ট্রিংটি পেস্ট করি।সবশেষে Save ThingHTTP ক্লিক করি।
৫) Save ThingHTTP ক্লিক করার পর পেইজের ডান দিকে একটি নতুন URL জেনারেট হবে। এবার ইউআরএলটি চেক করার পালা।
৬) URL টি কপি করে ইন্টারনেট ব্রাউজারের অ্যাড্রেস বারে পেস্ট করে enter চাপি। নিচের উইন্ডোটি দেখে বোঝা যাচ্ছে আমাদের ইউআরএল কাজ করছে। এই ইউআরএলটি আমাদের কোডে লিখতে হবে।
কোডঃ
এখানে বিশেষভাবে উল্লেখ্য যে, ইউআরএল এর এপিআই কি একেকজন ইউজারের ক্ষেত্রে একেকরকম হবে। কাজেই কোডটি নিচের কোনোরকম পরিবর্তন ছাড়া এখান থেকে কপি-পেস্ট করে আরডুইনোতে আপলোড করলে কোনো কাজ হবে না।ইউজারকে অবশ্যই উপরে দেখানো উপায়ে নিজের এপিআই কি জেনারেট করে নিতে হবে এবং নিচের কোডের ‘api key=******’ অংশে সঠিক API key দিতে হবে। বরাবরের মতো SSID এবং Password এর স্থানে যার যার SSID এবং Password লিখতে ভোলা যাবে না।
#include <ESP8266WiFi.h>
#include <time.h>
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal.h>
const char* ssid = "****";//your ssid
const char* password = "*****";//Your password
const char* host="api.thingspeak.com";
int Hour,Minutes;
int timezone = 6 * 3600;//Time of Dhaka=GMT+6 Hours
int ampm=0;
int dst = 0;
const int rs = 13, en = 15, d4 = 14, d5 = 2, d6 = 0, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
lcd.begin(16, 2);
Serial.begin(115200);
Serial.println();
Serial.print("Wifi connecting to ");
Serial.println( ssid );
WiFi.begin(ssid,password);
Serial.println();
Serial.print("Connecting");
while( WiFi.status() != WL_CONNECTED ){
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Wifi Connected Success!");
Serial.print("NodeMCU IP Address : ");
Serial.println(WiFi.localIP() );
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
Serial.println("\nTime response....OK");
}
void loop() {
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
Serial.print(" ");
delay(1000);
Serial.print("Connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort=80;
if(!client.connect(host,httpPort)){
Serial.println("Connection failed");
}
String url="https://api.thingspeak.com/apps/thinghttp/send_request?api_key=8K5A9AAEYUZTLK5Y";//Change Your API key
//Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("GET ")+ url + " HTTP/1.0\r\n"+
"Host: "+ host + "\r\n" +
"Connection: close\r\n\r\n");
client.flush();
delay(500);
while(client.available()){
String line=client.readStringUntil('\r');
//Serial.println(line);
if(line.indexOf("IFTAR")>=0)
{
Serial.println(line);
Hour= (line.substring(8)).toInt();
Serial.print("Hour=");
Serial.println(Hour);
Minutes= (line.substring(11,13)).toInt();
Serial.print("Minutes=");
Serial.println(Minutes);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(p_tm->tm_mday);
lcd.print("/");
lcd.print(p_tm->tm_mon + 1);
lcd.print("/");
//lcd.print(p_tm->tm_year + 1900);
lcd.print(p_tm->tm_year -100);
lcd.print(",");
if(p_tm->tm_hour>12)
{
p_tm->tm_hour=p_tm->tm_hour-12;
ampm=1;
}
else if(p_tm->tm_hour==12)
{
ampm=1;
}
lcd.print(p_tm->tm_hour);
lcd.print(":");
lcd.print(p_tm->tm_min);
if(ampm==1)
{
lcd.setCursor(14,0);
lcd.print("p");
if(p_tm->tm_hour==Hour && p_tm->tm_min==Minutes)
{
Serial.println("IFTAR TIME!");
lcd.clear();
lcd.print("IFTAR TIME!");
digitalWrite(LED_BUILTIN, HIGH);
delay(1000*60);
digitalWrite(LED_BUILTIN, LOW);
lcd.clear();
}
}
else
{
lcd.setCursor(14,0);
lcd.print("a");
}
lcd.print("m");
lcd.setCursor(0,1);
lcd.print(line.substring(1,13));
lcd.print(" pm");
}
}
}
উপযুক্ত এপিআইসহ ইউআরএল লিখে কোডটি NodeMCUতে আপলোড করার পর নিচের ছবিটির মতো ঢাকার সময় এবং প্রতিদিনের ইফতারের সময় দেখা যাবে।
ইফতারের সময় হয়ে গেলে সার্কিটের বাজারটি এক মিনিট ধরে বাজতে থাকবে এবং LCD তে IFTAR time দেখাবে। কোডটিতে প্রয়োজনীয় পরিবর্তন এনে যেকোনো টাইম জোনের সময় দেখা যাবে(যেমনটি ইন্টারনেন্ট ক্লক এক্সপেরিমেন্টে করা হয়েছে) এবং যেকোনো নির্ভরযোগ্য ওয়েবসাইট থেকে প্রতিদিনের সাহরি বা ইফতারের সময় লাইভ দেখে নেওয়া যাবে।
ইনশাআল্লাহ আমি চেষ্টা করবো ।এই রকম প্রোজেক্ট বানাতে পারি।
পরবর্তীতে আরো ইউনিক আইডিয়া শেয়ার করবেন।
ধন্যবাদ স্যার, ইনশাআল্লাহ্ চেষ্টা করবো।