*请看过《硬件篇》和《接线篇》再看此文章
*注意,此文章只适用于《利用ESP8266与米思齐从零制作模拟温室大棚》系列
一、下载米思齐软件及搭建应用环境
此处不做赘述,参考:
http://t.csdn.cn/UEGmo 里面有较为详细的讲解和资料,严格按照教程安装即可。
二、配合《硬件篇》和《接线篇》设计程序
1.程序逻辑
(1)OLED屏幕显示
我们希望OLED上显示温湿度和水位,且为中文显示,故选择温湿度传感器及水位感应器连接ESP8266的引脚进行数据监测,并直接通过屏幕输出。在屏幕输出之前,为确保当数据变化时OLED上的读数也会跟着变化,我们首先要保证每次主程序循环时都刷新一次OLED屏幕,方便更新数据。其次将OLED的屏幕显示设置为中文(注意:设置为中文时最好选择“宋体全集”不然可能会出现部分字体不显示的情况)。最后针对传感器的引脚口把监测到的数据放在我们预设的中文字之后,完成显示。
*显示时可以选择起点x与起点y,此处可以平面直角坐标系来理解,以左上角为原点,向下为y的正方向,向右为x的正方向,可根据自己的需要调整字的位置。
(2)功能输出
针对执行元件的运行,我们利用某些条件来限制和调整它们。
1)水泵
当湿度检测到低于预设最低湿度值时,水泵开始洒水;
当湿度检测到高于预设最低湿度值时,水泵停止工作。
2)风扇&灯带
当温度检测高于30℃时,启动风扇对内部进行降温;
当温度检测低于25℃时,启动灯带对内部加热;
当温度处于25~30℃时,风扇和灯带均处于关闭状态。
3)蜂鸣器
当水位检测到低于预设最低水位值时开始报警;
当水位检测到高于预设最低水位值时停止报警。
2.程序编写(图形化编程)
(1)主程序
(2)子程序
1)OLED显示屏
2)执行元件
(3)总体
3.程序编写(arduino IDE)
(1)初始化
void setup(){
dht13.begin();
pinMode(0, OUTPUT);
pinMode(4, OUTPUT);
pinMode(15, OUTPUT);
pinMode(5, OUTPUT);
pinMode(16, OUTPUT);
pinMode(A0, INPUT);
pinMode(12, OUTPUT);
u8g2.setI2CAddress(0x3C*2);
u8g2.begin();
u8g2.enableUTF8Print();
}
(2)主程序
void loop(){
u8g2.firstPage();
do
{
OLED();
}while(u8g2.nextPage());
reaction();
}
(3)子程序
1)OLED显示屏
void OLED() {
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontPosTop();
u8g2.setCursor(0,1);
u8g2.print(String("温度:") + String(dht13.readTemperature()));
u8g2.setCursor(0,21);
u8g2.print(String("湿度:") + String(dht13.readHumidity()));
u8g2.setCursor(0,41);
u8g2.print(String("水位:") + String(analogRead(A0)));
}
2)执行元件
DHT dht13(13, 11);
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 2, 14, U8X8_PIN_NONE);
void reaction() {
// 管脚0&4控制灯带
// 管脚13控制风扇
// 温度范围在25~30之间
if (dht13.readTemperature() > 30) {
digitalWrite(0,HIGH);
digitalWrite(4,LOW);
} else if (dht13.readTemperature() < 25) {
digitalWrite(15,HIGH);
} else {
digitalWrite(15,LOW);
digitalWrite(0,LOW);
digitalWrite(4,LOW);
}
// 管脚5&16控制水泵
// 湿度低于30则洒水
if (dht13.readHumidity() < 30) {
digitalWrite(5,LOW);
digitalWrite(16,HIGH);
} else {
digitalWrite(5,LOW);
digitalWrite(16,LOW);
}
// 管脚12控制蜂鸣器
// 水位低于700就报警
if (analogRead(A0) < 100) {
tone(12,131);
} else {
noTone(12);
}
}
(4)所包含的库
#include <DHT.h>
#include <U8g2lib.h>
#include <Wire.h>
(5)总体
#include <DHT.h>
#include <U8g2lib.h>
#include <Wire.h>
DHT dht13(13, 11);
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 2, 14, U8X8_PIN_NONE);
void reaction() {
// 管脚0&4控制灯带
// 管脚13控制风扇
// 温度范围在25~30之间
if (dht13.readTemperature() > 30) {
digitalWrite(0,HIGH);
digitalWrite(4,LOW);
} else if (dht13.readTemperature() < 25) {
digitalWrite(15,HIGH);
} else {
digitalWrite(15,LOW);
digitalWrite(0,LOW);
digitalWrite(4,LOW);
}
// 管脚5&16控制水泵
// 湿度低于30则洒水
if (dht13.readHumidity() < 30) {
digitalWrite(5,LOW);
digitalWrite(16,HIGH);
} else {
digitalWrite(5,LOW);
digitalWrite(16,LOW);
}
// 管脚12控制蜂鸣器
// 水位低于700就报警
if (analogRead(A0) < 100) {
tone(12,131);
} else {
noTone(12);
}
}
void OLED() {
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontPosTop();
u8g2.setCursor(0,1);
u8g2.print(String("温度:") + String(dht13.readTemperature()));
u8g2.setCursor(0,21);
u8g2.print(String("湿度:") + String(dht13.readHumidity()));
u8g2.setCursor(0,41);
u8g2.print(String("水位:") + String(analogRead(A0)));
}
void setup(){
dht13.begin();
pinMode(0, OUTPUT);
pinMode(4, OUTPUT);
pinMode(15, OUTPUT);
pinMode(5, OUTPUT);
pinMode(16, OUTPUT);
pinMode(A0, INPUT);
pinMode(12, OUTPUT);
u8g2.setI2CAddress(0x3C*2);
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(){
u8g2.firstPage();
do
{
OLED();
}while(u8g2.nextPage());
reaction();
}