这个项目主要是为了直观的显示检测的环境温度,用最便宜的设备、最低的成本显示实时温度
硬件:ESP8266一块、DS18B20温度传感器一个、MAX7217点阵屏一个
成本=8.9+1+6=15.9元
先看效果图
接线方案
ESP8266 DS18B20
3V VCC
GND GND
D4 DC
ESP8266 MAX7217
3V VCC
GND GND
D5 DIN
D6 CS
D7 CLK
首先根据接线方案把DS18B20和MAX7217连接在单片机上,然后把单片机连接电脑,使用ArduinoIDE写代码进单片机
考虑到MAX7217点阵屏的数据需要预先定义,我写了一个小程序来定义这个数据,方便直接使用数据让MAX7217需要的部分亮起来。例如如下的一个爱心就是使用点阵屏数据生成器生成的,这里提供下载,生成的数据样式就是一串数字0和1,只需要手动点击左边的按键,然后点击生成就可以生成需要的数据:0000000001101100100100101000001001000100001010000001000000000000
如果这里没有显示下载地址就去我的主页获取
接下来是写入ESP8266的代码,你需要改的只有数据,如果看不懂代码请看B站的详细介绍,哔哩哔哩搜索“董哥物联网“有详细的制作讲解视频。
#include <LedControl.h>
#include <OneWire.h>
#include <DallasTemperature.h>
/*
接线方案
ESP8266 DS18B20
3V VCC
GND GND
D4 DC
ESP8266 MAX7217
3V VCC
GND GND
D5 DIN
D6 CS
D7 CLK
*/
const int dataPin = D4;
OneWire oneWire(dataPin);
DallasTemperature sensors(&oneWire);
#define DIN_PIN D5
#define CS_PIN D6
#define CLK_PIN D7
const int NUM_DEVICES = 1; // MAX7217 的数量
LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, NUM_DEVICES);
int i=0,j=0,k=0;
String tempraturedata[40];
float Temperature=0.0;
int Location=0;
void setfont(String s){
lc.clearDisplay(0); // Clear display register
if(s.length()==64){
k=0;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(s[k++]=='1'){
lc.setLed(0,i,j, true);
}
}
}
delay(500);
}
}
float gettemperature(){
sensors.requestTemperatures();// 请求温度数据
delay(1);//防止过快请求出错,设定响应时间
Temperature = sensors.getTempCByIndex(0); // 读取温度
while (Temperature == DEVICE_DISCONNECTED_C) { // 检查是否成功读取温度 -127
sensors.requestTemperatures();// 请求温度数据
delay(1);//防止过快请求出错,设定响应时间
Temperature = sensors.getTempCByIndex(0); // 读取温度
}
return Temperature;
}
void setup() {
Serial.begin(9600);
sensors.begin();
sensors.setResolution(12); // 设置为 12 位分辨率
lc.shutdown(0, false); // 唤醒显示
/*
* Set the brightness of the display.
* Params:
* addr the address of the display to control
* intensity the brightness of the display. (0..15)
*/
lc.setIntensity(0, 15); // 设置亮度级别
lc.clearDisplay(0); // 清空显示
//定义0-40的显示数据
tempraturedata[0]="0111100001001000010010000100100001001000010010000111100000000000";
tempraturedata[1]="0000100000111000000010000000100000001000000010000000100001111111";
tempraturedata[2]="0111110000000100000001000111110001000000010000000100000001111100";
tempraturedata[3]="0111110000000100000001000111110000000100000001000000010001111100";
tempraturedata[4]="0100100001001000010010000111110000001000000010000000100000000000";
tempraturedata[5]="0111100001000000010000000111100000001000000010000111100000000000";
tempraturedata[6]="0111100001000000010000000111100001001000010010000100100001111000";
tempraturedata[7]="0111100000001000000010000000100000001000000010000000100000000000";
tempraturedata[8]="0111100001001000010010000111100001001000010010000111100000000000";
tempraturedata[9]="0111100001001000010010000111100000001000000010000000100001111000";
tempraturedata[10]="0100010011001100010001000100010001000100010001000100010011101110";
tempraturedata[11]="0100010011001100010001000100010001000100010001000100010011101110";
tempraturedata[12]="0100111111000001010000010100111101001000010010000100100011101111";
tempraturedata[13]="1100111101000001010000010100111101000001010000010100000111101111";
tempraturedata[14]="1100100101001001010010010100111101000001010000010100000111100001";
tempraturedata[15]="1100111101001000010010000100111101000001010000010100000111101111";
tempraturedata[16]="1100111101001000010010000100111101001001010010010100100111101111";
tempraturedata[17]="1100111101000001010000010100000101000001010000010100000111100001";
tempraturedata[18]="1100111101001001010010010100111101001001010010010100100111101111";
tempraturedata[19]="1100111101001001010010010100111101000001010000010100000111101111";
tempraturedata[20]="1110111100101001001010011110100110001001100010011000100111101111";
tempraturedata[21]="1111011000010010000100100001001011110010100000101000001011110111";
tempraturedata[22]="1110111000100010001000100010001011101110100010001000100011101110";
tempraturedata[23]="1110111000100010001000100010001011101110100000101000001011101110";
tempraturedata[24]="1110101000101010001010100010101011101111100000101000001011100010";
tempraturedata[25]="1110111100101000001010000010100011101111100000011000000111101111";
tempraturedata[26]="1110111100101000001010000010100011101111100010011000100111101111";
tempraturedata[27]="1110111100100001001000010010000111100001100000011000000111100001";
tempraturedata[28]="1110111100101001001010010010100111101111100010011000100111101111";
tempraturedata[29]="1110111100101001001010010010100111101111100000011000000111101111";
tempraturedata[30]="1110111100101001001010011110100100101001001010011110111100000000";
tempraturedata[31]="1110110000100100001001001110010000100100001001001110111000000000";
tempraturedata[32]="1110111000100010001000101110111000101000001010001110111000000000";
tempraturedata[33]="1110111000100010001000101110111000100010001000101110111000000000";
tempraturedata[34]="1110101000101010001010101110111100100010001000101110001000000000";
tempraturedata[35]="1110111100101000001010001110111100100001001000011110111100000000";
tempraturedata[36]="1110111100101000001010001110111100101001001010011110111100000000";
tempraturedata[37]="1110111100100001001000011110000100100001001000011110000100000000";
tempraturedata[38]="1110111100101001001010011110111100101001001010011110111100000000";
tempraturedata[39]="1110111100101001001010011110111100100001001000011110111100000000";
tempraturedata[40]="1010111110101001101010011110100100101001001010010010111100000000";
}
void loop() {
Temperature=gettemperature();
Location=(int)Temperature;
setfont(tempraturedata[Location]);//31
delay(500);
}