ในการกวดวิชานี้เราจะได้เรียนรู้เกี่ยวกับนาฬิกาเวลาจริง (RTC) และเชื่อมกับ ESP32และจอแสดงผล OLED
เราจะใช้โมดูล DS3231 RTCเพื่อติดตามเวลาที่ถูกต้องและแสดงบน SPI OLED โดยใช้ ESP32 เป็นไมโครคอนโทรลเลอร์ของเรา ESP32 เป็นมากกว่าไมโครคอนโทรลเลอร์ มีชิป Wi-Fi และบลูทู ธ อยู่ข้างในและหมุด 39 GPIO รองรับโปรโตคอลการสื่อสารทั้งหมดเช่น SPI, I2C, UART และอื่น ๆ หากคุณยังใหม่กับ ESP32 ก่อนอื่นให้อ่านบทแนะนำการเริ่มต้นใช้งาน ESP32
RTC คืออะไร ??
DS3231 เป็นโมดูล RTC (นาฬิกาเวลาจริง) ใช้เพื่อรักษาวันที่และเวลาสำหรับโครงการอิเล็กทรอนิกส์ส่วนใหญ่ โมดูลนี้มีแหล่งจ่ายไฟเซลล์แบบเหรียญของตัวเองโดยใช้ซึ่งจะรักษาวันที่และเวลาแม้ว่าจะถอดไฟหลักออกหรือ MCU ผ่านการฮาร์ดรีเซ็ตแล้วก็ตาม ดังนั้นเมื่อเราตั้งวันที่และเวลาในโมดูลนี้ระบบจะติดตามมันอยู่เสมอ RTC IC มีหลายประเภทเช่น DS1307, DS3231 เป็นต้น
ก่อนหน้านี้เราเคยใช้ DS3231 RTC กับ Arduino ในโครงการด้านล่าง:
- เครื่องป้อนสัตว์เลี้ยงอัตโนมัติโดยใช้ Arduino
- Arduino Data Logger
หมายเหตุ: เมื่อใช้โมดูลนี้เป็นครั้งแรกคุณต้องตั้งวันที่และเวลา คุณยังสามารถใช้ RTC IC DS1307 ซึ่งก่อนหน้านี้เราเคยใช้ DS1307 กับ Arduino
ทำความรู้จักกับจอแสดงผล OLED:
คำว่า OLED ย่อมาจาก " Organic Light emitting diode" ซึ่งใช้เทคโนโลยีเดียวกับที่ใช้ในโทรทัศน์ส่วนใหญ่ของเรา แต่มีพิกเซลน้อยกว่าเมื่อเทียบกับพวกเขา การมีโมดูลแสดงผลที่ดูดีเหล่านี้เป็นเรื่องสนุกเพราะจะทำให้โครงการของเราดูเท่ เราได้กล่าวถึงบทความฉบับเต็มเกี่ยวกับจอแสดงผล OLED และประเภทต่างๆที่นี่
เราจะใช้สีขาวดำ 7 พิน SSD1306 0.96” จอแสดงผล เหตุผลในการเลือกจอแสดงผลนี้คือสามารถทำงานกับโปรโตคอลการสื่อสารที่แตกต่างกันสามแบบเช่นโหมด SPI 3 Wire, โหมด SPI four wire และโหมด IIC บทช่วยสอนนี้จะกล่าวถึงวิธีการใช้โมดูลในโหมด SPI 4 สายเนื่องจากเป็นโหมดการสื่อสารที่เร็วที่สุดและเป็นโหมดเริ่มต้น
พินและฟังก์ชันต่างๆได้อธิบายไว้ในตารางด้านล่าง
หมายเลขพิน |
ชื่อพิน |
ชื่ออื่น |
การใช้งาน |
1 |
Gnd |
พื้น |
ขากราวด์ของโมดูล |
2 |
Vdd |
Vcc, 5V |
พินเพาเวอร์ (ทนได้ 3-5V) |
3 |
SCK |
D0, SCL, CLK |
ทำหน้าที่เป็นเข็มนาฬิกา ใช้สำหรับทั้ง I2C และ SPI |
4 |
SDA |
D1, MOSI |
พินข้อมูลของโมดูล ใช้สำหรับทั้ง IIC และ SPI |
5 |
RES |
RST, รีเซ็ต |
รีเซ็ตโมดูล (มีประโยชน์ระหว่าง SPI) |
6 |
กระแสตรง |
A0 |
พินคำสั่งข้อมูล ใช้สำหรับโปรโตคอล SPI |
7 |
CS |
ชิปเลือก |
มีประโยชน์เมื่อใช้มากกว่าหนึ่งโมดูลภายใต้โปรโตคอล SPI |
ในบทช่วยสอนนี้เราจะใช้งานโมดูลในโหมด 4-Wire SPI เราจะปล่อยให้ส่วนที่เหลือสำหรับบทช่วยสอนอื่น ๆ
ชุมชน Arduino ได้มอบไลบรารีจำนวนมากให้เราแล้วซึ่งสามารถใช้โดยตรงเพื่อทำให้สิ่งนี้ง่ายขึ้น ฉันลองใช้ห้องสมุดสองสามแห่งและพบว่าห้องสมุด Adafruit_SSD1306 นั้นใช้งานง่ายมากและมีตัวเลือกกราฟิกจำนวนหนึ่งดังนั้นเราจะใช้สิ่งเดียวกันในบทช่วยสอนนี้ แต่ถ้าโปรเจ็กต์ของคุณมีข้อ จำกัด ด้านหน่วยความจำ / ความเร็วให้ลองใช้ U8g Library เพราะมันทำงานได้เร็วขึ้นและใช้หน่วยความจำโปรแกรมน้อยลง
เราได้เชื่อมต่อ OLED กับ Raspberry pi และ Arduino ด้วย
วัสดุที่ต้องการ:
- ESP32
- โมดูล DS3231 RTC
- โมดูลแสดงผล OLED 7 พิน 128 × 64 (SSD1306)
- สายไฟตัวผู้ - ตัวเมีย
- เขียงหั่นขนม
แผนภูมิวงจรรวม:
แผนภาพวงจรเพื่อเชื่อมต่อ RTC3231 กับบอร์ด ESP แสดงไว้ด้านล่าง:
RTC DS3231 IC ใช้โหมดการสื่อสารI2C มีพิน SCL, SDA, Vcc และ GND ออกมา การเชื่อมต่อโมดูล RTC กับ ESP32มีดังต่อไปนี้:
- SCL ของ RTC -> SCL ของ ESP32 เช่น Pin D22
- SDA ของ RTC -> SDA ของ ESP32 เช่น Pin D21
- GND ของ RTC -> GND ของ ESP32
- Vcc ของ RTC -> Vcc ของ ESP32
ที่นี่เรากำลังใช้โหมด SPI เพื่อเชื่อมต่อโมดูลการแสดงผล OLED 128 × 64 (SSD1306)กับ ESP32 ดังนั้นจะใช้ 7 พิน การเชื่อมต่อกับ ESP32 กำหนดเป็น:
- CS (เลือกชิป) พินของ OLED -> PIN D5 ของ ESP32
- ขา DC ของ OLED -> PIN D4 ของ ESP32
- RES pin ของ OLED -> PIN D2 ของ ESP32
- SDA pin ของ OLED -> PIN D23 เช่น MOSI ของ ESP32
- SCK pin ของ OLED -> PIN D18 เช่น SCK ของ ESP32
- Vdd ของ OLED -> Vcc ของ ESP32
- GND ของ OLED -> GND ของ ESP32
คุณต้องการไฟล์บอร์ดสำหรับ ESP32 ของคุณ Check in board manager drop down menu ของ Arduino IDE for ESP32 dev kit. หากไม่มีให้ทำตามขั้นตอนที่ระบุในลิงค์ด้านล่าง:
circuitdigest.com/microcontroller-projects/getting-started-with-esp32-with-arduino-ide
คุณยังสามารถใช้ ESP12 สำหรับโครงการนี้เรียนรู้ที่นี่เพื่อใช้ ESP12
คำอธิบายรหัส:
รหัสที่สมบูรณ์สำหรับ ESP32มีให้ในตอนท้ายของบทความ เรากำลังอธิบายส่วนสำคัญบางส่วนของโค้ด
เราต้องการไลบรารีหลายแห่งเพื่อใช้ในรหัสของเราซึ่งสามารถดาวน์โหลดได้จากลิงค์ด้านล่าง:
1. Adafruit_SSD1306:
2. SPI:
3. Adafruit_GFX:
4. RTClib:
ดังนั้นเราจึงรวมไลบรารีทั้งหมด
# รวม
จากนั้นกำหนดพินทั้งหมดของ OLED คุณไม่จำเป็นต้องกำหนดพินสำหรับโมดูล RTC เนื่องจากพินเหล่านี้ถูกกำหนดไว้แล้วในไลบรารี WIRE
# กำหนด OLED_MOSI 23 # กำหนด OLED_CLK 18 # กำหนด OLED_DC 4 # กำหนด OLED_CS 5 # กำหนด OLED_RESET 2 จอแสดงผล Adafruit_SSD1306 (OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
ในฟังก์ชัน การตั้งค่า เราจะเรียกใช้ฟังก์ชัน rtc.adjust (DateTime (__ DATE__, __TIME__)) ซึ่งจะตั้งเวลาตามเวลาพีซีของเรา
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); ถ้า (! rtc.begin ()) { Serial.println ("ไม่พบ RTC"); ในขณะที่ (1); } rtc.adjust (DateTime (__ DATE__, __TIME__));
หลังจากนั้นเราเรียกฟังก์ชันการแสดงผลเพื่อแสดงบน OLED
display.begin (SSD1306_SWITCHCAPVCC); display.clearDisplay (); display.setTextColor (สีขาว); //display.startscrollright(0x00, 0x0F); // คุณสามารถยกเลิกการใส่ข้อคิดเห็นบรรทัดนี้เพื่อเลื่อนข้อความของคุณบน oled display.setTextSize (2); display.setCursor (0,5); display.print ("นาฬิกา"); // สิ่งนี้จะแสดงนาฬิกาบน OLED เป็นเวลา 3 วินาที display.display (); ล่าช้า (3000); }
จากนั้นในฟังก์ชั่น วนซ้ำ เราจะจัดเก็บเวลาของเราใน DateTime ตอนนี้ ตัวแปรที่กำหนดไว้ล่วงหน้าและแสดงเวลาโดยใช้ฟังก์ชันการแสดงผลเช่น setTextSize, setCursor เป็นต้นตั้งค่าสิ่งเหล่านี้ตามความต้องการของคุณและใช้ฟังก์ชัน display.println เพื่อแสดงบน OLED
โมฆะ loop () { DateTime now = rtc.now (); display.clearDisplay (); display.setTextSize (2); display.setCursor (75,0); display.println (now.second (), DEC);
นี่คือวิธีที่คุณสามารถแสดงเวลาบนOLED โดยใช้ ESP32และอย่างที่คุณทราบว่า ESP ขึ้นชื่อเรื่องความสามารถของ IoT ดังนั้นคุณจึงสามารถใช้สิ่งนี้เพื่อเผยแพร่เวลาบนอินเทอร์เน็ตได้ ในบทความถัดไปเราจะแสดงให้คุณเห็นเวลาอินเทอร์เน็ตบน ESP โดยไม่ต้องใช้โมดูล RTC ใด ๆ