📜 ⬆️ ⬇️

OLED watch on arduino

The other day I decided to create a clock on the arduino with the display of time, current date, day of the week and air temperature on the OLED display. What came out of this look at the video.




List of required components:
')

First we need to download and install the necessary libraries:


Next, we connect everything according to the scheme

image

and load the first test sketch to test the display and the watch module

Sketch
#include <OLED_I2C.h> //     OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; //    extern uint8_t SmallFont[]; //    #include <DS1307.h> //      DS1307 rtc(A0, A1); void setup() { myOLED.begin(); rtc.halt(false); rtc.setDOW(SUNDAY); //    rtc.setTime(12, 0, 0); //   rtc.setDate(10, 05, 2015); //   } void loop(){ myOLED.setFont(SmallFont); myOLED.print(rtc.getDOWStr(), CENTER, 0); //    String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); myOLED.print(stringOne.substring(0,2), 4, 12); //   myOLED.print("/", 51, 12); //   myOLED.print(stringOne.substring(3,5), 75, 12); //   myOLED.setFont(SmallFont); myOLED.print(rtc.getDateStr(), CENTER, 57); //   myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); //   myOLED.print("-", 51, 12); myOLED.update(); delay(500); } 


after downloading the sketch, we will see a clock on the display as in the photo

image

As you can see, everything is displayed normally, but in order to add the Russian names of the days of the week we will need to initialize the Russian fonts by adding a line to the sketch

 extern uint8_t RusFont[]; 

and add lines to help us determine the ordinal number of the day of the week and display the name of the day in Russian.

 switch (t.dow) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } 

and comment out the lines

 // rtc.setDOW(MONDAY); // rtc.setTime(13, 25, 0); // rtc.setDate(27, 04, 2015); 

so that when you reload the sketch, do not reset the time. After that, the day of the week on our display will be displayed in Russian.

image

now change the month display by adding lines to the sketch

 switch (t.mon) { case 1: myOLED.print(String(t.date), 30, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 2: myOLED.print(String(t.date), 26, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 30, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 4: myOLED.print(String(t.date), 30, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 5: myOLED.print(String(t.date), 36, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 82, 57); break; case 6: myOLED.print(String(t.date), 35, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 7: myOLED.print(String(t.date), 35, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 8: myOLED.print(String(t.date), 28, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 9: myOLED.print(String(t.date), 24, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 94, 57); break; case 10: myOLED.print(String(t.date), 26, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 28, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 12: myOLED.print(String(t.date), 26, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } 

Why inscriptions in the sketch are displayed by an incomprehensible set of characters in this article Russian and Ukrainian fonts for OLED I2C display


Now our watch will look like in the photo.

image

For those who were too lazy to edit the sketch, there is a ready-made sketch below.

Sketch
 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; #include <DS1307.h> DS1307 rtc(A0, A1); Time t; void setup() { myOLED.begin(); rtc.halt(false); // rtc.setDOW(WEDNESDAY); // rtc.setTime(10, 02, 0); // rtc.setDate(29, 4, 2015); } void loop() { myOLED.setFont(RusFont); t = rtc.getTime(); switch (t.dow) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); myOLED.print(stringOne.substring(0, 2), 4, 12); myOLED.print("/", 51, 12); myOLED.print(stringOne.substring(3, 5), 75, 12); myOLED.setFont(RusFont); switch (t.mon) { case 1: myOLED.print(String(t.date), 30, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 2: myOLED.print(String(t.date), 26, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 30, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 4: myOLED.print(String(t.date), 30, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 5: myOLED.print(String(t.date), 36, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 82, 57); break; case 6: myOLED.print(String(t.date), 35, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 7: myOLED.print(String(t.date), 35, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 8: myOLED.print(String(t.date), 28, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 9: myOLED.print(String(t.date), 24, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 94, 57); break; case 10: myOLED.print(String(t.date), 26, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 28, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 12: myOLED.print(String(t.date), 26, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); myOLED.print("-", 51, 12); myOLED.update(); delay(500); } 


Now, let's further improve our OLED watches and add to them the temperature display, which we will read from the DS18B20 temperature sensor.

To display a picture with a thermometer on the OLED display and a degree icon, select a picture with a thermometer pattern and save it in a GIF format named term.gif using a graphical editor, and do the same with a picture with a degree icon - save it as grad.gif .

the pictures should be two-color (white and black), the available image formats are png, jpg, gif

My term.bmp image is 19 × 40 pixels and the grad.bmp image is 13 × 12 pixels. Then we need to convert two images using the online service www.rinkydinkelectronics.com

image

select our image file and click Make File

image

Click on Click here to download your file and save the file grad.c in the folder with our sketch, do the same with another image. Save and close the sketch. When reopened, it will have two more tabs with image files.

image

After that, add two lines to the sketch that initialize our image files.

 extern uint8_t term[]; extern uint8_t grad[]; 


and then display our images on the OLED display by adding lines

  myOLED.drawBitmap(4, 12, term, 19, 40); myOLED.drawBitmap(92, 12, grad, 13, 12); 


Add to our sketch for two cycles. In the first cycle, we will have the time displayed - let's call it void watch (); The second loop will read and display the temperature. Void temp ();

And in the main loop, void loop (); let's prescribe for rotation cycles a few lines of code

  if (x >= 10) { temp(); x=0; } else { watch(); } x++; 


In the loop, void temp (); write a piece of code to read and display the temperature

 for(int x = 0; x < 10; x++){ byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(150); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; String stringOne = rtc.getTimeStr(); myOLED.clrScr(); myOLED.setFont(SmallFont); myOLED.print(stringOne.substring(0, 5), 98, 0); myOLED.print(rtc.getDateStr(), 0, 0); myOLED.setFont(RusFont); myOLED.print("NTVGTHFNEHF", CENTER, 57); myOLED.drawBitmap(4, 12, term, 19, 40); myOLED.setFont(MegaNumbers); myOLED.print(String(Temp), CENTER, 12); myOLED.drawBitmap(92, 12, grad, 13, 12); myOLED.update(); myOLED.clrScr(); } 

In the void watch () loop ; let's write our code that is responsible for displaying time

After casting the sketch, our OLED watches must first display the time and then the temperature as in the video at the beginning of the article.

image

The full sketch can be downloaded via the link OLED_watch_temp.rar

Discussion of the article is available in our group vk.com

Source: https://habr.com/ru/post/257659/


All Articles