0406445 发表于 2015-3-29 11:56:37

新手玩oled,打算做个模拟时钟表,可是指针转不起来,求助

本帖最后由 0406445 于 2015-3-29 12:03 编辑

#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);        // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9

int center_w=u8g.getWidth()/2-1,
    center_h=u8g.getHeight()/2-1;//定下手表的中心点

   


void watch_ui()
{
u8g.drawDisc(center_w,center_h,2);//画一个实心圆
u8g.drawCircle(center_w,center_h,center_h);//一个以屏幕高度为直径的整圆
u8g.setFont(u8g_font_ncenB08);//调用库中一种宽度为8的字体
u8g.setFontPosTop();
u8g.drawStr(73,5,"1");
u8g.drawStr(82,13,"2");   
u8g.drawStr(88,26,"3");
u8g.drawStr(82,40,"4");
u8g.drawStr(73,48,"5");
u8g.drawStr(61,53,"6");
u8g.drawStr(48,48,"7");
u8g.drawStr(38,38,"8");
u8g.drawStr(33,27,"9");
u8g.drawStr(36,15,"10");
u8g.drawStr(46,6,"11");
u8g.drawStr(58,0,"12");
}

void clock(int hour,int minute,int sencond)
{
int hour_x,hour_y,minute_x,minute_y,sencond_x,sencond_y;
hour_x=cos(hour*30)*5+63,hour_y=sin(hour*30)*5+15;      //时针长度5
minute_x=cos(minute*30)*10+63,minute_y=sin(minute*30)*10+15;      //分针长度10
sencond_x=cos(sencond*30)*17+63,sencond_y=sin(sencond*30)*17+15;         //秒针长度17
u8g.drawLine(center_w,center_h,hour_x,hour_y);// 时针
u8g.drawLine(center_w,center_h,minute_x,minute_y);// 分针
u8g.drawLine(center_w,center_h,sencond_x,sencond_y);//秒针
}



void watch(int h,int m,int s)
{
u8g.firstPage();
do {
      watch_ui();
      clock(h,m,s);
      //u8g.setColorIndex(1);
} while( u8g.nextPage() );
}

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
      for(int h=0;h<12;h++)
          for(int m=0;m<60;m++)
            for(int s=0;s<60;s++)
            {
            Serial.println(h);
            Serial.println(m);
            Serial.println(s);
            watch(h,m,s);
            delay(1000);
            }
            
}


这是程序,我用的是中景的OLED1.3寸屏
还有几个问题,时针,分针,秒针怎么计算比较好,还有时钟内12个数字的摆放位置,我是不断调试才摆出这样位置,但是没用到算法,后期一些制作肯定没用,有没有好的算法推荐下

0406445 发表于 2015-3-29 11:58:04

设置了打印输出,循环中的h,m,s没问题啊,为什么指针转不起来

suoma 发表于 2015-3-29 16:34:59

我觉得数字时钟更容易

0406445 发表于 2015-3-29 18:02:49

suoma 发表于 2015-3-29 16:34 static/image/common/back.gif
我觉得数字时钟更容易

模拟的比较酷~~~但是就是不能转啊

butOn 发表于 2015-3-30 12:50:37

请问关于u8g库有没有不翻墙也可以看的详细资料?

0406445 发表于 2015-4-3 14:33:21

butOn 发表于 2015-3-30 12:50 static/image/common/back.gif
请问关于u8g库有没有不翻墙也可以看的详细资料?

直接看库自带的例子就可以了吧

林定祥 发表于 2015-4-3 17:20:40

0406445 发表于 2015-4-3 14:33 static/image/common/back.gif
直接看库自带的例子就可以了吧

模拟时钟的指针是画出来的,每一秒钟需要重画一次,画的过程清屏,重画.类是动画.:D

fatfox 发表于 2015-4-4 14:28:40

butOn 发表于 2015-3-30 12:50 static/image/common/back.gif
请问关于u8g库有没有不翻墙也可以看的详细资料?

U8glib 在 google code 上的文档,下载打包,避免翻墙~

butOn 发表于 2015-4-8 00:39:56

fatfox 发表于 2015-4-4 14:28 static/image/common/back.gif
U8glib 在 google code 上的文档,下载打包,避免翻墙~

谢谢!!         &#128522;

redfcl 发表于 2015-4-10 14:54:00

把 clock 改成這樣看看

void clock(int hour,int minute,int sencond)
{
int hour_x,hour_y,minute_x,minute_y,sencond_x,sencond_y;
hour_x=cos(hour*3.1412/30-3.1412/2)*8 + center_w;
hour_y=sin(hour*3.1412/30-3.1412/2)*8 + center_h;      //时针长度5
minute_x=cos(minute*3.1412/30-3.1412/2)*12+center_w ;
minute_y=sin(minute*3.1412/30-3.1412/2)*12+center_h;      //分针长度10
sencond_x=cos(sencond*3.1412/30-3.1412/2)*17+center_w;
sencond_y=sin(sencond*3.1412/30-3.1412/2)*17+center_h;         //秒针长度17
u8g.drawLine(center_w,center_h,hour_x,hour_y);// 时针
u8g.drawLine(center_w,center_h,minute_x,minute_y);// 分针
u8g.drawLine(center_w,center_h,sencond_x,sencond_y);//秒针
}

帕米 发表于 2015-4-10 15:35:31

我的悲催了.刚收到,点亮完好,手一拿杯子喝水勾到USB线了.掉地上就成这样了.:Q

老来疯 发表于 2015-5-3 19:24:01

我也用的是中景的 OLED1.3寸屏,可是主控是 QT1106 P07A ,由于没有相应驱动库文件,使用SSD1306驱动库只有上方1/4显示正常,下方乱码,请问您用的什么库文件。能帮我解决吗?

3火 发表于 2020-10-29 15:32:15

把DO while 放loop里
{

for(k=0;k<12;k++)

{

for(j=0;j<60;j++)

{

    for(i=0;i<60;i++)

    {

      u8g.firstPage();

      do {

         draw();

         } while( u8g.nextPage());

       delay(1000);   //时钟程序
页: [1]
查看完整版本: 新手玩oled,打算做个模拟时钟表,可是指针转不起来,求助