สารบัญ:

นาฬิกาเรียลไทม์กับ Arduino: 3 ขั้นตอน
นาฬิกาเรียลไทม์กับ Arduino: 3 ขั้นตอน

วีดีโอ: นาฬิกาเรียลไทม์กับ Arduino: 3 ขั้นตอน

วีดีโอ: นาฬิกาเรียลไทม์กับ Arduino: 3 ขั้นตอน
วีดีโอ: นาฬิกาดิจิตอล/LCD Time oclock 2024, กรกฎาคม
Anonim
นาฬิกาแบบเรียลไทม์ด้วย Arduino
นาฬิกาแบบเรียลไทม์ด้วย Arduino

ในโครงการนี้ เราจะสร้างนาฬิกาด้วยความช่วยเหลือของโมดูล Arduino และ RTC เนื่องจากเราทราบดีว่า Arduino ไม่สามารถแสดงเวลาจริงได้ ดังนั้นเราจะใช้โมดูล RTC เพื่อแสดงเวลาที่เหมาะสมบน LCD อ่านทุกขั้นตอนอย่างระมัดระวัง มันจะช่วยคุณได้มากในการทำเครื่องจักร

รหัส DS3231 Arduino เหมือนกับรหัส DS1307 และใช้งานได้กับทั้งชิป RTC

รหัส Arduino ด้านล่างไม่ได้ใช้ไลบรารีใด ๆ สำหรับ DS3231 RTC ไลบรารี Wire สำหรับการโต้ตอบระหว่าง Arduino และ DS3231 โดยใช้แบบแผน I2C

ใช่! วิศวกรอิเล็กทรอนิกส์หลายคนพึ่งพาโครงการตามเวลา แต่ RTC ไม่น่าเชื่อถืออย่างสมบูรณ์ เป็นแบบใช้แบตเตอรี่และต้องเปลี่ยนไม่ช้าก็เร็ว เมื่อมาถึงโปรเจ็กต์ IoT จะใช้พิน SPI (Serial Peripheral Interface) อันมีค่า และทำให้ยุ่งเหยิงด้วยสายไฟที่พันกัน วิธีแก้ไข….นี่คือ NTP ฮีโร่ของเรา (โปรโตคอลเวลาเครือข่าย) NTP นั้นแม่นยำมากเนื่องจากได้รับเวลาจากอินเทอร์เน็ต เราจะใช้โปรโตคอลนี้โดยใช้โหมดไคลเอนต์ - เซิร์ฟเวอร์ กระบวนการนี้ง่ายมากที่ Nodemcu ของเราทำหน้าที่เป็นไคลเอนต์และขอแพ็กเก็ต NTP จากเซิร์ฟเวอร์โดยใช้ UDP ในทางกลับกัน เซิร์ฟเวอร์ส่งแพ็กเก็ตไปยังไคลเอนต์ซึ่งแยกวิเคราะห์ข้อมูล NTP เป็นโปรโตคอลการซิงโครไนซ์เวลาสากล ตอนนี้เรามาจุดไฟสถานีงานในแล็บกันเถอะ

ขั้นตอนที่ 1: ส่วนประกอบที่จำเป็น

  • บอร์ด Arduino
  • บอร์ด DS3231 RTC
  • จอ LCD 16x2
  • 2 x ปุ่มกด
  • ตัวต้านทานปรับค่าได้ 10K โอห์ม (หรือโพเทนชิออมิเตอร์)
  • ตัวต้านทาน 330 โอห์ม
  • แบตเตอรี่เซลล์แบบเหรียญ 3V
  • เขียงหั่นขนม
  • สายจัมเปอร์

โมเลกุล RTC DS3231

เวลาเป็นความรู้สึกที่จำเป็นในโลกที่เร่งรีบของมนุษย์ ในโครงการเรียลไทม์

เราใช้ RTC(A. K. A Real-time clock)

RTC Real-time-clock (RTC) คือวงจรรวม (IC) ที่คอยติดตามเวลาปัจจุบัน RTC ดูแลเวลาในโหมดจริง RTC มักพบในเมนบอร์ดคอมพิวเตอร์และระบบฝังตัวเพื่อให้เข้าถึงได้ทันท่วงที

ขั้นตอนที่ 2: การเชื่อมต่อนาฬิกา Arduino

การเชื่อมต่อนาฬิกา Arduino
การเชื่อมต่อนาฬิกา Arduino
  • เชื่อมต่อพิน SCL กับโมดูล RTC กับ Arduino A5
  • เชื่อมต่อพิน SDA กับโมดูล RTC กับ Arduino A4
  • เชื่อมต่อ VCC TO 5v และ GND TO GND
  • เชื่อมต่อปุ่มกดกับพิน 8
  • เชื่อมต่อปุ่มกดอื่นกับพิน 9
  • เชื่อมต่อ RS ของ LCD กับขา 2 ของ Arduino
  • เชื่อมต่อ E ของ LCD กับขา 3 ของ Arduino
  • เชื่อมต่อ D7 ของ LCD กับพิน 7 ของ Arduino
  • เชื่อมต่อ D6 ของ LCD กับพิน 6 ของ Arduino
  • เชื่อมต่อ D5 ของ LCD กับพิน 5 ของ Arduino
  • เชื่อมต่อ D4 ของ LCD กับพิน 4 ของ Arduino
  • เชื่อมต่อ VSS & K กับ GND
  • เชื่อมต่อ VDD & A กับ 5v
  • เชื่อมต่อ vo กับพินเอาต์พุตโพเทนชิออมิเตอร์

ขั้นตอนที่ 3: รหัสสำหรับนาฬิกา Arduino พร้อม RTC

รหัสสำหรับนาฬิกา Arduino พร้อม RTC
รหัสสำหรับนาฬิกา Arduino พร้อม RTC

DS3231 ใช้งานได้กับรูปแบบ BCD เท่านั้นและเพื่อแปลง BCD เป็นทศนิยมและในทางกลับกัน ฉันใช้ 2 บรรทัดด้านล่าง (ตัวอย่างเป็นนาที):// แปลง BCD เป็น decimalminute = (นาที >> 4) * 10 + (นาที & 0x0F);

// แปลงทศนิยมเป็น BCDminute = ((นาที / 10) << 4) + (นาที% 10); void DS3231_display(): แสดงเวลาและปฏิทิน ก่อนแสดงข้อมูลเวลาและปฏิทินจะถูกแปลงจาก BCD เป็นรูปแบบทศนิยม void blink_parameter():

