找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4105|回复: 6
收起左侧

Arduino诺基亚5110屏 自行车码表DIY制作 附源程序

[复制链接]
ID:452984 发表于 2019-9-25 15:20 | 显示全部楼层 |阅读模式
参考网上的资料,自己增加了一些功能,利用现有零件自己做了一个码表。(后面有代码)

正面

正面

背面

背面

插入霍尔感应头(自制)

插入霍尔感应头(自制)





插入霍尔感应探头后的样子,我用的是3.5的耳机插头,霍尔感应器一端应固定在自行车前叉上,磁铁固定在辐条上对准霍尔器件即可。
感应到后应该亮指示灯,如果不亮将磁铁的磁极调换方向就行。

感应头背面是个5V升压的模块

感应头背面是个5V升压的模块

自制的霍尔感应探头

自制的霍尔感应探头


上电后的样子(锂电池供电)
IMG_20190925_142557.jpg

按下正面的按键背光灯亮起,4档亮度可调,每按一次按键增加一档亮度直到熄灭,循环。
IMG_20190925_142609.jpg IMG_20190925_142614.jpg

IMG_20190925_142846.jpg IMG_20190925_142852.jpg IMG_20190925_142855.jpg

正面显示依次为及时速度,时间,电量,MSPEED平均时速,ONCE单次里程/时间,MILE总里程。
背面5个按键可调节SPEED/L限速报警,和Wheel radius车轮半径设置
IMG_20190925_142801.jpg IMG_20190925_142804.jpg IMG_20190925_142812.jpg

用钕铁硼磁铁演示了一下,磁铁放在上面2cm左右灯亮。



学习arduino时间不长,实际使用中随没有发现错误,但自觉程序有些繁琐,望高手能够精简代码。


