ผู้เขียนบทความ : 061 นาย ธนดล จันทร์บูรณ์ COE#15
คณะวิศวกรรมศาตร์ สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566
1.ความเป็นมา
ปัจจุบัน ถ่านชาร์จมีมานานพอสมควร แต่ในบ้านเราอาจจะยังไม่ค่อยนิยมใช้กันซักเท่าไหร่ สาเหตุหนึ่งมาจากราคาของถ่านชาร์จที่สูงกว่าถ่านไฟฉายธรรมดาค่อนข้างมาก เมื่อวางเทียบกันจึงทำให้หลายคนตัดสินใจเลือกใช้ถ่านแบบเดิม แต่ถ้าลองพิจารณาจากความคุ้มค่าระยะยาว การเลือกใช้ถ่านชาร์จนั้นคุ้มกว่าเป็นมาก และด้วย ถ่านชาร์จเป็นมิตรต่อสิ่งแวดล้อม ถ่านชาร์จสามารถนำมาใช้ซ้ำได้ จึงกลายเป็นข้อดีที่ช่วยลดปริมาณขยะอิเล็กทรอนิกส์ ช่วยลดมลพิษจากสารเคมีในถ่านที่อาจรั่วไหลลงไปปนเปื้อนแหล่งน้ำ นอกจากนั้นในถ่านชาร์จยังปราศจากสารเคมีอย่างปรอท ซึ่งเป็นสารที่อยู่ในถ่านธรรมดาทั่วไป ซึ่งเป็นอันตรายต่อร่างกายอีกด้วย
ดังนั้นจึงได้เล็งเห็นความสำคัญ ของการประหยัดค่าใช้จ่าย ณ ส่วนนี้ในการออกแบบ และ สร้างอุปกรณ์ชาร์จถ่าน หรือเรียก อีกอย่างว่าแบตเตอรี่ ด้วยไมโครคอนโทรลเลอร์ ESP32 พร้อมหน้าจอแสดงผลความจุแบตเตอรี่ และแจ้งเตือนเมื่อ ถ่าน หรือ แบตเตอรี่พร้อมใช้งานแล้ว ทั้งนี้สามารถยืดอายุใช้งานได้อีกด้วย
2. วัตถุประสงค์
2.1 เพื่อพัฒนทักษะการใช้ไมโครคอนโทรลเลอร์ ESP32 ต่อ ใช้งานกับอุปกรณ์ต่างๆให้เป็นแบบ IOT
2.2 เพื่อพัฒนาทักษะการเขียนโปรแกรม Arduino ide
3. ขอบเขต
3.1 สามารถทราบว่าแบตเตอรี่ชาร์จเต็มเมื่อไหร่
3.2 สามารถชาร์จถ่านและนำไปใช้งานได้
4. ประโยชน์ที่คาดว่าจะได้รับ
4.1 ได้พัฒนทักษะการใช้ไมโครคอนโทรลเลอร์ ESP32 ต่อ ใช้งานกับอุปกรณ์ต่างๆ
4.2 ได้พัฒนาการออกแบบวงจร ต่อกับอุปกรณ์ต่างๆ
4.3 ได้พัฒนาทักษะการเขียนโปรแกรม Arduino ide
4.4 เพื่อเรียนรู้การใช้อุปกรณ์ใหม่ๆ
5.ความรู้ที่เกี่ยวข้อง
5.1 ThingSpeak
ผู้ให้บริการ Cloud ชนิดหนึ่ง ที่อนุญาตให้เราสามารถส่งค่าต่างๆขึ้นเพื่อไปเก็บบนพื้นที่ ที่เปิดให้เราใช้บริการ และยังเปิดให้เราสามารถเข้าถึงข้อมูลเหล่านี้ได้จากเวปบราวเซอร์ทั่วๆไปจากที่ไหนก็ได้ที่มี Internet จึงนับเป็นการเข้าถึงข้อมูลในรูปแบบ IOT (Internet of Things)
การสร้างChannelใหม่ หลังจากที่สร้างบัญชีแล้ว ให้ลงชื่อเข้าใช้ เปิดแท็บ “Channels” และเลือก “My Channels”
กดปุ่ม “New Channel” เพื่อสร้างช่องใหม่
ตั้งชื่อหัวเรื่อง และ field ที่ต้องการแสดงชื่อออกมา แล้วจากนั้น Save Channel
การสร้างแผนภูมิ แผนภูมิสามารถปรับแต่งได้ ไปที่แท็บ Private View ของคุณแล้วคลิกไอคอนแก้ไข
ตั้งชื่อให้กับแผนภูมิ ปรับแต่งสีพื้นหลัง แกน x และ y และค่าระดับที่ต้องการให้แสดง ดังภาพ ได้ตั้งชื่อว่า Battery Voltage แกน X เป็น Time แกน Y เป็น voltage เก็บข้อมูลช่วงเวลา 1 วัน จากนั้น Save
หากต้องการส่งค่าจาก ESP32 ไปยัง ThingSpeak คุณต้องมี Write API Key โดยเปิด “API Keys” แล้วสร้าง Key API จากนั้นสามารถคัดลอก Key API ไปใช้งานต่อไป
โค้ดการทำงาน Thinkspeak
โหลด library Thinkspeak ที่มีอยู่ใน Arduino IDE เพื่อให้สามารถกำหนดที่อยู่การส่งข้อมูลจาก ESP32 ไปยัง Thingspeak ได้ใช้ Write API Key เป็นคีย์บอกที่อยู่
String apiKey = "HEO0X0*********";
const char* server = "api.thingspeak.com";
ส่วนนี้เป็นโค้ดในการส่งข้อมูลจาก ESP32 ไปยัง field ที่ได้สร้างไว้ใน Thingspeak
String postStr = apiKey;
postStr += "&field1=";
postStr += String(voltage);
postStr += "&field2=";
postStr += String(bat_percentage);
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
delay(100);
client.print("Host: api.thingspeak.com\n");
delay(100);
client.print("Connection: close\n");
delay(100);
client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
delay(100);
client.print("Content-Type: application/x-www-form-urlencoded\n");
delay(100);
client.print("Content-Length: ");
delay(100);
client.print(postStr.length());
delay(100);
client.print("\n\n");
delay(100);
client.print(postStr);
delay(100);
}
client.stop();
Serial.println("Sending....");
//delay(13000);
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
5.2 Line Notify
เป็นบริการรับการแจ้งเตือนจากบัญชีทางการในรูปแบบ API สำหรับโปรแกรมเมอร์ นักพัฒนาซอฟต์แวร์ นำไปใช้ต่อยอดพัฒนาโปรเจคต่างๆ เชื่อมต่อกับเว็บเซอร์วิส เช่น Github IFTTT และ Mackerl สร้างการแจ้งเตือนแบบข้อความไปยังกลุ่มหรือบัญชีส่วนตัวได้โดยไม่เสียค่าใช้จ่าย ยกเว้นกรณีที่เชื่อมต่อกับเว็บเซอร์วิสอื่นๆ ซึ่งอาจมีบางบริการที่ใช้ได้เฉพาะบัญชีแบบเสียค่าบริการเท่านั้น
การสื่อสารESP32 ไปยัง LINE Notify ต้องมี Token ของ LINE Notify ในการส่งข้อมูลซึ่งวิธีการได้ Token มานั้นต้องเพิ่ม LINE Notify เป็นเพื่อน แล้วล็อกอิน LINE เพื่อขอ Token
ตั้งค่าการใช้งาน LINE Notify กำหนดชื่อผู้ส่ง และเลือกกลุ่มที่ต้องการส่งข้อความไปหา ให้กรอกชื่อที่ใช่ส่งข้อมูลเข้า Line แล้วเลือกกลุ่มที่จะส่งข้อมูล กดปุ่ม “ออก Token” จะได้ค่า Token ให้คัดลอกค่านี้ไว้ เพื่อนำไปใช้ในโปรแกรม
โค้ดการทำงาน LINE Notify
เรียกใช้งาน library <TridentTD_LineNotify.h> มาใช้เพื่อให้สามารถหาที่อยู่ของ LINE Notify ได้โดยใช้ Token ที่ได้สร้างไว้เป็นตัวบอกที่อยู่
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN "**********************************************" //ที่อยู่ รหัส Token
ส่วนนี้เป็นโค้ดการส่งข้อมูล ESP32 ไปยัง LINE Notify
LINE.notify(voltage);
LINE.notify(" Battery Ready to Use");
5.3 OLED SSD1306
จอแสดงผล OLED (Organic Light-Emitting Diode) display จอแสดงผล OLED มีข้อดีซึ่งแตกต่างจากจอแสดงผล LCD (Liquid Crystal Display) ทั่วไปคือ จอ OLED ไม่มีวงจรที่สร้างแสง Backlight จึงทำให้จอมีความหนาน้อยกว่าและเบากว่า ใช้กำลังไฟฟ้าต่ำ นอกจากนั้นจะไม่มีการเปล่งแสงในบริเวณที่ต้องการให้เป็นสีดำ ในปัจจุบันอุปกรณ์หลายอย่างเช่น โทรทัศน์, สมาร์ทโฟน (Smartphones) ได้เริ่มเปลี่ยนไปใช้จอแสดงผล OLED กันมากขึ้น
หมายเหตุ เนื่องจากค่าเริ่มต้นของไลบรารี่กำหนดขนาด OLED เป็น 128×32 ดังนั้นเมื่อใช้งานกับ OLED ขนาด 128×64 จะทำให้ตัวอักษรยืดในแนวตั้ง ซึ่งจะต้องแก้ไขไฟล์ไลบารี่ Adafruit_SSD1306.h โดยเข้าไปยังโฟลเดอร์ที่เก็บไลบรารี่ แล้วทำการแก้ไขค่าในไฟล์ดังกล่าว ซึ่งมีขั้นตอนดังนี้
1. เข้าโฟลเดอร์ Documents ของเครื่องแล้วเข้าโฟลเดอร์ Arduino
2. เข้าไปในโฟลเดอร์ libraries ซึ่งอยู่ภายในโฟลเดอร์ Arduino
3. เข้าไปในโฟลเดอร์ Adafruit_SSD1306 ซึ่งอยู่ภายในโฟลเดอร์ libraries
4. เข้าไปแก้ไขไฟล์ Adafruit_SSD1306.h
5. ค้นหาค่าเดิมที่ตั้งค่าไว้ดังรูป
6. ทำการแก้ไขให้เป็นการกำหนดค่าใช้งาน OLED ขนาด 128×64
โค้ดการทำงาน OLED SSD1306
เรียกใช้ library มาใช้งาน แล้วกำหนดขนาด pixels จออยู่ที่ 128 X 64
// OLED libraly
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
// Adafruit_SH1106 display(OLED_RESET);
Adafruit_SSD1306 Zplus(SCREEN_WIDTH, SCREEN_HEIGHT);
ส่วนนี้เป็นโค้ดการส่งข้อมูล ESP32 ไปยังจอ OLED SSD1306
Zplus.clearDisplay();
Zplus.setTextSize(2);
Zplus.setCursor(85,35);
Zplus.setTextColor(WHITE);
Zplus.print(percent);
----------------------- เงื่อนไขการกำหนดแสดงหน้าจอ -----------------------
if(percent<=0)
{
Zplus.setTextSize(2);
Zplus.setCursor(20,0);
Zplus.setTextColor(WHITE);
Zplus.print("B LOW!");
Zplus.fillRect(12, 27, 2, 26, WHITE);
}
------------------------------------ มีต่อๆไป ------------------------------------
5.4 Servo Motor mg90s
Servo Motor เป็นอุปกรณ์ที่ผู้ใช้งานสามารถ ควบคุมความเร็ว (Speed Control) , แรงบิดของมอเตอร์ (Torque Control) , ระยะทางในการเคลื่อนที่(หมุน) (Position Control) ของตัวมอเตอร์ได้ ซึ่งมอเตอร์ทั่วไปไม่สามารถ ควบคุมในลักษณะงานเบื้องต้นได้
โค้ดการทำงาน Servo Motor mg90s
เรียกใช้ library <ESP32Servo.h> มาใช้งาน ,กำหนดตัวแปร Servo ให้มีชื่อเช่น myServo แล้วกำหนดขาใช้งานของ myServo
#include <ESP32Servo.h>
Servo myServo;
------------------------------------ กำหนดขา ------------------------------------
myServo.attach(13);
---------------------- กำหนดองศาของตัว Servo Motor ----------------------
myServo.write(center_position);
5.5 LDR sensor
ตัวต้านทานชนิดที่เปลี่ยนสภาพความนำไฟฟ้า (Conductance) ได้เมื่อมีแสงมาตกกระทบ
โค้ดการทำงาน LDR sensor
กำหนดขาของ LDR sensor แล้วกำหนดให้ ขา LDR นี้เป็น INPUT เพื่อใช้อ่านค่าออกมาแล้วนำค่าที่ได้ไปใช้ในการเปรียบเทียบต่อไป
int sensor1 = 35; // LDR ขา 35
int sensor2 = 34; // LDR ขา 34
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
Download โค้ด Project Solar Charge IOT ได้ที่นี้
5.5 อุปกรณ์และวงจรของ Solar Charge IOT
ประกอบด้วย ESP32 ,LDR sensor 2ตัว ,Servo motor sg90s ,โมดูล TP4056 , จอ OLED SSD1306 , Solar panel และ แบตเตอรี่ ดังภาพ
6. ผลการดำเนินงาน
ผังการทำงานของระบบ
วิธีการใช้งาน
ในการเริ่มต้นใช้งาน ต้องให้ไฟเลี้ยงเข้า ESP32 ให้ระบบ sensor และ การเชื่อมต่อ Wifi ทำงาน เมื่อระบบทำงานจะส่งข้อความไปที่ LINE 1 ครั้งแล้วจะแสดงค่าผลของแบตเตอรี่ที่ต่อชาร์จไว้ออกจอ และ ถ้าไม่มีแบตเตอรี่ หรือ หมด ก็แสดงข้อความเพิ่มขึ้นมาที่จอ
กรณีแบตเตอรี่ต่ำกว่าที่กำหนด หรือ แบตเตอรี่หมด (ภาพ Line ทางขวา จะไม่แจ้งเตือนอะไร ที่แสดงอยู่คือเมื่อ ESP32 เชื่อมต่อ Wifi ได้จะมีการแจ้งเตือน 1 ครั้ง)
ในส่วนของ Solar cell นั้นจะตรวจจับแสงอยู่ตลอดเวลา
การทดลอง
การทดลองโซล่าเซลล์ ด้วยวิธีการส่องแสงสว่างทิศ บน ล่าง ละ 20 ครั้งเพื่อบันทึกผลออกมาว่าตรงตามที่ต้องการหรือไม่ หลังจากนั้นคิดเป็นร้อยละ ของทิศทั้งสอง ผลที่ได้คือ มีความถูกต้องในการเปรียบเทียบกัน ร้อยละ 100
การทดลองชาร์จแบตเตอรี่ เป็นเวลา 1ชั่วโมง จากภาพจะเห็นได้ว่ากราฟมีแนวโน้มที่ขึ้นเพียงเล็กน้อยโดยในตอนเริ่มแรกแรงดันไฟประมาณ 3.12V เมื่อผ่านไป 1ชั่วโมงมีแรงดันไฟประมาณ 3.37 ทั้งนี้ความเร็วในการชาร์จแบตเตอรี่ขึ้นอยู่กับการผลิตไฟฟ้าจากแผงโซลาร์เซลล์ในที่นี้ได้ใช้แผงโซลาร์เซลล์ 5V 60mA 2แผง ต่อขนาดกันจึงเท่ากับ 120ma ถ้าต้องการชาร์จให้เร็วมากยิ่งขึ้นก็สามารถเพิ่มจำนวณของแผงโซลาร์เซลล์ได้
7. สรุปผลและข้อเสนอแนะ
1.สรุปผลการทดลอง
จากผลการทดสอบตัวโซล่าชาร์จไอโอทีทำงานได้อย่างมีประสิทธิภาพตรงตามเงื่อนไข ตามที่ทดลอง ได้แก่
1.1 ตัว Solar panel ได้หมุนไปตามทิศทางที่มีแสง
1.2 มีการแจ้งเตือนเมื่อแบตเตอรี่พร้อมใช้งานแล้ว
1.3 มีการเก็บข้อมูลขึ้นบน Thingspeak
1.4 ชาร์จแบตเตอรี่ได้
2.ข้อเสนอแนะ
2.1 ความเร็วในการชาร์จแบตเตอรี่สามารถเพิ่มขึ้นได้โดยการเพิ่มพลังการผลิตไฟ
2.2 ประยุกต์ใช้ในการสร้างโซล่าชาร์จไอโอทีที่จ่ายไฟด้วยตัวโซล่าเซลล์เองได้
8. ข้อมูลอ้างอิง
8.1 OLED
Battery Percentage Check Oled Display Useing Arduino
การติดตั้งไลบารี่ OLED i2c
8.2 Thinkspeak
IoT Based Battery Status Monitoring System
8.3 LINE Notify
สอนใช้งาน NodeMCU ESP32 ส่งข้อความ สติ๊กเกอร์ รูปภาพ แจ้งเตือนผ่าน LINE Notify
EP08 มาเริ่มเขียนโปรแกรม Check low Battery แจ้งเตือนผ่าน Line notify
8.4 LDR to Servo
Dual Axis Solar Tracker Arduino Project Using LDR and Servo Motors
8.5 การต่อและแปลงค่าแบตเตอรี่
SENSING BATTERY VOLTAGE WITH AN ARDUINO
8.6 การเปลี่ยน delay เป็น millis
ลดการใช้ delay() หันมาใช้ millis() / micros() กันดีกว่า!