|
本帖最后由 Cambridge 于 2015-8-7 10:51 编辑
之前在论坛里面看见有网友说要做一个钟表,刚好又买来了一个OLED屏,在论坛学习了一下OLED的使用,就自己写了一个这样的程序。但是许多网友表示U8G的库不能使用,而且编译也会很慢,我就用了adafruit的库。
这个库包含了许多使用的函数,例如display.drawCircle(x,y,r,color);display.drawLine(x0,y0,x1,y1,color)等。所以用这些函数就可以很快的画出我们的钟表。然后在利用DS1307得到时间的数据,用一系列的运算就可以做出模拟的钟表了。另外我们可以利用一个光敏电阻和中断,来实现当手挥过的时候,OLED屏的画面会切换,显示温度日期之类的信息。好了先上代码。连线是OLED:SCL--10,SDA--9,RST--13,DC--11;DS1307:SCL--A5,SDA--A4;光敏电阻:D2,还有一个10k欧下拉电阻
- #include <SPI.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include "RTClib.h"
- RTC_DS1307 rtc;
- /*initiate the OLED;*/
- #define OLED_MOSI 9
- #define OLED_CLK 10
- #define OLED_DC 11
- #define OLED_CS 12
- #define OLED_RESET 13
- Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
- #define NUMFLAKES 10
- #define XPOS 0
- #define YPOS 1
- #define DELTAY 2
- #define LOGO16_GLCD_HEIGHT 16
- #define LOGO16_GLCD_WIDTH 16
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!");
- #endif
- int counter=0;
- int light;
- int year1,month1,day1;
- int hour1;
- int minute1;
- int second1;
- float hx,hy,mx,my,sy,sx;
- float pi=3.1415926;
- void setup(){
- display.begin(SSD1306_SWITCHCAPVCC);
- display.clearDisplay();
- #ifdef AVR
- Wire.begin();
- #else
- Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
- #endif
- rtc.begin();
- if (! rtc.isrunning()) {
- Serial.println("RTC is NOT running!");
- // following line sets the RTC to the date & time this sketch was compiled
- rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
- // This line sets the RTC with an explicit date & time, for example to set
- // January 21, 2014 at 3am you would call:
- // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
- }
- attachInterrupt(0,counterChange,FALLING);
- }
- void loop(){
- DateTime now = rtc.now();
- year1=now.year();
- month1=now.month();
- day1=now.day();
- switch(counter){
- case 0:showtime();delay(200);break;
- case 1:showdate();delay(200);break;
- case 2:showweather();delay(200);break;
- }
- }
- void showtime(){
- display.clearDisplay();
- while(1){
- DateTime now = rtc.now();
-
- hour1=now.hour();
- if(hour1>=12)hour1=hour1-12;
- minute1=now.minute();
- second1=now.second();
- display.setTextSize(1);
- display.setTextColor(WHITE);
- display.setCursor(display.width()/2-2, display.height()/2+26-2);
- display.print("6");
- display.setCursor(display.width()/2+26-2, display.height()/2-2);
- display.print("3");
- display.setCursor(display.width()/2-5, display.height()/2-26-2);
- display.print("12");
- display.setCursor(display.width()/2-26-2, display.height()/2-2);
- display.print("9");
- display.fillCircle(77,10,1,WHITE);//1
- display.fillCircle(86,19,1,WHITE);//2
- display.fillCircle(86,45,1,WHITE);//4
- display.fillCircle(77,54,1,WHITE);//5
- display.fillCircle(51,54,1,WHITE);//7
- display.fillCircle(42,45,1,WHITE);//8
- display.fillCircle(42,19,1,WHITE);//10
- display.fillCircle(51,10,1,WHITE);//11
- display.fillCircle(64,32,1,WHITE);//center
- display.display();
- hx=18*sin((30.0*hour1+minute1/2.0)/180.0*pi);
-
- hy=18*cos((30.0*hour1+minute1/2.0)/180.0*pi);
-
- mx=22*sin((minute1*6.0)/180.0*pi);
-
- my=22*cos((minute1*6.0)/180.0*pi);
-
- sx=22*sin((second1*6.0)/180.0*pi);
-
- sy=22*cos((second1*6.0)/180.0*pi);
-
- display.drawLine(64,32,64+hx,32-hy,WHITE);//hour
- display.drawLine(64,32,64+mx,32-my,WHITE);//minute
- display.drawLine(64,32,64+sx,32-sy,WHITE);//second
- display.display();
- delay(950);
- display.clearDisplay();
-
- if(counter!=0)break;
- }
- }
- void showdate(){
- display.clearDisplay();
- while(1){
- display.setTextSize(1);
- display.setTextColor(WHITE);
- display.setCursor(40,20);
- display.print("Today is:");
- display.setCursor(40,28);
- display.print(year1);
- display.print("/");
- display.print(month1);
- display.print("/");
- display.print(day1);
- display.display();
-
- if(counter!=1)break;
- }
- }
- void showweather(){
- display.clearDisplay();
- while(1){
- display.setTextSize(1);
- display.setTextColor(WHITE);
- display.setCursor(20,20);
- display.print("temperature:28.3^C");
- display.display();
-
- if(counter!=2)break;
- }
- }
- void counterChange(){
- counter++;
- if(counter>2)counter=0;
- }
复制代码
还有很多地方还没完善,例如温度传感器还没加上,大家一起学习交流一下吧 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|