Агуулгын хүснэгт:

Arduino -той бодит цаг: 3 алхам
Arduino -той бодит цаг: 3 алхам

Видео: Arduino -той бодит цаг: 3 алхам

Видео: Arduino -той бодит цаг: 3 алхам
Видео: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Долдугаар сарын
Anonim
Arduino -той бодит цагийн цаг
Arduino -той бодит цагийн цаг

Энэ төсөлд бид Arduino болон RTC модулийн тусламжтайгаар цаг хийх болно. Бидний мэдэж байгаагаар Arduino нь бодит цагийг харуулах боломжгүй тул RTC модулийг ашиглан LCD дэлгэц дээр зөв цагийг харуулах болно. Алхам бүрийг анхааралтай уншаарай, энэ нь цагийн зүү хийхэд ихээхэн тус болно.

DS3231 Arduino код нь DS1307 кодтой адил бөгөөд RTC чиптэй хоёуланд нь ажилладаг.

Доорх Arduino код нь DS3231 RTC -ийн ямар ч номын санг ашигладаггүй, Wire номын сан нь I2C конвенцийг ашиглан Arduino болон DS3231 хоорондох захидал харилцаанд зориулагдсан болно.

Тийм ээ! Олон электроникийн инженерүүд цаг хугацааны төслүүдээс хамаардаг боловч RTC нь бүрэн найдвартай биш юм. Энэ нь батерейгаар ажилладаг тул удахгүй эсвэл дараа нь солих шаардлагатай болно. IoT төслүүдэд ирэхэд энэ нь үнэ цэнэтэй SPI (Цуваа захын интерфэйс) тээглүүрийг эзэлдэг бөгөөд утаснууд нь орооцолдсон байдаг. Шийдэл…. Энд манай баатар NTP (Сүлжээний цагийн протокол) гарч ирэв. Интернэтээс цаг авдаг тул NTP нь маш үнэн зөв байдаг. Бид энэхүү протоколыг үйлчлүүлэгч-серверийн горимоор ажиллуулах гэж байна. үйл явц нь маш энгийн тул манай Nodemcu үйлчлүүлэгчийн үүрэг гүйцэтгэдэг бөгөөд UDP ашиглан серверээс NTP пакет хүсдэг. Үүний хариуд сервер нь өгөгдлийг задлан шинжилдэг пакетийг үйлчлүүлэгчид илгээдэг. NTP бол бүх нийтийн цаг синхрончлолын протокол юм. Одоо лабораторийн ажлын байраа гэрэлтүүлцгээе

Алхам 1: Шаардлагатай бүрэлдэхүүн хэсгүүд

  • Arduino самбар
  • DS3231 RTC самбар
  • 16x2 хэмжээтэй LCD дэлгэцтэй
  • 2 x товчлуур
  • 10K ом хувьсах эсэргүүцэл (эсвэл потенциометр)
  • 330 Ом эсэргүүцэл
  • 3V зоосны батерей
  • Талхны самбар
  • Холбогч утас

RTC mocule DS3231

Цаг хугацаа бол хүн төрөлхтний энэ хурдацтай ертөнцөд зайлшгүй шаардлагатай мэдрэмж юм. Бодит цагийн төсөл дээр

Бид RTC (A. K. A бодит цагийн цаг) ашигладаг

RTC Real-time-clock (RTC) нь одоогийн цагийг хянадаг нэгдсэн хэлхээ юм. RTC нь ихэвчлэн компьютерийн эх хавтан болон суулгагдсан системд байдаг бөгөөд энэ нь цаг тухайд нь хандахыг шаарддаг.

Алхам 2: Arduino цагны холболт

Arduino цагны холболт
Arduino цагны холболт
  • SCL зүүг RTC модульд Arduino A5 руу холбоно уу
  • SDA зүүг RTC модульд Arduino A4 руу холбоно уу
  • VCC -ийг 5v, GND -ийг GND руу холбоно уу
  • 8 товчлуур дээр товчлуурыг холбоно уу
  • Өөр нэг товчлуурыг зүү 9 -т холбоно уу
  • LCD -ийн RS -ийг Arduino -ийн 2 -р зүү рүү холбоно уу
  • LCD E -ийг Arduino -ийн 3 -р зүү рүү холбоно уу
  • LCD D7 -ийг Arduino -ийн 7 -р зүү рүү холбоно уу
  • LCD D6 -ийг Arduino -ийн 6 -р зүү рүү холбоно уу
  • LCD D5 -ийг Arduino -ийн 5 -р зүү рүү холбоно уу
  • LCD D4 -ийг Arduino -ийн 4 -р зүү рүү холбоно уу
  • VSS & K -ийг GND руу холбоно уу
  • VDD & A -ийг 5v сүлжээнд холбоно уу
  • Во -г потенциометрийн гаралтын зүү рүү холбоно уу

