#define key_start 5 //开始按键
#define key_add 6 //增加按键
#define key_less 7 //减少按键
#include <U8g2lib.h>
#include <Wire.h>
#include <PID_v1.h>
#include <OneWire.h>
#include <DallasTemperature.h> //库
//字体:华文黑体 字号:16px 显示文字:阈值:
/*
------------------------------------------------------------------------------------------------
| 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 |
------------------------------------------------------------------------------------------------
*/
static const unsigned char PROGMEM yuzhi[96] = {0x04, 0x00, 0x10, 0x02, 0x00, 0x00, 0xE8, 0x3F, 0x10, 0x02, 0x00, 0x00, 0x00, 0x21, 0xF0, 0x3F, 0x00, 0x00, 0x02, 0x25, 0x08, 0x02, 0x00, 0x00, 0x02, 0x29, 0x08, 0x02, 0x00, 0x00, 0xFA, 0x2F, 0xCC, 0x1F, 0x00, 0x00, 0x02, 0x21, 0x4C, 0x10, 0x00, 0x00, 0x72, 0x25, 0xCA, 0x1F, 0x00, 0x00, 0x52, 0x25, 0x49, 0x10, 0x00, 0x00, 0x72, 0x25, 0xC8, 0x1F, 0x0C, 0x00, 0x02, 0x23, 0x48, 0x10, 0x0C, 0x00, 0x62, 0x2A, 0xC8, 0x1F, 0x00, 0x00, 0x1A, 0x2D, 0x48, 0x10, 0x0C, 0x00, 0x82, 0x28, 0x48, 0x10, 0x0C, 0x00, 0x42, 0x20, 0xF8, 0x7F, 0x00, 0x00, 0x02, 0x30, 0x08, 0x00, 0x00, 0x00};
//字体:华文黑体 字号:16px 显示文字:温度:
/*
------------------------------------------------------------------------------------------------
| 0 |
| 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
|0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 |
|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
------------------------------------------------------------------------------------------------
*/
static const unsigned char PROGMEM wendu[96] = {0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xC4, 0x1F, 0x00, 0x01, 0x00, 0x00, 0x48, 0x10, 0xFC, 0x7F, 0x00, 0x00, 0x48, 0x10, 0x44, 0x04, 0x00, 0x00, 0xC1, 0x1F, 0x44, 0x04, 0x00, 0x00, 0x42, 0x10, 0xFC, 0x3F, 0x00, 0x00, 0x42, 0x10, 0x44, 0x04, 0x00, 0x00, 0xC8, 0x1F, 0x44, 0x04, 0x00, 0x00, 0x08, 0x00, 0xC4, 0x07, 0x00, 0x00, 0xE4, 0x3F, 0x04, 0x00, 0x0C, 0x00, 0x27, 0x25, 0xF4, 0x0F, 0x0C, 0x00, 0x24, 0x25, 0x24, 0x08, 0x00, 0x00, 0x24, 0x25, 0x42, 0x04, 0x0C, 0x00, 0x24, 0x25, 0x82, 0x03, 0x0C, 0x00, 0xF4, 0x7F, 0x61, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x00};
//字体:华文黑体 字号:16px 显示文字:℃
/*
--------------------------------
| |
| |
| |
| 0 0 0 0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 |
|0 0 0 0 0 0 0 |
| 0 0 0 0 0 0 |
| 0 0 0 0 0 0 0 |
| 0 0 0 |
| 0 0 0 |
| 0 0 0 |
| 0 0 |
| 0 0 0 0 |
| 0 0 0 0 0 |
| |
| |
--------------------------------
*/
static const unsigned char PROGMEM du[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFE, 0x32, 0xE3, 0xB3, 0xC1, 0xF2, 0x81, 0xDE, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x81, 0x80, 0xC3, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00};
volatile double Input; //输入值
volatile double Output; //输出的pwm
volatile double Setpoint; //目标值
volatile int tem; //温度
volatile int tem_test; //温度阈值
volatile boolean run_state; //运行状态
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);
OneWire oneWire_4(4);
DallasTemperature sensors_4(&oneWire_4);
DeviceAddress insideThermometer;
//获取温度
float ds18b20_4_getTemp(int w) {
sensors_4.requestTemperatures();
if (w == 0) {
return sensors_4.getTempC(insideThermometer);
}
else {
return sensors_4.getTempF(insideThermometer);
}
}
//OLED 屏幕显示
void page1() {
u8g2.setFont(u8g2_font_timR14_tf);
u8g2.setFontPosTop();
u8g2.drawXBMP(0, 5, 48, 16, yuzhi); //显示中文
u8g2.setCursor(43, 5); //坐标
u8g2.print(tem_test); //显示阈值
u8g2.drawXBMP(65, 5, 16, 16, du);
u8g2.drawXBMP(0, 20, 48, 16, wendu);
u8g2.setCursor(43, 20);
u8g2.print(tem);
u8g2.drawXBMP(65, 20, 16, 16, du);
}
void setup() {
Input = 0;
Output = 0;
Setpoint = 70;
tem = 0;
tem_test = 70; //初始值
run_state = false;
Serial.begin(9600);
u8g2.setI2CAddress(0x3C * 2); //屏幕地址
u8g2.begin();
pinMode(2, OUTPUT);
myPID.SetMode(AUTOMATIC);
digitalWrite(2, LOW);
pinMode(key_start, INPUT_PULLUP);
pinMode(key_add, INPUT_PULLUP);
pinMode(key_less, INPUT_PULLUP);
sensors_4.getAddress(insideThermometer, 0);
sensors_4.setResolution(insideThermometer, 9);
u8g2.enableUTF8Print();
}
void loop() {
if (true == run_state) { //如果是运行模式
tem = ds18b20_4_getTemp(0); //获取温度
Input = tem; //赋值给输入值
myPID.Compute(); //进行pwm算法
analogWrite(3, Output); //输出pwm
Serial.println(Output);
if (0 == digitalRead(key_add)) { //如果增加按键按下
tem_test = constrain(tem_test + 1, 1, 100); //阈值加1
Setpoint = tem_test; //赋值给目标值
while (0 == digitalRead(key_add)) {
delay(1);
}
delay(10);
}
if (0 == digitalRead(key_less)) { //减少按键
tem_test = constrain(tem_test - 1, 1, 100);
Setpoint = tem_test;
while (0 == digitalRead(key_less)) {
delay(1);
}
delay(10);
}
u8g2.firstPage(); //刷新屏幕
do
{
page1();
} while (u8g2.nextPage());
if (80 < tem) { //如果温度超过设定的最大值
analogWrite(3, 0); //关闭输出
u8g2.clearDisplay(); //清空屏幕
run_state = false; //停止运行
}
}
if (0 == digitalRead(key_start)) { //如果开始按键按下
delay(10);
while (0 == digitalRead(key_start)) {
delay(1);
}
delay(10);
run_state = !run_state; //运行模式取反
}
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
ssd1306:DATA
ssd1306:CLK
ssd1306:DC
ssd1306:RST
ssd1306:CS
ssd1306:3V3
ssd1306:VIN
ssd1306:GND
btn-red:1.l
btn-red:2.l
btn-red:1.r
btn-red:2.r
btn-green:1.l
btn-green:2.l
btn-green:1.r
btn-green:2.r
btn-blue:1.l
btn-blue:2.l
btn-blue:1.r
btn-blue:2.r
Loading
ds18b20
ds18b20
led1:A
led1:C
r1:1
r1:2