找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 5836|回復(fù): 9
收起左側(cè)

0.96液晶做的圖形指針溫度計(jì)很夢(mèng)幻

  [復(fù)制鏈接]
ID:358930 發(fā)表于 2018-11-9 21:23 | 顯示全部樓層 |閱讀模式
本帖最后由 冰冰潔潔 于 2018-11-9 21:25 編輯

一些常用庫(kù)我打包在之前發(fā)的貼子里,找找吧。我習(xí)慣把新庫(kù)加好了備份一下打包。/* 16X16點(diǎn)陣顯示 取模方式 陰碼+逐行式+順向
**/
#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;//動(dòng)畫(huà)變量不能用char型變量無(wú)法計(jì)算
int sec;//動(dòng)畫(huà)變量不能用char型變量無(wú)法計(jì)算

#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;//動(dòng)畫(huà)變量

//顯示一個(gè)心形
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.檢測(cè)全屏顯示(看看有沒(méi)有大面積壞點(diǎn))
  display.fillScreen(WHITE);//檢測(cè)全屏顯示(看看有沒(méi)有大面積壞點(diǎn))
  display.clearDisplay();   // clears the screen and buffer

/*
  display.clearDisplay();   // clears the screen and buffer
   //2.畫(huà)點(diǎn) 點(diǎn)坐標(biāo)(10,10)  
  display.drawPixel(20, 20, WHITE);// 列127 行63 畫(huà)點(diǎn) 點(diǎn)坐標(biāo)

  //3. 畫(huà)線 從(0,0)到(50,50)
  display.drawLine(20, 25,20,63, WHITE);//(開(kāi)始列127  開(kāi)始行63)( 結(jié)束列127 結(jié)束行63)

  //4.畫(huà)空心矩形  左上角坐標(biāo)(x0,y0)  右下角坐標(biāo)(x1,y1)
  display.drawRect(2,50,10,10,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  結(jié)束大小=行+Y)

  //5.來(lái)畫(huà)個(gè)實(shí)心矩形
  display.fillRect(2,35,10,10,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  結(jié)束大小=行+Y)

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

  //7.畫(huà)實(shí)心圓
  display.fillCircle(36,30,6,WHITE);//(控制圓心位置列0/127   控制圓心位置行0/63  )(控制大小=0+x )

  //8.畫(huà)空心三角形
  display.drawTriangle(60,32,45,43,70,43,WHITE);//(控制三角形A點(diǎn)列0/127 行0/63  控制三角形B點(diǎn)列0/127 行0/63 控制三角形C點(diǎn)列0/127 行0/63)

  //9.畫(huà)實(shí)心三角形
  display.fillTriangle(86,32,72,43,100,43,WHITE);//(控制三角形A點(diǎn)列0/127 行0/63  控制三角形B點(diǎn)列0/127 行0/63 控制三角形C點(diǎn)列0/127 行0/63)

  //10.畫(huà)空心圓角矩形
  display.drawRoundRect(50,17,15,15,2,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  結(jié)束大小=行+Y  控制圓角=+x)

//11.畫(huà)實(shí)心圓角矩形
  display.fillRoundRect(70,17,15,15,2,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=列+x  結(jié)束大小=行+Y  控制圓角=+x)

  //12.畫(huà)心形(自己用取模軟件畫(huà)的)相當(dāng)于一個(gè)任意16X16字
  display.drawBitmap(88,17,Heart_16x16,16,16,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=16  結(jié)束大小=16)這里只能是16X16因?yàn)槭?6X16字

//13.顯示英文
  display.setTextSize(2);//設(shè)置字體大小
  display.setTextColor(WHITE);//設(shè)置字體不反白
  display.setCursor(0,0);//列127 行63     坐標(biāo)
  display.println("bb");

  //14.顯示數(shù)字變量
  display.setTextSize(2);//設(shè)置字體大小  
  display.setTextColor(BLACK, WHITE); //設(shè)置字體反白
  display.setCursor(30,0);//列127 行63     坐標(biāo)
  display.println(x);

//15.顯示16進(jìn)制變量
  display.setTextSize(2);
  display.setTextColor(WHITE);//設(shè)置字體不反白
  display.setCursor(60,0);//列127 行63     坐標(biāo)
  display.print("0x");
  display.println(x, HEX);

//16.顯示單個(gè)文字 就是調(diào)用drawBitmap(自己用取模軟件取模)相當(dāng)于一個(gè)任意16X16字
  //display.drawBitmap(0,17,Strong_16x16,16,16,BLACK);//可用BLACK黑字在圖片上顯示(控制位置列0/127   控制位置行0/63  )(控制大小=16  結(jié)束大小=16)這里只能是16X16因?yàn)槭?6X16字
  display.drawBitmap(0,17,Strong_16x16,16,16,WHITE);//(控制位置列0/127   控制位置行0/63  )(控制大小=16  結(jié)束大小=16)這里只能是16X16因?yàn)槭?6X16字

//17.顯示多個(gè)文字(在庫(kù)里面加入一個(gè)ShowCN_16方法  為了同時(shí)顯示多個(gè)中文 16X16 ,不然的話 就得一個(gè)一個(gè)drawBitmap)
  display.ShowCN_16(0,45, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找數(shù)組法(控制位置列0/127   控制位置行0/63  )
*/
//6.畫(huà)空心圓
   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.畫(huà)實(shí)心圓
  display.fillCircle(xo,yo,2,WHITE);//(控制圓心位置列0/127   控制圓心位置行0/63  )(控制大小=0+x )
   //不能用char型變量無(wú)法計(jì)算
  r=17;//指針半徑
  xo=80;//圓心坐標(biāo) MAX 127
  yo=32;//圓心坐標(biāo)  MAX 63
  z=180;//圓
  a=sec*6;//圓角度
  //.畫(huà)一圈實(shí)心圓
   int B;  
   for(B=0;B<12;B++)//.畫(huà)一圈實(shí)心圓
   {
     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 )
   }
  //.畫(huà)sec時(shí)針線  
   display.drawLine((xo+(r*cos(a*3.14/z))),(yo+(r*sin(a*3.14/z))),xo,yo, WHITE);//(開(kāi)始列127  開(kāi)始行63)( 結(jié)束列127 結(jié)束行63) /////00

   //13.顯示英文
  display.setTextSize(1);//設(shè)置字體大小
  display.setTextColor(WHITE);//設(shè)置字體不反白
  display.setCursor(xo-3,yo-29);//列127 行63     坐標(biāo)
  display.println("0");
  display.setCursor(xo+20,yo-5);//列127 行63     坐標(biāo)
  display.println("15");
  display.setCursor(xo-5,yo+22);//列127 行63     坐標(biāo)
  display.println("30");
  display.setCursor(xo-30,yo-5);//列127 行63     坐標(biāo)
  display.println("45");


// 17.顯示多個(gè)文字(在庫(kù)里面加入一個(gè)ShowCN_16方法  為了同時(shí)顯示多個(gè)中文 16X16 ,不然的話 就得一個(gè)一個(gè)drawBitmap)

  display.ShowCN_16(0,40, bbjj_16x16,sizeof(bbjj_16x16)/32,WHITE);//查找數(shù)組法(控制位置列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};        //改時(shí)間用,初始化時(shí)間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--);
}
/****
*******        串口初始化函數(shù)
*****/
void uart_init()
{
        TMOD=0x20;                //9600bps
        SCON=0x50;
        TH1=0xFD;
        TL1=0xFD;
        TR1=1;


        ES=1;
        EA=1;


        UART_EN=0;           //串口一直處于接收狀態(tài)
}




void main()
{
        
        lcd_init();        
        uart_init();
        lcd_write_str(0x80,tab1);
        lcd_write_str(0xc0,tab2);
        //DS1302_set_time(&time);        //初始化時(shí)間,正常后不要,讀1302自己保存的時(shí)間
        //改好時(shí)間后不要這句,再下一次程序以后從1302讀時(shí)間
        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]);  //時(shí)
                lcd_write_time(0xcb,time[1]);  //分
                lcd_write_time(0xce,time[0]);        //秒
                if(flag==1)                                                   //顯示負(fù)溫度
                {
                        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');
                }        
        }
}
/****
*******        串口中斷服務(wù)程序函數(shù)
*****/
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顯示圖形溫度計(jì)OK3.zip

5.34 KB, 下載次數(shù): 52, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
azi197417 + 10 共享資料的黑幣獎(jiǎng)勵(lì)!這個(gè)值得膜拜!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:358930 發(fā)表于 2018-11-9 21:27 | 顯示全部樓層
復(fù)制多了一點(diǎn)其它代碼,下面一段。壓縮包是對(duì)的。
回復(fù)

使用道具 舉報(bào)

ID:452731 發(fā)表于 2019-1-20 23:24 | 顯示全部樓層
學(xué)習(xí)中!我最多智能給10個(gè)黑幣@!全給你,祝你有更有意思的作品出現(xiàn)
回復(fù)

使用道具 舉報(bào)

ID:358930 發(fā)表于 2019-1-21 03:23 來(lái)自觸屏版 | 顯示全部樓層
azi197417 發(fā)表于 2019-1-20 23:24
學(xué)習(xí)中!我最多智能給10個(gè)黑幣@!全給你,祝你有更有意思的作品出現(xiàn)

還是謝謝你的黑幣,我其實(shí)黑幣很多,真心用不著。
回復(fù)

使用道具 舉報(bào)

ID:60624 發(fā)表于 2019-3-2 11:39 | 顯示全部樓層
ShowCN_16這個(gè)咋搞,怎么在庫(kù)里面添加,編譯顯示ShowCN_16錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

ID:722238 發(fā)表于 2020-4-4 14:57 | 顯示全部樓層
很實(shí)用的教程,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:171746 發(fā)表于 2020-4-16 17:57 | 顯示全部樓層
#error("Height incorrect, please fix Adafruit_SSD1306.h!");   編譯卡到這句樂(lè),怎么解決?謝謝
回復(fù)

使用道具 舉報(bào)

ID:5212 發(fā)表于 2021-9-4 10:07 來(lái)自觸屏版 | 顯示全部樓層
這個(gè)有意思
回復(fù)

使用道具 舉報(bào)

ID:291765 發(fā)表于 2021-9-4 16:40 | 顯示全部樓層
謝謝貼主,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

ID:5212 發(fā)表于 2021-9-5 12:41 | 顯示全部樓層
Arduino:1.8.12 (Windows 7), 開(kāi)發(fā)板:"Arduino Nano, ATmega328P (Old Bootloader)"

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

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

這個(gè)報(bào)錯(cuò)是什么意思

http://www.torrancerestoration.com/bbs/dpj-211984-1.html
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表