找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4708|回复: 9
收起左侧

0.96液晶做的图形指针温度计很梦幻

  [复制链接]
ID:358930 发表于 2018-11-9 21:23 | 显示全部楼层 |阅读模式
本帖最后由 冰冰洁洁 于 2018-11-9 21:25 编辑

一些常用库我打包在之前发的贴子里,找找吧。我习惯把新库加好了备份一下打包。/* 16X16点阵显示 取模方式 阴码+逐行式+顺向
**/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DS18B20.h"
float Temp_Buffer = 0;    //存放温度值的10倍
DS18B20 myDS18B20(A0);
int r,xo,yo,a,z;//动画变量不能用char型变量无法计算
int sec;//动画变量不能用char型变量无法计算

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#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 x;//动画变量

//显示一个心形
static const uint8_t PROGMEM Heart_16x16[] = {
  0x00,0x00,0x18,0x18,0x3C,0x3C,0x7E,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  0xFF,0xFF,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x00,0x00//未命名文件0
};
static const uint8_t PROGMEM bbjj_16x16[] ={
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/

0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",1*/
};

void setup()   {               
  Serial.begin(115200);
  delay(500);
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
}

void loop() {


  //1.检测全屏显示(看看有没有大面积坏点)
  display.fillScreen(WHITE);//检测全屏显示(看看有没有大面积坏点)
  display.clearDisplay();   // clears the screen and buffer

/*
  display.clearDisplay();   // clears the screen and buffer
   //2.画点 点坐标(10,10)  
  display.drawPixel(20, 20, WHITE);// 列127 行63 画点 点坐标

  //3. 画线 从(0,0)到(50,50)
  display.drawLine(20, 25,20,63, WHITE);//(开始列127  开始行63)( 结束列127 结束行63)

  //4.画空心矩形  左上角坐标(x0,y0)  右下角坐标(x1,y1)
  display.drawRect(2,50,10,10,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  结束大小=行+Y)

  //5.来画个实心矩形
  display.fillRect(2,35,10,10,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  结束大小=行+Y)

   //6.画空心圆
  display.drawCircle(36,50,6,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )

  //7.画实心圆
  display.fillCircle(36,30,6,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )

  //8.画空心三角形
  display.drawTriangle(60,32,45,43,70,43,WHITE);//(控制三角形A点列0/127 行0/63  控制三角形B点列0/127 行0/63 控制三角形C点列0/127 行0/63)

  //9.画实心三角形
  display.fillTriangle(86,32,72,43,100,43,WHITE);//(控制三角形A点列0/127 行0/63  控制三角形B点列0/127 行0/63 控制三角形C点列0/127 行0/63)

  //10.画空心圆角矩形
  display.drawRoundRect(50,17,15,15,2,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  结束大小=行+Y  控制圆角=+x)

//11.画实心圆角矩形
  display.fillRoundRect(70,17,15,15,2,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  结束大小=行+Y  控制圆角=+x)

  //12.画心形(自己用取模软件画的)相当于一个任意16X16字
  display.drawBitmap(88,17,Heart_16x16,16,16,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=16  结束大小=16)这里只能是16X16因为是16X16字

//13.显示英文
  display.setTextSize(2);//设置字体大小
  display.setTextColor(WHITE);//设置字体不反白
  display.setCursor(0,0);//列127 行63     坐标
  display.println("bb");

  //14.显示数字变量
  display.setTextSize(2);//设置字体大小  
  display.setTextColor(BLACK, WHITE); //设置字体反白
  display.setCursor(30,0);//列127 行63     坐标
  display.println(x);

//15.显示16进制变量
  display.setTextSize(2);
  display.setTextColor(WHITE);//设置字体不反白
  display.setCursor(60,0);//列127 行63     坐标
  display.print("0x");
  display.println(x, HEX);

//16.显示单个文字 就是调用drawBitmap(自己用取模软件取模)相当于一个任意16X16字
  //display.drawBitmap(0,17,Strong_16x16,16,16,BLACK);//可用BLACK黑字在图片上显示(控制位置列0/127   控制位置行0/63  )(控制大小=16  结束大小=16)这里只能是16X16因为是16X16字
  display.drawBitmap(0,17,Strong_16x16,16,16,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=16  结束大小=16)这里只能是16X16因为是16X16字

//17.显示多个文字(在库里面加入一个ShowCN_16方法  为了同时显示多个中文 16X16 ,不然的话 就得一个一个drawBitmap)
  display.ShowCN_16(0,45, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找数组法(控制位置列0/127   控制位置行0/63  )
*/
//6.画空心圆
   display.drawCircle(xo,yo,19,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )
   display.drawCircle(xo,yo,25+6,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )
  //7.画实心圆
  display.fillCircle(xo,yo,2,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )
   //不能用char型变量无法计算
  r=17;//指针半径
  xo=80;//圆心坐标 MAX 127
  yo=32;//圆心坐标  MAX 63
  z=180;//圆
  a=sec*6;//圆角度
  //.画一圈实心圆
   int B;  
   for(B=0;B<12;B++)//.画一圈实心圆
   {
     int A=B*30;//圆角度
    display.fillCircle((xo+((r+9)*cos(A*3.14/z))),(yo+((r+9)*sin(A*3.14/z))),1,WHITE);//(控制圆心位置列0/127   控制圆心位置行0/63  )(控制大小=0+x )
   }
  //.画sec时针线  
   display.drawLine((xo+(r*cos(a*3.14/z))),(yo+(r*sin(a*3.14/z))),xo,yo, WHITE);//(开始列127  开始行63)( 结束列127 结束行63) /////00

   //13.显示英文
  display.setTextSize(1);//设置字体大小
  display.setTextColor(WHITE);//设置字体不反白
  display.setCursor(xo-3,yo-29);//列127 行63     坐标
  display.println("0");
  display.setCursor(xo+20,yo-5);//列127 行63     坐标
  display.println("15");
  display.setCursor(xo-5,yo+22);//列127 行63     坐标
  display.println("30");
  display.setCursor(xo-30,yo-5);//列127 行63     坐标
  display.println("45");


// 17.显示多个文字(在库里面加入一个ShowCN_16方法  为了同时显示多个中文 16X16 ,不然的话 就得一个一个drawBitmap)

  display.ShowCN_16(0,40, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找数组法(控制位置列0/127   控制位置行0/63  )

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,17);
  Temp_Buffer = myDS18B20.Get_temp();////温度
  display.println((int)Temp_Buffer);////温度
  sec=Temp_Buffer-15;//用于修正表针位置
  display.display();
  //delay(2000);


}