zi_xing_che_ma_biao.rar (6.26 KB, 下载次数: 37)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2019-9-25 15:43 | 显示全部楼层
好东东啊,楼主的诺基亚5110屏码表源程序如下:
  1. /*=========自行车码表=========*/

  2. #include "Arduino.h"
  3. #include "U8glib.h"
  4. #include <Wire.h>
  5. #include <EEPROM.h>
  6. #include <DS1307.h>
  7. //#include <IRremote.h>
  8. //#define LCD_CMD   0
  9. #define zdpin 1  //中断源可选值为0或1,分别对应2号和3号引脚
  10. #define timeOUT 3000    //检测速度超时
  11. #define EEPDELAY 5000   //EEPROM更新检测
  12. #define refresh 5       //刷新圈数
  13. #define EEPROM_write(address, p) {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) EEPROM.write(address+i, pp[i]);}
  14. #define EEPROM_read(address, p)  {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) pp[i]=EEPROM.read(address+i);}

  15. int adc_key_val[5] ={50, 200, 400, 600, 800 };
  16. int NUM_KEYS = 5;
  17. int adc_key_in;
  18. int key = -1;
  19. int oldkey = -1;

  20. #define jsLCD 6000   //设置时显示时间
  21. boolean lcda = false; //boolean 数据类型 boolean 变量存储为 8 位(1 个字节)的数值形式,但只能是 True 或是 False
  22. boolean lcdb = false;
  23. long TIMELCDa; //长整数型变量 可以存储32位(4字节)
  24. long TIMELCDb;

  25. int LCDSW=0;//整数数据类型占用2字节,范围-32768到32767
  26. int lcdSW=0;

  27. int R;    //cm
  28. int V;   //km/h
  29. boolean Rsetup,Vsetup; //半径数值

  30. long CACHEDELAY;

  31. int Reep;     //xxeep判断数值是否更改,set为设置值
  32. int Veep;

  33. float MILEeep;  //浮点型数据,就是有小数点的数字,经常被用来模拟连续值

  34. struct config_type
  35. {
  36.   int EEPROMMILE;
  37.   int EEPROMMILEs;
  38.   int EEPROMR;
  39.   int EEPROMV;
  40. };
  41. /*-------lcd------*/
  42. U8GLIB_PCD8544 u8g(5, 6, 8, 7, 9);  // SPI Com: CLK = 5, DIN = 6, CE = 8, DC = 7, Reset = 9

  43. int BGKEY = 10;//背光灯按键引脚
  44. int SUM = 0; //背光灯亮度值
  45. int Flag_up = 1;  //按键扫描
  46. int beeppin = 12; //蜂鸣器引脚定义

  47. int num;
  48. float SPEED;
  49. float MSPEED;     //平均速度
  50. float ALLMILE;    //所有的里程
  51. float ONEMILE,ONEMILEcache;

  52. long RPM;        //每分钟的旋转次数
  53. /*------计时-----*/
  54. long timea,timeb;
  55. long time,timecache;
  56. boolean timeSTA;

  57. //*----time----*/
  58. String comdata = "";  //串口数据缓存
  59. int numdata[7] = {0},  j = 0, mark = 0;
  60. int rtc[7];
  61. int TIMEshi, TIMEfen, TIMEmiao; //时钟

  62. #define SHEtimeOUT 6000

  63. int sheshi, shefen;
  64. int shenum;

  65. boolean  shesta = false, shesw, sheDOWN = false, sheUP = false;
  66. long SHEtime;
  67. /*----MENU----*/
  68. //#define MENUtimeOUT 5000
  69. boolean  MENUup = false, MENUdown = false;//MENUsta = false, MENUsw = false, MENUup10x = false, MENUdown10x = false;

  70. //int MENUswNUM = 0;
  71. //long MENUtime;
  72. /*-------ir------*/
  73. //int RECV_PIN = A0;    //红外输入
  74. //IRrecv irrecv(RECV_PIN);//定义IRrecv对象来接收红外线信号
  75. //decode_results results;//解码结果放在decode_results构造的对象results里
  76. /*-----------------按键设置-----------------*/
  77. //将adc(模数转换器)值转换为键号
  78. int get_key(unsigned int input)
  79. {
  80.     int k;
  81.     for (k = 0; k < NUM_KEYS; k++)
  82.   {
  83.     if (input < adc_key_val[k])
  84.        return k;
  85.   }
  86.     if (k >= NUM_KEYS)k = -1;  // 未按有效键
  87.        return k;
  88. }
  89. /*利用芯片内部1.1v基准电压反算出电源电压(模拟输入端口A7)*/
  90. unsigned int ADCValue;
  91. double Voltage;
  92. double Vcc;
  93. //读取vcc电压
  94. long readVcc() {
  95.   long result;
  96.   // Read 1.1V reference against AVcc 读取1.1V AVcc
  97.   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  98.   delay(2); // Wait for Vref to settle 等待Vref解决
  99.   ADCSRA |= _BV(ADSC); // Convert 转换
  100.   while (bit_is_set(ADCSRA,ADSC));
  101.   result = ADCL;
  102.   result |= ADCH<<8;
  103.   result = 1125300L / result; // Back-calculate AVcc in mV 反算出AVcc 为mv
  104.   return result;
  105. }

  106. void setup ()
  107. {
  108. u8g.setContrast(140);//设置对比度0-255
  109.   pinMode(BGKEY, INPUT_PULLUP); //按键IO设定为带上拉输入
  110.   pinMode(11,OUTPUT); //该端口需要选择有~号标识的数字口(有~号表示是支持PWM的引脚)*/
  111.   pinMode(beeppin, OUTPUT);//蜂鸣器输出

  112. /*按着背光灯按键同时上电,开机后数据清零*/
  113. if(digitalRead(BGKEY) == LOW)
  114.     {
  115.       for (int i = 0 ; i < EEPROM.length() ; i++) {
  116.     EEPROM.write(i, 0);
  117.   }
  118.     }
  119.   Serial.begin(9600);
  120.   /*EEPROM读取赋值*/
  121.   config_type config_readback;
  122.   EEPROM_read(0, config_readback);

  123.   ALLMILE = float(config_readback.EEPROMMILE+(config_readback.EEPROMMILEs/10.0));
  124.   MILEeep = config_readback.EEPROMMILE;

  125.   R = config_readback.EEPROMR;
  126.   V = config_readback.EEPROMV;
  127.   Reep = config_readback.EEPROMR;
  128.   Veep = config_readback.EEPROMV;
  129.   attachInterrupt(zdpin,light,FALLING);     //检测中断
  130. /*中断函数(attachInterrupt):attachInterrupt(interrupt,function,mode)
  131. interrupt:中断源(在Arduino中,中断源可选值为0或1,一般分别对应2号和3号引脚)
  132. function:需要中断的函数名
  133. mode:LOW(低电平触发)、CHANGE(变化时触发)、
  134. RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)
  135. 注意:在写代码时,interrupt处要写成0或1,不能写成2或3*/
  136.   CACHEDELAY=millis();
  137.   ONEMILEcache=ALLMILE;
  138.   
  139.   RTC.SetOutput(DS1307_SQW32KHZ);
  140. // irrecv.enableIRIn();  //启动红外解码   开始采集
  141.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  142. adc_key_in = analogRead(0); //从传感器读取值
  143. key = get_key(adc_key_in); //转换成按键

  144. }
  145.   
  146. void loop()
  147. {   
  148.   Rsetup = false;
  149.   Vsetup = false;
  150.   MENUup = false;
  151.   MENUdown = false;
  152. // MENUup10x = false;
  153.   //MENUdown10x = false;
  154.   //MENUsw = false;
  155.   shesw = false;

  156.   RTC.get(rtc, true);
  157.   TIMEshi = rtc[2];
  158.   TIMEfen = rtc[1];
  159.   TIMEmiao = rtc[0];
  160. /*----------背光灯亮度调整----------*/

  161.    if ( ScanKey() == 1) //当有按键按下时
  162.       {
  163.         SUM+=63; //SUM加一
  164.         tone(beeppin,4000);
  165.         delay(30);
  166.         noTone(beeppin);
  167. }
  168.    if (SUM >252)
  169. {
  170. SUM = 0;
  171. }

  172. /*=================红外控制=================*/
  173.   //if (irrecv.decode(&results))
  174. // {
  175.   //  voir();
  176.   //}
  177.   /*=================按键控制=================*/
  178.     adc_key_in = analogRead(0);    //从传感器读取值
  179.     key = get_key(adc_key_in);  
  180.     if (key != oldkey)   //如果检测到按键
  181.    {
  182.     delay(50);  //去抖动时间
  183.         tone(beeppin,4000);
  184.         delay(30);
  185.         noTone(beeppin);
  186.     voir();
  187.    }
  188.   
  189.   /*=======码表=======*/
  190.   if(num>refresh)
  191.   {
  192.     jisuan();
  193.     timea=millis();
  194.     num=1;
  195.   }

  196.   ONEMILE=ALLMILE-ONEMILEcache;

  197.   if(millis()-timeb>timeOUT)
  198.   {
  199.     RPM=0; //每分钟圈数=0
  200.     SPEED=0;
  201.     timeSTA=false;
  202.     timecache=millis()-time;
  203.   }
  204.   else
  205.   {
  206.     timeSTA=true;
  207.     time=millis()-timecache;
  208.   }

  209.   if(ALLMILE>9999)
  210.   {
  211.     ALLMILE=0;
  212.   }

  213.   /*==========EEPROM==========*/
  214.   if (millis() - CACHEDELAY > EEPDELAY)
  215.   {
  216.     if(MILEeep != ALLMILE||Reep!=R||Veep!=V) //判断EEPROM是否有改变
  217.     {
  218.       eeprom_write();
  219.       MILEeep = ALLMILE;
  220.       Reep = R;
  221.       Veep =V;
  222.     }
  223.     CACHEDELAY=millis();
  224.   }

  225.   /*==============半径设置=================*/
  226.   if(Rsetup==true)
  227.     R++;

  228.   if(R>50)
  229.     R=1;
  230. //  if(R<10)
  231. //   R=60;
  232. /* ==============限速警报设置=================  */
  233.    if(Vsetup==true)
  234.     V += 5; //每按一次加 5 km/h
  235.    
  236.   if(V>120) //大于120 km/h 返回 5km/h
  237.     V=5;


  238.     /*==================Time======================*/
  239.     if(shesta == true)        //进入设置状态
  240.     {
  241.         voshe();
  242.     }
  243.     if(shesw == true)                //切换
  244.         shenum++;
  245.     if(shenum > 2)                //范围
  246.         shenum = 1;

  247.    /* RTC.get(rtc, true);
  248.     TIMEshi = rtc[2];
  249.     TIMEfen = rtc[1];
  250.     TIMEmiao = rtc[0];*/

  251.     if (sheshi > 23)
  252.     {
  253.         sheshi = 1;
  254.     }
  255.     if (sheshi < 0)
  256.     {
  257.         sheshi = 23;
  258.     }

  259.     if (shefen > 59)
  260.     {
  261.         shefen = 0;
  262.     }
  263.     if (shefen < 0)
  264.     {
  265.         shefen = 59;
  266.     }

  267.   /*===========LCD===========*/
  268.   if(Rsetup == true )       //半径设置触发
  269.   {
  270.     TIMELCDa = millis();
  271.     lcda = true;
  272.    
  273.   }
  274.   if(lcda == true)
  275.   {
  276.     voLCDadelay();
  277.   }

  278.   
  279.    if( Vsetup == true)       //限速报警设置触发
  280.   {
  281.     TIMELCDb = millis();
  282.     lcdb = true;
  283.    
  284.   }
  285.   if(lcdb == true)
  286.   {
  287.     voLCDbdelay();
  288.   }
  289.   
  290.   u8g.firstPage();  
  291.   do {
  292.     draw();
  293.   }
  294.   while( u8g.nextPage() );
  295.   
  296. if(SPEED > V) //
  297.    {
  298.     baojing();
  299.    }
  300.    else
  301.    {
  302.     digitalWrite(beeppin, LOW);
  303.    }
  304. }

  305. void jisuan()
  306. {
  307.   ALLMILE+=((float(refresh)*(2.0*3.1416*(R/100.0))))/1000.0; //总里程累加
  308.   RPM=60000/((millis()-timea)/refresh); //转速
  309.   SPEED=((RPM*(2.0*3.14159*(R/100.0)))*60.0)/1000.0; //速度
  310. }

  311. void light()        //计数
  312. {
  313.   num++;
  314.   timeb=millis();
  315. }

  316. void eeprom_write()
  317. {
  318.   config_type config;  // 定义结构变量config,并定义config的内容
  319.   config.EEPROMMILE = int(ALLMILE);
  320.   config.EEPROMMILEs = int(ALLMILE*10)%10;
  321.   config.EEPROMR = R;
  322.   config.EEPROMV = V;

  323.   EEPROM_write(0, config);   // 变量config存储到EEPROM,地址0写入
  324. }
  325.   
  326. void voadd(int add)
  327. {
  328.   if (add < 10)
  329.     u8g.print("0");
  330. }

  331. void voLCDadelay()         //显示超时
  332. {
  333.   if (millis() - TIMELCDa > jsLCD && lcda == true)                                //设置刷新频率
  334.   {
  335.     lcda = false;
  336.   }
  337. }

  338. void voLCDbdelay()
  339. {
  340.   if (millis() - TIMELCDb > jsLCD && lcdb == true)                                //设置刷新频率
  341.   {
  342.     lcdb = false;
  343.   }
  344. }

  345. void voir()
  346. {   
  347.   switch(key)
  348.         {
  349.            case 0:                 
  350.                   Rsetup = true;
  351.                   LCDSW=1;   
  352.                   break;
  353.            case 1:   
  354.                   Vsetup = true;
  355.                   lcdSW=1;  
  356.                   break;
  357.            case 2:
  358.                   shesw = true;
  359.                   voshe();
  360.                   voshesta();  
  361.                   break;
  362.            case 3:
  363.                   MENUdown = true;  
  364.                   break;      
  365.            case 4:
  366.                   MENUup = true;   
  367.                   break;  
  368.         }
  369.                         
  370. delay(100);
  371. }
  372. //将ADC值转换为键号
  373. /*
  374.   unsigned long remote = results.value;  //设红外信号为remote

  375.     if(remote == (-1))                //溢出时
  376.   {
  377.     Serial.print(results.value, HEX);   //输出红外线解码结果(十六进制)
  378.   }
  379.   switch (remote)
  380.   {      
  381.   case 0xFD6897:        //CH+  
  382.     Rsetup = true;
  383.     LCDSW=1;
  384.     break;   
  385.   case 0xFDE817:        //CH-  
  386.     Rsetdown = true;
  387.     LCDSW=1;
  388.     break;
  389.    case 0xFDA857:       //EQ
  390.         shesw = true;
  391.         voshe();
  392.         voshesta();
  393.         break;   
  394.      case 0xFD9867:    //-
  395.         MENUdown = true;
  396.         break;     
  397.    case 0xFD18E7:     //+
  398.         MENUup = true;
  399.         break;   
  400.      case 0xFD12ED:   //PREV
  401.         MENUdown10x = true;
  402.         break;
  403.     case 0xFD48B7:   //NEXT
  404.         MENUup10x = true;
  405.         break;
  406.   }

  407.   irrecv.resume();      // 返回值

  408. }
  409. */
  410. void draw() {
  411. Vcc = readVcc()/1000.0;//将读取的vcc电压mv转换为v
  412. ADCValue = analogRead(7);
  413. Voltage = (ADCValue / 1023.0) * Vcc;
  414. MSPEED=(ONEMILE/time)*1000*60*60;
  415.   u8g.setDefaultForegroundColor();
  416.   u8g.drawLine(0, 19,   83, 19);
  417.   u8g.drawLine(0, 27,   83, 27);
  418.   u8g.drawLine(27, 28,   27, 40);
  419.   u8g.drawLine(0, 41,   84, 41);

  420.   u8g.setFont(u8g_font_ncenB08r);
  421.   u8g.setPrintPos(45, 18);
  422.   u8g.print("Km/h");
  423. /*--------电量显示--------*/
  424. if (Voltage >=3.9){
  425.        u8g.drawLine(80, 2, 81, 2);
  426.        u8g.drawFrame(78,3,6,15);//电池外形
  427.        u8g.drawBox(80,5,2,2);//电池电量段
  428.        u8g.drawBox(80,8,2,2);
  429.        u8g.drawBox(80,11,2,2);
  430.        u8g.drawBox(80,14,2,2);
  431.     }
  432. if (Voltage <3.9 && Voltage >=3.7 ){
  433.        u8g.drawLine(80, 2, 81, 2);
  434.        u8g.drawFrame(78,3,6,15);//电池外形
  435.        u8g.drawBox(80,8,2,2);//电池电量段
  436.        u8g.drawBox(80,11,2,2);
  437.        u8g.drawBox(80,14,2,2);  
  438.     }
  439. if (Voltage <3.7 && Voltage>=3.5 ){
  440.        u8g.drawLine(80, 2, 81, 2);
  441.        u8g.drawFrame(78,3,6,15);//电池外形
  442.        u8g.drawBox(80,11,2,2);//电池电量段
  443.        u8g.drawBox(80,14,2,2);   
  444.     }
  445. if (Voltage <3.5 && Voltage >=3.2){
  446.        u8g.drawLine(80, 2, 81, 2);
  447.        u8g.drawFrame(78,3,6,15);//电池外形
  448.        u8g.drawBox(80,14,2,2);//电池电量段   
  449.     }
  450. if (Voltage <3.2 && Voltage >=3.0 ){
  451.        u8g.drawLine(80, 2, 81, 2);
  452.        u8g.drawFrame(78,3,6,15);//电池外形     
  453.     }
  454. if (Voltage < 3.0 ) { //当VCC电压小于3v时图标闪烁,电池电量不足警告
  455.       if(millis()/1000%2!=0){
  456.            u8g.drawLine(80, 2, 81, 2);
  457.            u8g.drawFrame(78,3,6,15);//电池外形
  458.            u8g.drawLine(79, 4, 82, 17);
  459.     }
  460.       else{
  461.            u8g.setPrintPos(80, 2); //只要是不影响其他显示此位置可任选
  462.            u8g.print("");
  463.     }
  464.          }
  465. /*背光灯4档可调,当电池电压低于3.2v时背光灯熄灭,节约电能*/
  466. if(Voltage >=3.2){
  467.        analogWrite(11,SUM);//使用PWM控制11号口输出,变量n的取值范围是0-255
  468.     }
  469.      else{
  470.        digitalWrite(11, LOW);
  471.     }

  472.   u8g.setPrintPos(47, 7);
  473.     if(shesta == true)        //进入设置状态
  474.     {
  475.       u8g.setFont(u8g_font_6x12);
  476.       switch(shenum)
  477.         {
  478.         case 1:
  479.         {
  480.             if((millis() / 1000) % 2 != 0)
  481.             {
  482.                 voadd(sheshi);
  483.                 u8g.print(sheshi);
  484.             }
  485.             else
  486.                 u8g.print("  ");
  487.             u8g.print(":");
  488.             voadd(shefen);
  489.             u8g.print(shefen);
  490.         }
  491.         ;
  492.         break;
  493.         case 2:
  494.         {
  495.             voadd(sheshi);
  496.             u8g.print(sheshi);
  497.             u8g.print(":");
  498.             if((millis() / 1000) % 2 != 0)
  499.             {
  500.                 voadd(shefen);
  501.                 u8g.print(shefen);
  502.             }
  503.             else
  504.             {
  505.                 u8g.print("    ");
  506.             }
  507.         }
  508.         ;
  509.         break;
  510.         }
  511.     }
  512.   else        //正常显示时间
  513.   {
  514.     u8g.setFont(u8g_font_6x12);
  515.     voadd(TIMEshi);
  516.     u8g.print(TIMEshi);    //hou
  517.     if(millis()/1000%2!=0)
  518.       u8g.print(":");
  519.     else
  520.       u8g.print(" ");
  521.     voadd(TIMEfen);
  522.     u8g.print(TIMEfen);    //min  
  523.   }

  524.     u8g.setPrintPos(1, 26);
  525. {
  526.     u8g.setDefaultForegroundColor();
  527.     u8g.drawBox(0, 20, 84, 8);
  528.     u8g.setDefaultBackgroundColor();
  529.     u8g.setFont(u8g_font_chikitar);
  530.     u8g.print("MSPEED:");//平均时速
  531.     u8g.setPrintPos(40, 26);
  532.     voadd(MSPEED);
  533.     u8g.print(int (MSPEED*10)/10);        
  534.     u8g.print(".");
  535.     u8g.print(int (MSPEED*10)%10);   
  536.   }
  537.     u8g.setFont(u8g_font_04b_03b);
  538.     u8g.setPrintPos(62, 26);
  539.     u8g.print("km/h");
  540.     u8g.setDefaultForegroundColor();
  541.     u8g.setPrintPos(0, 39); //单次里程
  542.     u8g.setFont(u8g_font_6x13);
  543.     u8g.print("ONCE");
  544.     u8g.setPrintPos(32, 34);  
  545.   {
  546.     u8g.setFont(u8g_font_chikitar);
  547.     voadd(ONEMILE);
  548.     u8g.print((int)ONEMILE);        
  549.     u8g.print(".");
  550.     u8g.print(int(ONEMILE*10)%10);
  551.     u8g.print(int(ONEMILE*100)%10);        
  552.   }
  553.     u8g.setPrintPos(32, 40); //单次时间
  554.   {
  555.     u8g.setFont(u8g_font_chikitar);
  556.     voadd(time/1000/60/60);
  557.     u8g.print(time/1000/60/60);
  558.     u8g.print(" hr ");
  559.    
  560.     voadd(time/1000/60%60);
  561.     u8g.print(time/1000/60%60);        
  562.   }
  563.     u8g.setFont(u8g_font_chikitar);
  564.     u8g.setPrintPos(70, 34);
  565.     u8g.print("km");
  566.     u8g.setPrintPos(70, 40);
  567.     u8g.print("min");
  568.   
  569.   if (lcda == true)    //半径设置
  570.   {
  571.    
  572.     if(LCDSW==1)
  573.     {
  574.       u8g.setDefaultForegroundColor();
  575.       u8g.drawBox(0, 42, 84, 6);
  576.       u8g.setDefaultBackgroundColor();
  577.       u8g.setFont(u8g_font_chikitar);
  578.       u8g.setPrintPos(1, 47);
  579.       u8g.print("Wheel radius:  ");
  580.       voadd(R);
  581.       u8g.print(R);
  582.        u8g.setPrintPos(72, 47);
  583.       u8g.print("cm");
  584.     }
  585.   }
  586.   else
  587.   {
  588.     u8g.setDefaultForegroundColor();
  589.     u8g.setFont(u8g_font_chikitar);
  590.     u8g.setPrintPos(0, 48);
  591.     u8g.print("MILE: ");     //总里程
  592.     u8g.setPrintPos(32, 48);
  593.     if(int(ALLMILE*10)/10<10)
  594.     {
  595.       u8g.print("000");
  596.     }
  597.     if(int(ALLMILE*10)/10>10 && int(ALLMILE*10)/10<100)
  598.     {
  599.       u8g.print("00");
  600.     }
  601.     if(int(ALLMILE*10)/10>100 && int(ALLMILE*10)/10<1000)
  602.     {
  603.       u8g.print("0");
  604.     }

  605.     u8g.print(int(ALLMILE));
  606.     u8g.print(".");
  607.     u8g.print(int(ALLMILE*10)%10);
  608.     u8g.setPrintPos(70, 48);
  609.     u8g.print("km");
  610.   }




  611. if (lcdb == true)    //报警设置
  612. {
  613.     if(lcdSW==1)
  614.     {
  615.       u8g.setDefaultForegroundColor();
  616.       u8g.drawBox(0, 0, 44, 19);
  617.       u8g.setDefaultBackgroundColor();
  618.       u8g.setFont(u8g_font_5x8);
  619.       u8g.setPrintPos(5, 8);
  620.       u8g.print("SPEED/L");
  621.       u8g.setPrintPos(4, 18);
  622.       voadd(V);
  623.       u8g.print(V);
  624.       u8g.setPrintPos(21, 18);
  625.       u8g.print("km/h");
  626.     }
  627.   }
  628. else
  629. {
  630.       u8g.setDefaultForegroundColor();
  631.       u8g.setFont(u8g_font_timB18r);
  632.       u8g.setPrintPos(0, 18);
  633.       voadd(int(SPEED*10)/10);
  634.   if(SPEED >=100){
  635.       u8g.print(int(SPEED*10)/10); //SPEED
  636.   }
  637.   else{
  638.       u8g.print(int(SPEED*10)/10);   //SPEED
  639.       u8g.print(".");
  640.       u8g.print(int(SPEED*10)%10);   
  641.   }
  642. }

  643. }
  644. void voshe()
  645. {
  646.     if(shenum == 0)                //初始赋值
  647.     {
  648.         sheshi = TIMEshi;
  649.         shefen = TIMEfen;
  650.     }

  651.     RTC.stop();                //准备写入时间

  652.     if(millis() - SHEtime > SHEtimeOUT) //超时
  653.     {
  654.         shesta = false;        //退出设置
  655.         shenum = 0;            //初始

  656.         RTC.set(DS1307_HR, sheshi);
  657.         RTC.set(DS1307_MIN, shefen);
  658.         RTC.set(DS1307_SEC, 0);
  659.         RTC.start();
  660.     }

  661.     if(MENUup == true || MENUdown == true )//|| MENUup10x == true || MENUdown10x == true        //触发时
  662.     {
  663.         voshesta();
  664.     }

  665.     switch(shenum)                //按键作用
  666.     {
  667.     case 1:
  668.     {
  669.         if(MENUup == true)
  670.         {
  671.             sheshi++;
  672.         }
  673.         if(MENUdown == true)
  674.         {
  675.             sheshi--;
  676.         }
  677.   /*      if(MENUup10x == true)
  678.         {
  679.             sheshi += 10;
  680.         }
  681.         if(MENUdown10x == true)
  682.         {
  683.             sheshi -= 10;
  684.         }*/
  685.     };
  686.     break;

  687.     case 2:
  688.     {
  689.         if(MENUup == true)
  690.         {
  691.             shefen++;
  692.         }
  693.         if(MENUdown == true)
  694.         {
  695.             shefen--;
  696.         }
  697.   /*      if(MENUup10x == true)
  698.         {
  699.             shefen += 10;
  700.         }
  701.         if(MENUdown10x == true)
  702.         {
  703.             shefen -= 10;
  704.         }*/
  705.     };
  706.     break;

  707.     }
  708. }


  709. void voshesta()        //触发时间设置状态
  710. {
  711.     SHEtime = millis();
  712.     shesta = true;
  713. }

  714. int ScanKey() //按键扫描程序,返回键值
  715. {
  716. if (Flag_up && digitalRead(BGKEY) == LOW) //当Flag_up = 1并且按键按下时
  717. {
  718. Flag_up = 0; //清空Flag_up
  719. delay(20); //延时去抖动
  720. if (digitalRead(BGKEY) == LOW) //按键按下
  721. {
  722. return 1; //返回键值1
  723. }
  724. }
  725. if (digitalRead(BGKEY) == HIGH) //按键松开时候
  726. {
  727. Flag_up = 1; //置位Flag_up
  728. }
  729. return 0; //返回键值0
  730. }

  731. void baojing()
  732. {
  733.     tone(beeppin,4500);
  734.     delay(50);
  735.     noTone(beeppin);
  736.     tone(beeppin,4500);
  737.     delay(50);
  738.     noTone(beeppin);
  739. }
复制代码
回复

使用道具 举报

ID:79544 发表于 2020-5-6 18:53 | 显示全部楼层
感谢楼主分享!学习一下。
回复

使用道具 举报

ID:701198 发表于 2020-5-8 16:24 | 显示全部楼层
楼主软硬兼施啊,不错,很有想法。
回复

使用道具 举报

ID:79544 发表于 2020-5-8 16:37 | 显示全部楼层
楼主,感谢分享。没有DS1307的库啊。报错。
回复

使用道具 举报

ID:230374 发表于 2020-5-10 09:21 | 显示全部楼层
感谢楼主分享!学习一下。
回复

使用道具 举报

ID:727275 发表于 2020-6-24 23:35 | 显示全部楼层
感谢楼主分享诺基亚5110屏 自行车码表DIY制作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表