Алхам 3: RTC -тэй Arduino цагны код

RTC -тэй Arduino цагны код
RTC -тэй Arduino цагны код

DS3231 нь зөвхөн BCD форматтай ажилладаг бөгөөд BCD -ийг аравтын бутархай руу хөрвүүлэхийн тулд би доорх 2 мөрийг ашигласан (жишээ нь минутын жишээ): // BCD -ийг арав дахь минут болгон хөрвүүлэх = (минут >> 4) * 10 + (минут & 0x0F);

// Аравтын бутархайг BCDminute болгон хөрвүүлэх = ((минут / 10) << 4) + (минут % 10); void DS3231_display (): цаг, хуанлийг харуулахаас өмнө цаг, хуанлийн өгөгдлийг BCD -ээс аравтын формат руу хөрвүүлдэг. void blink_parameter ():

// DS3231 болон Arduino ашиглан товчлуур бүхий товчлуур бүхий бодит цагийн цаг, хуанли // LCD номын сангийн кодыг оруулна #оруулах // утас номын сангийн кодыг оруулах (I2C протоколын төхөөрөмжүүдэд шаардлагатай) #оруулах // LCD модулийн холболт (RS, E, D4, D5), D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 нь 8 pinMode (9, INPUT_PULLUP) зүүтэй холбогдсон байна; // button2 нь 9 -р зүүтэй холбогдсон байна // LCD -ийн багана, мөрийн тоог тохируулах lcd.begin (16, 2); Wire.begin (); // i2c автобусанд нэгдэх} char Time = "TIME:::"; char Календар = "ОГНОО: / / 20"; байт i, секунд, минут, цаг, огноо, сар, жил; void 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 (Календарь); // Календарийг харуулах} void blink_parameter () {байт j = 0; while (j 23) // Хэрэв цаг> 23 ==> цаг = 0 параметр = 0; if (i == 1 && parameter> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && parameter> 31) // If date> 31 ==> date = 1 parameter = 1; if (i == 3 && параметр> 12) // Хэрэв сар> 12 ==> сар = 1 параметр = 1; if (i == 4 && parameter> 99) // If year> 99 ==> year = 0 parameter = 0; sprintf (текст, "%02u", параметр); lcd.setCursor (x, y); lcd.хэвлэх (текст); саатал (200); // 200ms хүлээ} lcd.setCursor (x, y); lcd.print (""); // Хоёр орон зайг харуулах blink_parameter (); sprintf (текст, "%02u", параметр); lcd.setCursor (x, y); lcd.хэвлэх (текст); blink_parameter (); if (! digitalRead (8)) {// If (pin #8) товчлуур дарагдсан бол i ++; // Дараагийн параметр буцах параметрийн хувьд 'i' -г нэмэгдүүлэх; // Параметрийн утгыг буцааж,}}} void loop () {if (! DigitalRead (8)) {// If (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) руу өгөгдөл бичих; // DS3231 хаягтай I2C протоколыг эхлүүлэх Wire.write (0); // Wire.write регистрийн хаягийг илгээх (0); // Сезондуудыг дахин тохируулж, осцилляторыг эхлүүл Wire.write (минут); // минут бичих Wire.write (цаг); // бичих цаг Wire.write (1); // бичих өдөр (ашиглагдаагүй) Wire.write (огноо); // Огноо бичих Wire.write (сар); // бичих сар Wire.write (жил); // Wire.endTransmission жил бичих (); // Дамжуулалтыг зогсоож, I2C автобусны саатлыг суллах (200); // 200ms хүлээнэ үү} Wire.beginTransmission (0x68); // DS3231 хаягтай I2C протоколыг эхлүүлэх Wire.write (0); // Wire.endTransmission бүртгэлийн хаягийг илгээх (худал); // I2C дахин эхлүүлэх Wire.requestFrom (0x68, 7); // DS3231 -ээс 7 байт хүсэх ба I2C автобусыг секундын унших төгсгөлд суллах = Wire.read (); // Бүртгэлээс секунд унших 0 минут = Wire.read (); // Бүртгэлээс минутыг унших 1 цаг = Wire.read (); // 2 Wire.read () регистрээс унших цаг. // Бүртгэлээс уншсан өдөр 3 (ашиглагдаагүй) огноо = Wire.read (); // Бүртгэлээс огноог унших 4 сар = Wire.read (); // Бүртгэлээс сар унших 5 жил = Wire.read (); // 6 жилийн бүртгэлээс уншсан жил DS3231_display (); // Diaplay цаг ба хуанлийн саатал (50); // 50 минут хүлээ}

Зөвлөмж болгож буй: