Libratyan J. Posted May 13, 2021 Posted May 13, 2021 Halo, kenalin gua Libratyan. Sekarang gua aktif kuliah semester 6 di Gunadarma jurusan teknik elektro. Saat ini gua lagi ngejalanin tugas penulisan ilmiah (Pi) dan disini gua lagi bikin alat. Untuk PI ini gua pake mikrokontroler Lolin NodeMCU ESP8266 v3. Bagi yang belom tau, NodeMCU ini merupakan devboard mikon seperti Arduino, cuma udah embedded WiFi dan dipake buat IoT projects. Short story, gua bikin alat IoT yang memanfaatkan RFID reader RC522, Google Firebase Realtime Database, dan Telegram. Nah disini gua pengen ngajak diskusi kawan2 sekalian buat gua belajar2. Untuk progressnya sendiri, alat yang gua buat ini udah 85% jadi. Tapi, ada something yang bikin gua kurang sreg, yaitu coding program yang gua buat ini gua rasa kurang efisien karena: 1. Menggunakan metode looping saat read dan write database (ngecek database node per node) 2. Huge delay saat read dan write database (karena no 1) 3. Kurang efisien kalo isi databasenya makin banyak 4. Kurang efisien kalo requester (dari Telegram) banyak ngirim command Gua pernah baca tentang shallowdata dan JsonObject gitu tapi belom ngerti untuk gua implementasiin di coding programnya. Mungkin ada yang ngerti dan bisa bantu, sangat diapresiasi :D What I've done so far: Spoiler #include <FirebaseESP8266.h> //INCLUDE FIREBASE #include <Wire.h> //#include <ESP8266WiFi.h> //WIFI CONNECT #include <WiFiManager.h> //WIFI MANAGER #include <CTBot.h> //TELEGRAM BOT #include <ArduinoJson.h> #include <SPI.h> //SERIAL PHERIPERAL INTERFACE #include <MFRC522.h> //RFID READER #include <PCF8574.h> //GPIO EXTENSION #define RST_PIN 20 #define SS1_PIN 16 #define SS2_PIN 15 #define NO_READER 2 //OUTPUT LED DAN BUZZER TO EXTENSION - ACTIVE LOW! #define blue_0 P4 #define green_0 P5 #define buzzer_0 P7 #define red_0 P6 #define blue_1 P0 #define green_1 P1 #define red_1 P3 #define buzzer_1 P2 //FIREBASE HOST AND AUTH #define FIREBASE_HOST "XXXX" #define FIREBASE_AUTH "XXXX" FirebaseData fbdo; PCF8574 pcf8574(0x20, 4, 5); //EXTENDER byte red[] = {red_0, red_1}; byte green[] = {green_0, green_1}; byte blue[] = {blue_0, blue_1}; byte buzzer[] = {buzzer_0, buzzer_1}; byte SS_PIN[] = {SS1_PIN, SS2_PIN}; //MFRC522 SS/SDA PIN USED MFRC522 mfrc522[NO_READER]; //TOTAL MFRC522 READER //WIFI CREDENTIALS //#define ssid "LIBRATYAN-WIFI_plus" //#define password "XXXX" //INITIALIZE TELEGRAM BOT #define BOTtoken "XXXX" //CHAT ID //#define CHAT_ID "XXXX" //DONT ADD FOR GLOBAL USE CTBot bot; //HANDLE BOT NEW MESSAGE unsigned long lastTimeBotRan; int shop = 1; void configModeCallback (WiFiManager *myWiFiManager) { pcf8574.digitalWrite(green_0, LOW); pcf8574.digitalWrite(green_1, LOW); Serial.println("Entered config mode"); Serial.println(WiFi.softAPIP()); } void setup() //INITIALIZE LED INDICATOR pcf8574.digitalWrite(red_0, LOW); pcf8574.digitalWrite(red_1, LOW); bot.setTelegramToken(BOTtoken); Serial.println(ESP.getFreeHeap()); pcf8574.begin(); for (int i = 0; i < 2; i++) { pcf8574.pinMode(red, OUTPUT); pcf8574.pinMode(green, OUTPUT); pcf8574.pinMode(blue, OUTPUT); pcf8574.pinMode(buzzer, OUTPUT); pcf8574.digitalWrite(red, HIGH); pcf8574.digitalWrite(green, HIGH); pcf8574.digitalWrite(blue, HIGH); pcf8574.digitalWrite(buzzer, HIGH); } //SERIAL BEGIN Serial.begin(9600); SPI.begin(); //INITIALIZE SPI //INITIALIZE WIFI CONNECTION WiFi.mode(WIFI_STA) WiFiManager wifiManager; wifiManager.autoConnect("SmartPlaza", "ConnectSmartPlaza"); wifiManager.setAPCallback(configModeCallback); if (!wifiManager.autoConnect()) { Serial.println("Failed to connect and hit timeout"); ESP.restart(); delay(1000); } Serial.println("SmartPlaza connected!"); configTime(0, 0, "pool.ntp.org"); //UTC TIME VIA NTP //bot.sendMessage(CHAT_ID, "Bot started up :)", ""); //INFO TO TELEGRAM IF SETUP SUCCESS for (int reader = 0; reader < NO_READER; reader++) { mfrc522[reader].PCD_Init(SS_PIN[reader], RST_PIN); mfrc522[reader].PCD_DumpVersionToSerial(); } pcf8574.digitalWrite(red_0, HIGH); //TURN OFF RED pcf8574.digitalWrite(red_1, HIGH); //THIS WILL TURN GREEN / SISTEM READY pcf8574.digitalWrite(green_0, LOW); pcf8574.digitalWrite(green_1, LOW); //INITIALIZE FIREBASE Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); Firebase.reconnectWiFi(true); Serial.println(ESP.getFreeHeap()); } void loop() { //Serial.println(ESP.getFreeHeap()); for (int reader = 0; reader < NO_READER; reader++) { if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) { pcf8574.digitalWrite(buzzer[reader], LOW); delay(200); pcf8574.digitalWrite(buzzer[reader], HIGH); String content = ""; for (byte i = 0; i < mfrc522[reader].uid.size; i++) { content.concat(String(mfrc522[reader].uid.uidByte < 0x10 ? " 0" : " ")); content.concat(String(mfrc522[reader].uid.uidByte, HEX)); } content.toUpperCase(); Serial.println(content); pcf8574.digitalWrite(red[reader], LOW); //TURN YELLOW do { Firebase.getString(fbdo, "/toko" + String(shop) + "/uid"); if (content.substring(1) == fbdo.stringData()) { Firebase.getString(fbdo, "/toko" + String(shop) + "/status"); //CHECK SHOP STATUS if (fbdo.stringData() == "Open") { Firebase.setString(fbdo, "/toko" + String(shop) + "/status", "Close"); Serial.println(ESP.getFreeHeap()); } else if (fbdo.stringData() == "Close") { Firebase.setString(fbdo, "/toko" + String(shop) + "/status", "Open"); Serial.println(ESP.getFreeHeap()); } pcf8574.digitalWrite(red[reader], HIGH); pcf8574.digitalWrite(green[reader], HIGH); pcf8574.digitalWrite(blue[reader], LOW); pcf8574.digitalWrite(buzzer[reader], LOW); delay(150); pcf8574.digitalWrite(buzzer[reader], HIGH); delay(200); pcf8574.digitalWrite(buzzer[reader], LOW); delay(150); pcf8574.digitalWrite(buzzer[reader], HIGH); pcf8574.digitalWrite(blue[reader], HIGH); break; } shop++; if (Firebase.getString(fbdo, "/toko" + String(shop) + "/uid") == false) { pcf8574.digitalWrite(green[reader], HIGH); pcf8574.digitalWrite(red[reader], LOW); pcf8574.digitalWrite(buzzer[reader], LOW); delay(1000); pcf8574.digitalWrite(buzzer[reader], HIGH); pcf8574.digitalWrite(red[reader], HIGH); } Serial.println(ESP.getFreeHeap()); } while (Firebase.getString(fbdo, "/toko" + String(shop) + "/uid")); pcf8574.digitalWrite(green[reader], LOW); //PASSED THE DATABASE shop = 1; mfrc522[reader].PICC_HaltA(); mfrc522[reader].PCD_StopCrypto1(); Serial.println(ESP.getFreeHeap()); } } if (millis() > lastTimeBotRan + 1000) { TBMessage msg; if (bot.getNewMessage(msg)) { pcf8574.digitalWrite(red[0], LOW); pcf8574.digitalWrite(red[1], LOW); pcf8574.digitalWrite(buzzer[0], LOW); pcf8574.digitalWrite(buzzer[1], LOW); delay(100); pcf8574.digitalWrite(buzzer[0], HIGH); pcf8574.digitalWrite(buzzer[1], HIGH); String text = msg.text; uint32_t chat_id = msg.sender.id; Serial.println(text); String list = ""; //KUMPULIN DATA BUAT DI SEND KE TELE //Serial.println(ESP.getFreeHeap()); if (text == "/start") { String welcome = "Welcome to SmartPlaza system :) \n"; welcome += "Please use the following commands to interact. \n"; welcome += "There will be some delays, please wait. \n\n"; welcome += "/shoplist to check all available shops within The Plaza. \n"; welcome += "/shopstatus to check all shops status. \n"; welcome += "/open to check all 'open' shops \n\n"; welcome += "Type shop name with '/' to check specific shop status. \n"; welcome += "Example: /daging."; bot.sendMessage(chat_id, welcome); //Serial.println(ESP.getFreeHeap()); } else if (text == "/shoplist") { do { Firebase.getString(fbdo, "/toko" + String(shop) + "/name"); //Serial.println(ESP.getFreeHeap()); list += "- "; list += fbdo.stringData(); list += "\n"; shop++; Serial.println(ESP.getFreeHeap()); } while (Firebase.getString(fbdo, "/toko" + String(shop) + "/name")); shop = 1; bot.sendMessage(chat_id, list); } else if (text == "/shopstatus") { do { Firebase.getString(fbdo, "/toko" + String(shop) + "/name"); //Serial.println(ESP.getFreeHeap()); list += "- "; list += fbdo.stringData(); list += ": "; Firebase.getString(fbdo, "/toko" + String(shop) + "/status"); //Serial.println(ESP.getFreeHeap()); list += fbdo.stringData(); list += "\n"; shop++; Serial.println(ESP.getFreeHeap()); } while (Firebase.getString(fbdo, "/toko" + String(shop) + "/name")); shop = 1; bot.sendMessage(chat_id, list); } else if (text == "/open") { do { Firebase.getString(fbdo, "/toko" + String(shop) + "/status"); if (fbdo.stringData() == "Open") { Firebase.getString(fbdo, "/toko" + String(shop) + "/name"); list += "- "; list += fbdo.stringData(); list += ": "; Firebase.getString(fbdo, "/toko" + String(shop) + "/status"); list += fbdo.stringData(); list += "\n"; } shop++; Serial.println(ESP.getFreeHeap()); } while (Firebase.getString(fbdo, "/toko" + String(shop) + "/status")); shop = 1; bot.sendMessage(chat_id, list); } else { do { Firebase.getString(fbdo, "/toko" + String(shop) + "/name"); list = fbdo.stringData(); String toko = getValue(fbdo.stringData(), ' ', 1); toko.toLowerCase(); Serial.println(toko); if (text == "/" + toko) { Firebase.getString(fbdo, "/toko" + String(shop) + "/status"); list += ": "; list += fbdo.stringData(); break; } shop++; if (Firebase.getString(fbdo, "/toko" + String(shop) + "/name") == false) { list = "Sorry, the command you entered is not available yet :( \n"; list += "You can use /help or /start to check available command."; } Serial.println(ESP.getFreeHeap()); } while (Firebase.getString(fbdo, "/toko" + String(shop) + "/name")); shop = 1; bot.sendMessage(chat_id, list); } Serial.println(ESP.getFreeHeap()); lastTimeBotRan = millis(); pcf8574.digitalWrite(buzzer[0], LOW); pcf8574.digitalWrite(buzzer[1], LOW); delay(100); pcf8574.digitalWrite(buzzer[0], HIGH); pcf8574.digitalWrite(buzzer[1], HIGH); //Serial.println(ESP.getFreeHeap()); } pcf8574.digitalWrite(red[0], HIGH); pcf8574.digitalWrite(red[1], HIGH); } } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; }
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now