#include<main.h>
#include<1602.h>
#include<ds1302.h>
uchar time[]={40,27,1,9,11,5,18};        //改时间用,初始化时间2012年7月25日 23:59: 40
uchar code tab1[]="20  -  -   ";
uchar code tab2[]="T:        :  :";
uchar flag;
uchar wendu;




void delay(uint x)
{
        uint m,n;
        for(m=x;m>0;m--)
        for(n=110;n>0;n--);
}
/****
*******        串口初始化函数
*****/
void uart_init()
{
        TMOD=0x20;                //9600bps
        SCON=0x50;
        TH1=0xFD;
        TL1=0xFD;
        TR1=1;


        ES=1;
        EA=1;


        UART_EN=0;           //串口一直处于接收状态
}




void main()
{
        
        lcd_init();        
        uart_init();
        lcd_write_str(0x80,tab1);
        lcd_write_str(0xc0,tab2);
        //DS1302_set_time(&time);        //初始化时间,正常后不要,读1302自己保存的时间
        //改好时间后不要这句,再下一次程序以后从1302读时间
        while(1)
        {        
                DS1302_read_time(&time);         
                lcd_write_time(0x82,time[6]);  //年
                switch(time[5])                               //星期
                {
                        case 1:        lcd_write_str(0x8c,"MON");break;
                        case 2:        lcd_write_str(0x8c,"TUE");break;
                        case 3:        lcd_write_str(0x8c,"WED");break;
                        case 4:        lcd_write_str(0x8c,"THU");break;
                        case 5:        lcd_write_str(0x8c,"FRI");break;
                        case 6:        lcd_write_str(0x8c,"SAT");break;
                        case 7:        lcd_write_str(0x8c,"SUN");break;
                }
                lcd_write_time(0x85,time[4]);  //月
                lcd_write_time(0x88,time[3]);  //日
                lcd_write_time(0xc8,time[2]);  //时
                lcd_write_time(0xcb,time[1]);  //分
                lcd_write_time(0xce,time[0]);        //秒
                if(flag==1)                                                   //显示负温度
                {
                        lcd_write_com(0xc2);
                        lcd_write_date('-');
                        lcd_wendu(0xc6,wendu);
                }
                else                                                         //显示正温度
                {
                        lcd_write_com(0xc2);
                  lcd_write_date('+');
                        lcd_wendu(0xc3,wendu);
                        lcd_write_com(0xc6);
                        lcd_write_date('C');
                }        
        }
}
/****
*******        串口中断服务程序函数
*****/
void ser() interrupt 4
{
        static uchar string[2],i;
        if(RI)
        {
                RI=0;
                string[i++]=SBUF;
                if(i>1)
                        i=0;
                if(string[0]=='-')
                {         
                 

20181109_210247.jpg
20181109_210322.jpg

O128显示图形温度计OK3.zip

5.34 KB, 下载次数: 51, 下载积分: 黑币 -5

评分

参与人数 1黑币 +10 收起 理由
azi197417 + 10 共享资料的黑币奖励!这个值得膜拜!

查看全部评分

回复

使用道具 举报

ID:358930 发表于 2018-11-9 21:27 | 显示全部楼层
复制多了一点其它代码,下面一段。压缩包是对的。
回复

使用道具 举报

ID:452731 发表于 2019-1-20 23:24 | 显示全部楼层
学习中!我最多智能给10个黑币@!全给你,祝你有更有意思的作品出现
回复

使用道具 举报

ID:358930 发表于 2019-1-21 03:23 来自手机 | 显示全部楼层
azi197417 发表于 2019-1-20 23:24
学习中!我最多智能给10个黑币@!全给你,祝你有更有意思的作品出现

还是谢谢你的黑币,我其实黑币很多,真心用不着。
回复

使用道具 举报

ID:60624 发表于 2019-3-2 11:39 | 显示全部楼层
ShowCN_16这个咋搞,怎么在库里面添加,编译显示ShowCN_16错误。
回复

使用道具 举报

ID:722238 发表于 2020-4-4 14:57 | 显示全部楼层
很实用的教程,谢谢。
回复

使用道具 举报

ID:171746 发表于 2020-4-16 17:57 | 显示全部楼层
#error("Height incorrect, please fix Adafruit_SSD1306.h!");   编译卡到这句乐,怎么解决?谢谢
回复

使用道具 举报

ID:5212 发表于 2021-9-4 10:07 来自手机 | 显示全部楼层
这个有意思
回复

使用道具 举报

ID:291765 发表于 2021-9-4 16:40 | 显示全部楼层
谢谢贴主,学习了。
回复

使用道具 举报

ID:5212 发表于 2021-9-5 12:41 | 显示全部楼层
Arduino:1.8.12 (Windows 7), 开发板:"Arduino Nano, ATmega328P (Old Bootloader)"

sketch_jul06a:153:11: error: 'class Adafruit_SSD1306' has no member named 'ShowCN_16'

使用 1.0  版本的库 Wire 在文件夹: F:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire
使用 1.10.10  版本的库 Adafruit_GFX_Library 在文件夹: F:\Arduino\libraries\Adafruit_GFX_Library
使用 2.4.6  版本的库 Adafruit_SSD1306 在文件夹: F:\Arduino\libraries\Adafruit_SSD1306
使用 1.0  版本的库 SPI 在文件夹: F:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI
使用 1.8.3  版本的库 Adafruit_BusIO 在文件夹: F:\Arduino\libraries\Adafruit_BusIO
exit status 1
'class Adafruit_SSD1306' has no member named 'ShowCN_16'

这个报错是什么意思

http://www.51hei.com/bbs/dpj-211984-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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