// นาฬิกาและปฏิทินแบบเรียลไทม์พร้อมปุ่มตั้งค่าโดยใช้ DS3231 และ Arduino // รวมรหัสไลบรารี LCD #include // รวมรหัสไลบรารีสาย (จำเป็นสำหรับอุปกรณ์โปรโตคอล I2C) #include // การเชื่อมต่อโมดูล LCD (RS, E, D4, D5, D6, D7) LiquidCrystal LCD (2, 3, 4, 5, 6, 7); การตั้งค่าเป็นโมฆะ () { pinMode (8, INPUT_PULLUP); // button1 เชื่อมต่อกับพิน 8 pinMode (9, INPUT_PULLUP); // button2 เชื่อมต่อกับพิน 9 // ตั้งค่าจำนวนคอลัมน์และแถวของ LCD lcd.begin(16, 2); Wire.begin(); // เข้าร่วมบัส i2c } char Time = "TIME::: "; ถ่านปฏิทิน = "DATE: / /20"; ไบต์ i, วินาที, นาที, ชั่วโมง, วันที่, เดือน, ปี; เป็นโมฆะ DS3231_display () { // แปลง BCD เป็นทศนิยมวินาที = (วินาที >> 4) * 10 + (วินาที & 0x0F); นาที = (นาที >> 4) * 10 + (นาที & 0x0F); ชั่วโมง = (ชั่วโมง >> 4) * 10 + (ชั่วโมง & 0x0F); วันที่ = (วันที่ >> 4) * 10 + (วันที่ & 0x0F); เดือน = (เดือน >> 4) * 10 + (เดือน & 0x0F); ปี = (ปี >> 4) * 10 + (ปี & 0x0F); // สิ้นสุดการแปลงเวลา [12] = วินาที % 10 + 48; เวลา [11] = วินาที / 10 + 48; เวลา[9] = นาที % 10 + 48; เวลา[8] = นาที / 10 + 48; เวลา[6] = ชั่วโมง % 10 + 48; เวลา[5] = ชั่วโมง / 10 + 48; ปฏิทิน[14] = ปี % 10 + 48; ปฏิทิน[13] = ปี / 10 + 48; ปฏิทิน[9] = เดือน % 10 + 48; ปฏิทิน[8] = เดือน / 10 + 48; ปฏิทิน[6] = วันที่ % 10 + 48; ปฏิทิน[5] = วันที่ / 10 + 48; lcd.setCursor(0, 0); lcd.print(เวลา); // แสดงเวลา lcd.setCursor(0, 1); lcd.print (ปฏิทิน); // แสดงปฏิทิน } เป็นโมฆะ blink_parameter(){ ไบต์ j = 0; ในขณะที่(j 23) // ถ้าชั่วโมง > 23 ==> ชั่วโมง = 0 พารามิเตอร์ = 0; if(i == 1 && พารามิเตอร์ > 59) // ถ้านาที > 59 ==> นาที = 0 พารามิเตอร์ = 0; if(i == 2 && พารามิเตอร์ > 31) // ถ้า date > 31 ==> date = 1 พารามิเตอร์ = 1; if(i == 3 && พารามิเตอร์ > 12) // ถ้าเดือน > 12 ==> เดือน = 1 พารามิเตอร์ = 1; if(i == 4 && พารามิเตอร์ > 99) // ถ้าปี > 99 ==> ปี = 0 พารามิเตอร์ = 0; sprintf(ข้อความ "%02u" พารามิเตอร์); lcd.setCursor(x, y); lcd.print(ข้อความ); ล่าช้า(200); // รอ 200ms } lcd.setCursor(x, y); lcd.print(" "); // แสดงสองช่องว่าง blink_parameter(); sprintf(ข้อความ "%02u" พารามิเตอร์); lcd.setCursor(x, y); lcd.print(ข้อความ); blink_parameter(); if(!digitalRead(8)){ // หากกดปุ่ม (พิน #8) i++; // เพิ่ม 'i' สำหรับพารามิเตอร์ return พารามิเตอร์ถัดไป // ส่งกลับค่าพารามิเตอร์และออก } } } void loop() { if(!digitalRead(8)){ // ถ้ากดปุ่ม (pin #8) i = 0; ชั่วโมง = แก้ไข (5, 0, ชั่วโมง); นาที = แก้ไข (8, 0, นาที); วันที่ = แก้ไข (5, 1, วันที่); เดือน = แก้ไข (8, 1, เดือน); ปี = แก้ไข (13, 1, ปี); // แปลงทศนิยมเป็นนาที BCD = ((นาที / 10) << 4) + (นาที% 10); ชั่วโมง = ((ชั่วโมง / 10) << 4) + (ชั่วโมง % 10); วันที่ = ((วันที่ / 10) << 4) + (วันที่ % 10); เดือน = ((เดือน / 10) << 4) + (เดือน % 10); ปี = ((ปี / 10) << 4) + (ปี % 10); // สิ้นสุดการแปลง // เขียนข้อมูลไปยัง DS3231 RTC Wire.beginTransmission(0x68); // เริ่มโปรโตคอล I2C ด้วยที่อยู่ DS3231 Wire.write(0); // ส่งที่อยู่ลงทะเบียน Wire.write(0); // รีเซ็ต sesonds และเริ่ม oscillator Wire.write (นาที); // เขียนนาที Wire.write(ชั่วโมง); // เขียนชั่วโมง Wire.write(1); // เขียนวัน (ไม่ได้ใช้) Wire.write (วันที่); // เขียนวันที่ Wire.write (เดือน); // เขียนเดือน Wire.write(ปี); // เขียนปี Wire.endTransmission(); // หยุดการส่งและปล่อยความล่าช้าของบัส I2C (200); // รอ 200ms } Wire.beginTransmission(0x68); // เริ่มโปรโตคอล I2C ด้วยที่อยู่ DS3231 Wire.write(0); // ส่งที่อยู่ลงทะเบียน Wire.endTransmission(เท็จ); // I2C รีสตาร์ท Wire.requestFrom(0x68, 7); // ขอ 7 ไบต์จาก DS3231 และปล่อยบัส I2C เมื่อสิ้นสุดการอ่านวินาที = Wire.read(); // อ่านวินาทีจากการลงทะเบียน 0 นาที = Wire.read(); // อ่านนาทีจากการลงทะเบียน 1 ชั่วโมง = Wire.read(); // อ่านชั่วโมงจากการลงทะเบียน 2 Wire.read(); // อ่านวันจากการลงทะเบียน 3 (ไม่ได้ใช้) วันที่ = Wire.read(); // อ่านวันที่จากการลงทะเบียน 4 เดือน = Wire.read(); // อ่านเดือนจากการลงทะเบียน 5 ปี = Wire.read(); // อ่านปีจากทะเบียน 6 DS3231_display(); // แสดงเวลาและปฏิทินล่าช้า (50); // รอ 50ms }

แนะนำ: