第一阶段:
硬件
– DHT温湿度传感器(GND VCC Outdata接入A0)
–雨滴传感器
–光线传感器
– 二氧化碳传感器(EV4-CCS811)
– LCD1602液晶屏幕
– arduino nano 单片机
实验代码:
传感器用法分析: dht.h头文件点击这里下载,温湿度传感器的用法与一般的传感器不同,它需要库文件的支持。先要将 dht 库文件(包
含 dht.h 和 dht.app)复制到 Arduino 软件根目录下的 libraries 内。之后程序中调用相应的库函数即可。引脚 DATA 需要连接一个模拟端口,本课题实验中连接在 A0 端口。要使用 dht 库,首先要将其头文件包含进来 #include
读取DHT11温度传感器的参数 :
LCD1602液晶屏显示温度:
SDA(数据行)和SCI(时钟线):
Arduino Board:I2C / TWI pins
Arduino Uno/Ethernet:A4 (SDA), A5 (SCL)
Arduino Mega2560:20 (SDA), 21 (SCL)
Arduino Leonardo:2 (SDA), 3 (SCL)
Arduino Due:20 (SDA), 21 (SCL), SDA1, SCL1
(06/27)
#include //CCS811二氧化碳传感器头文件
#include //温湿度传感器头文件
#include //I2C头文件
#include //LCD液晶屏// for 16 x 2 LCD module
#include //LCD液晶屏
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
/******************IO引脚定义******************/
#define DHT11_PIN A0//定义温湿传感器数据引脚DHT11_PIN 为 A0
#define LIGHT_PIN A1//定义光线传感器数据引脚LIGHT_PIN 为 A1
#define WATER_A7PIN A7//定义水滴传感器数据引脚WATER_PIN 为 A7
//#define WATER_D3PIN 4//
#define SwitchB_D12PIN 12//手动模式切换按钮 为 D12
unsigned int LED = 13;//手动模式状态指示灯 为 D13
boolean buttonUp = true;//flag旗标-之前被按下过为true,按钮又弹起来。
//电机PWM引脚定义
#define Speed 255 //电机pwm速度 为 255
#define DelayTime 5000//自动模式下,关窗、开窗的时间
unsigned int CL_MOTOR_10PIN = 10;//窗帘-电机
unsigned int CL_MOTOR_11PIN = 11;//窗帘-电机
boolean windostate = false; //窗户初始状态为"关闭":打开 true 关闭 false
boolean curtainstate = false; //窗帘初始状态为“关闭”:打开 true 关闭 false
unsigned int WINDOW1_MOTOR_6PIN = 6;//窗户1-电机
unsigned int WINDOW1_MOTOR_9PIN = 9;//窗户1-电机
unsigned int WINDOW2_MOTOR_3PIN = 3;//窗户2-电机
unsigned int WINDOW2_MOTOR_5PIN = 5;//窗户2-电机
//按钮引脚定义
unsigned int CL_UP_BUTTON_D7PIN = 7;//窗帘-上升
unsigned int CL_DOWN_BUTTON_D8PIN = 8;//窗帘-下降
unsigned int WINDOW1_UP_BUTTON_D2PIN = 2;//窗户1-上升
unsigned int WINDOW1_DOWN_BUTTON_D4PIN = 4;//窗户1-下降
//unsigned int WINDOW2_UP_BUTTON_D0PIN = 0;//窗户2-上升
//unsigned int WINDOW2_DOWN_BUTTON_D1PIN = 1;//窗户2-下降
/******************类******************/
CCS811 ccs = CCS811();//CCS811 CO2气体传感器
dht DHT; //dht类
/******************传感器数据采集参数初始化******************/
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
unsigned int light = 0; //定义光线 无符号整形存储变量
unsigned int water_A7 = 0; //定义水滴模拟存储变量初始化为“0”
unsigned int water_D3 = 0; //定义水滴数字存储变量
/******************函数声明******************/
void sensor_handle();//温湿度函数声明
void sensor_light();//光线函数声明
void window();
void sensor_water();//雨滴检测函数声明
void sensor_CO2();//二氧化碳检测函数声明
void Choose_ ();//模式选择函数声明
void CL_BUTTON_function();//窗帘上升函数声明
//void CL_DOWN_BUTTON_function();//窗帘下降函数声明
void WINDOW1_BUTTON_function();//窗户1上升函数声明
//void WINDOW1_DOWN_BUTTON_function();//窗户1下降函数声明
//void WINDOW2_UP_BUTTON_function();//窗户1上升函数声明
//void WINDOW2_DOWN_BUTTON_function();//窗户1下降函数声明
/******************初始化******************/
void setup() {
Serial.begin(9600);
Serial.print("Temp Test Code:");
Serial.println("OK");
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print("Intelligent ");
lcd.setCursor(0,1);
lcd.print("Window System");
for(int i = 3;i > 0;i--)
{
lcd.setCursor(14,0);
lcd.print(i);
delay(1000);
}
lcd.clear();//清屏
//pinMode(WATER_D3PIN,INPUT);//水滴感应引脚
/******************二氧化碳感应器初始化处理设置******************/
// if (!ccs.begin(0x5A)) //CCS811 CO2气体感应模块初始化
// Serial.println("Not found the CCS811");
// while(!ccs.DataReady());
// double temp=ccs.Temperature();
// ccs.tempoffset=temp - 25.0;
/******************模式切换按钮设置******************/
pinMode(SwitchB_D12PIN,INPUT);//D12 手动模式切换
pinMode(LED,OUTPUT);//
digitalWrite(LED,LOW);//LED_13_PIN 关闭状态
/******************上升下降-按钮-控制引脚设置******************/
pinMode(CL_UP_BUTTON_D7PIN,INPUT);//
pinMode(CL_DOWN_BUTTON_D8PIN,INPUT);//
pinMode(WINDOW1_UP_BUTTON_D2PIN,INPUT);//
pinMode(WINDOW1_DOWN_BUTTON_D4PIN,INPUT);//
// pinMode(WINDOW2_UP_BUTTON_D0PIN,INPUT);//
// pinMode(WINDOW2_DOWN_BUTTON_D1PIN,INPUT);//
/******************上升下降-电机-控制引脚设置******************/
pinMode(CL_MOTOR_10PIN,OUTPUT);//
pinMode(CL_MOTOR_11PIN,OUTPUT);//
pinMode(WINDOW1_MOTOR_6PIN,OUTPUT);//
pinMode(WINDOW1_MOTOR_9PIN,OUTPUT);//
pinMode(WINDOW2_MOTOR_3PIN,OUTPUT);//
pinMode(WINDOW2_MOTOR_5PIN,OUTPUT);//
}
void loop() {
lcd.home (); // set cursor to 0,0
Choose_ ();//函数调用,SwitchB_D12PIN选择模式
if(digitalRead(LED) == HIGH)//手动模式
{
Serial.println("\n");
Serial.println("模式一:手动模式");
CL_BUTTON_function();
WINDOW1_BUTTON_function();
Choose_ ();//函数调用,SwitchB_D12PIN选择模式
}
else if(digitalRead(LED) == LOW)//自动模式
{
Serial.println("\n");
Serial.println("模式二:自动模式");
sensor_handle();
sensor_light();
window();
sensor_water();
//sensor_CO2();
Choose_ (); //函数调用,SwitchB_D12PIN选择模式
}
delay(200);
}
/**********************************************************
控制窗户1&2函数:手动模式
功能描述:手动模式-控制窗户-下
D0 - 0
D1 - 1
D2 - 0(LOW)
D4 - 1(HIGH)
D3 & D6 - LOW
D5 & D9 - Speed
**********************************************************/
void WINDOW1_BUTTON_function()
{
//窗户打开
if(digitalRead(WINDOW1_UP_BUTTON_D2PIN) == HIGH && digitalRead(WINDOW1_DOWN_BUTTON_D4PIN) == LOW )
{
digitalWrite(WINDOW2_MOTOR_3PIN,Speed);
digitalWrite(WINDOW2_MOTOR_5PIN,LOW);
digitalWrite(WINDOW1_MOTOR_6PIN,Speed);
digitalWrite(WINDOW1_MOTOR_9PIN,LOW);
}
else if(digitalRead(WINDOW1_UP_BUTTON_D2PIN) == LOW && digitalRead(WINDOW1_DOWN_BUTTON_D4PIN) == HIGH )
{
digitalWrite(WINDOW2_MOTOR_3PIN,LOW);
digitalWrite(WINDOW2_MOTOR_5PIN,Speed);
digitalWrite(WINDOW1_MOTOR_6PIN,LOW);
digitalWrite(WINDOW1_MOTOR_9PIN,Speed);
}
else
{
digitalWrite(WINDOW2_MOTOR_3PIN,LOW);
digitalWrite(WINDOW2_MOTOR_5PIN,LOW);
digitalWrite(WINDOW1_MOTOR_6PIN,LOW);
digitalWrite(WINDOW1_MOTOR_9PIN,LOW);
}
}
/**********************************************************
控制窗帘函数:手动模式
功能描述:手动模式-控制窗帘-下-上
D7 - 0
D8 - 1
D10 - LOW
D11 - Speed
**********************************************************/
void CL_BUTTON_function()
{
//窗帘上升
if(digitalRead(CL_UP_BUTTON_D7PIN) == HIGH && digitalRead(CL_DOWN_BUTTON_D8PIN) == LOW)
{
digitalWrite(CL_MOTOR_10PIN,Speed); //
digitalWrite(CL_MOTOR_11PIN,LOW); //
}
//窗帘下降
else if(digitalRead(CL_UP_BUTTON_D7PIN) == LOW && digitalRead(CL_DOWN_BUTTON_D8PIN) == HIGH)
{
digitalWrite(CL_MOTOR_10PIN,LOW); //
digitalWrite(CL_MOTOR_11PIN,Speed); //
}
else
{
digitalWrite(CL_MOTOR_10PIN,LOW); //
digitalWrite(CL_MOTOR_11PIN,LOW); //关闭
}
}
/**********************************************************
模式函数:自动模式与手动模式
功能描述:SwitchB_D12PIN读取按键状态“1”“0”,
状态“1”==“手动模式"且"13_PIN_LED==HIGH”;
状态“0”==“自动模式”且"13_PIN_LED==LOW”。
**********************************************************/
void Choose_ ()
{
Serial.print("SwitchB_D12PIN:");
Serial.println(digitalRead(SwitchB_D12PIN));
if(digitalRead(SwitchB_D12PIN) == HIGH && buttonUp == true)//按钮按下的一瞬间"1"
//digitalRead(B_Switch)!= LOW && buttonUp ==true
{
digitalWrite(LED,!digitalRead(LED)); //测试点亮_13_PIN_LED灯 HIGH & LOW
buttonUp = false;
}
else if(digitalRead(SwitchB_D12PIN)== LOW && buttonUp == false)//按钮没有按下"0"
//digitalRead(B_Switch)== HIGH && buttonUp !=true
{
buttonUp = true;
}
Serial.print("LED:");
Serial.println(digitalRead(LED));
}
/**********************************************************
温湿度传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature - 5; //将温度赋值
humidity = DHT.humidity - 10;//将湿度赋值
//Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0,0); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Temp:");
lcd.print(temperature);//lcd.print(millis());
//lcd.print("°");
lcd.print((char)223);//温度符号"°"
lcd.print("C");
lcd.setCursor(0,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Humi:");
lcd.print(humidity);//lcd.print(millis());
lcd.print("%");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println("温湿度:不正常!");
delay(50);
}else
{
Serial.println("温湿度:正常");
delay(50);
}
}
/**********************************************************
光线传感器处理函数
功能:光敏电阻受到光线的照射阻值会迅速变小。因此:light变量-大-无光;light变量-小-有光
**********************************************************/
void sensor_light()
{
light = analogRead(LIGHT_PIN);
Serial.print("Light : ");
Serial.println(light);
if(light<=300)
{
//light<=300 有光-光敏电阻值变小-光线亮
//lcd.clear();//清屏
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”12“第12个开始
//lcd.print("LG:");
lcd.print("Light");
Serial.println("光线:正常!");
}
else
{
//光线暗-阻值大-暗
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”11“第11个开始
//lcd.print("LG:");
lcd.print("Dark");
lcd.setCursor(15,0);
lcd.print(" ");
Serial.println("光线:不正常!");
}
}
/**********************************************************
窗户状态处理函数
功能:控制电机打开、关闭窗户
**********************************************************/
/**********************************************************
函数名:检测水滴感应函数
功能:检测数字、模拟信号数据
**********************************************************/
void sensor_water()
{
water_A7 = analogRead(WATER_A7PIN);
//water_D3 = digitalRead(WATER_D3PIN);
//if(water_A7 <= 500 && water_D3 == 0)//判断有水时:WATER_A7PIN读取的数值变小 、WATER_D3PIN数值为“0”
if(water_A7 <= 500 )
{
Serial.println("水滴:有雨水!");
}
else
{
}
Serial.print("水滴:无雨水!");
// Serial.println(water_A7);
// Serial.print("WATER_D3PIN : ");
// Serial.println(water_D3);
}
/**********************************************************
函数名:CO2气体感应函数
功能:检测二氧化碳浓度 ppm
**********************************************************/
//void sensor_CO2()
//{
//
// //Serial.println("this is a CCS811_Sensor!");
//
// if(ccs.DataReady())
// {
// uint16_t eCO2,TVOC;
// ccs.ReadResult(&eCO2, &TVOC);
// Serial.print("CO2:");
// Serial.print(eCO2);
//
// Serial.print("ppm\r\nTVOC:");
// Serial.print(TVOC);
//
// Serial.print("ppb\r\nTemp:");
// double temp=ccs.Temperature();
// Serial.println(temp);
// }
// delay(5000);
// Serial.println(" ");
//}
void window()
{
//温度太高、湿度太重、无水滴得情况下-打开窗户
if((temperature > 29 || humidity > 89 || water_A7 >= 500 ) && windostate == false )
{
lcd.setCursor(11,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Open");
digitalWrite(WINDOW1_MOTOR_6PIN,Speed); //打开窗户中...
digitalWrite(WINDOW1_MOTOR_9PIN,LOW); //
digitalWrite(WINDOW2_MOTOR_3PIN,Speed); //打开窗户...
digitalWrite(WINDOW2_MOTOR_5PIN,LOW); //
delay(DelayTime);//这里添加一个延时,是给电机打开窗户时间 为 5秒,5秒后停止。
digitalWrite(WINDOW1_MOTOR_6PIN,LOW); //打开完毕,停止
digitalWrite(WINDOW1_MOTOR_9PIN,LOW); //
digitalWrite(WINDOW2_MOTOR_3PIN,LOW); //
digitalWrite(WINDOW2_MOTOR_5PIN,LOW); //
windostate = true;
}
else if((temperature <= 16 || humidity <= 50 || water_A7 <= 330) && windostate == true)
{
lcd.setCursor(11,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("...");
digitalWrite(WINDOW1_MOTOR_6PIN,LOW); //关闭窗户中...
digitalWrite(WINDOW1_MOTOR_9PIN,Speed);//
digitalWrite(WINDOW2_MOTOR_3PIN,LOW); //关闭窗户...
digitalWrite(WINDOW2_MOTOR_5PIN,Speed);//
delay(DelayTime);//这里添加一个延时,是给电机打开窗户时间 为 5秒,5秒后停止。
digitalWrite(WINDOW1_MOTOR_6PIN,LOW); //停止关闭
digitalWrite(WINDOW1_MOTOR_9PIN,LOW); //
digitalWrite(WINDOW2_MOTOR_3PIN,LOW); //
digitalWrite(WINDOW2_MOTOR_5PIN,LOW); //
windostate = false;
}
/*******************光线感应器控制窗帘判断*******************/
else if(light>=300 && curtainstate == false)//光线太暗
{
digitalWrite(CL_MOTOR_10PIN,Speed); //打开窗帘中...
digitalWrite(CL_MOTOR_11PIN,LOW); //
delay(DelayTime);
digitalWrite(CL_MOTOR_10PIN,LOW); //停止打开
digitalWrite(CL_MOTOR_11PIN,LOW); //
curtainstate = true;
}
else if(light<=100 && curtainstate == true) //光线亮
{
digitalWrite(CL_MOTOR_10PIN,LOW); //
digitalWrite(CL_MOTOR_11PIN,Speed); //关闭窗帘中...
delay(DelayTime);
digitalWrite(CL_MOTOR_10PIN,LOW); //
digitalWrite(CL_MOTOR_11PIN,LOW); //停止关闭
curtainstate = false;
}
}
窗户第一版代码:
/**********************************************************
*程序课题:温湿度传感器应用
*程序功能:读取DHT11传感器的温度
*编写:Naiva
**********************************************************/
#include //温湿度传感器头文件
#include //I2C头文件
#define DHT11_PIN A0//定义传感器数据引脚DHT11_PIN 为 A0
dht DHT; //dht类
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
void sensor_handle();//函数声明
void setup() {
Serial.begin(115200);
Serial.print("Temp Test Code:");
Serial.println("OK");
}
void loop() {
sensor_handle();
}
/**********************************************************
传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature; //将温度赋值
humidity = DHT.humidity;//将湿度赋值
Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println(" error ");
delay(1000);
}else
{
Serial.println(" It is OK");
delay(1000);
}
}
LCD1602液晶屏显示温度:
#include //温湿度传感器头文件
#include //I2C头文件
#include //LCD液晶屏// for 16 x 2 LCD module
#include //LCD液晶屏
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
#define DHT11_PIN A0//定义传感器数据引脚DHT11_PIN 为 A0
dht DHT; //dht类
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
void sensor_handle();//函数声明
void setup() {
Serial.begin(115200);
Serial.print("Temp Test Code:");
Serial.println("OK");
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
}
void loop() {
lcd.home (); // set cursor to 0,0
sensor_handle();
lcd.clear();//清屏
}
/**********************************************************
传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature; //将温度赋值
humidity = DHT.humidity;//将湿度赋值
Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0,0); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Temp:");
lcd.print(temperature);//lcd.print(millis());
lcd.print((char)223);//显示温度“°”符号
lcd.print("C"); //显示温度“C{“符号
lcd.setCursor(0,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Humi:");
lcd.print(humidity);//lcd.print(millis());
lcd.print("%");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println(" error ");
delay(1000);
}else
{
Serial.println(" It is OK");
delay(1000);
}
}
第二阶段:
功能:定义光线传感器数据引脚LIGHT_PIN 为 A1,并在LCD1602液晶屏幕上显示,有光线显示“OK”,无光线显示“Error”,
代码01:
#include //温湿度传感器头文件
#include //I2C头文件
#include //LCD液晶屏// for 16 x 2 LCD module
#include //LCD液晶屏
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
#define DHT11_PIN A0//定义温湿传感器数据引脚DHT11_PIN 为 A0
#define LIGHT_PIN A1//定义光线传感器数据引脚LIGHT_PIN 为 A1
dht DHT; //dht类
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
unsigned int light = 0; //定义光线 无符号整形存储变量
void sensor_handle();//函数声明
void sensor_light();
void setup() {
Serial.begin(115200);
Serial.print("Temp Test Code:");
Serial.println("OK");
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.clear();//清屏
}
void loop() {
lcd.home (); // set cursor to 0,0
//lcd.clear();//清屏
sensor_handle();
sensor_light();
}
/**********************************************************
温湿度传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature; //将温度赋值
humidity = DHT.humidity;//将湿度赋值
//Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0,0); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Temp:");
lcd.print(temperature);//lcd.print(millis());
//lcd.print("°");
lcd.print((char)223);//温度符号"°"
lcd.print("C");
lcd.setCursor(0,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Humi:");
lcd.print(humidity);//lcd.print(millis());
lcd.print("%");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println(" DHT_11 is error ");
delay(1000);
}else
{
Serial.println(" DHT_11 is OK");
delay(1000);
}
}
/**********************************************************
光线传感器处理函数
功能:光敏电阻受到光线的照射阻值会迅速变小。因此:light变量-大-无光;light变量-小-有光
**********************************************************/
void sensor_light()
{
lcd.clear();//清屏
light = analogRead(LIGHT_PIN);
Serial.print("Light : ");
Serial.println(light);
if(light>=600)//光线暗
{
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”11“第11个开始
//lcd.print("LG:");
lcd.print("Error");
Serial.println(" Light is error ");
}
else//light<=600 有光-光敏电阻值变小-光线亮
{
lcd.setCursor(12,0); // LCD液晶屏,“0”是第1行 ”12“第12个开始
//lcd.print("LG:");
lcd.print("OK");
Serial.println(" Light is ok");
}
}
代码02:
#include //温湿度传感器头文件
#include //I2C头文件
#include //LCD液晶屏// for 16 x 2 LCD module
#include //LCD液晶屏
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
#define DHT11_PIN A0//定义温湿传感器数据引脚DHT11_PIN 为 A0
#define LIGHT_PIN A1//定义光线传感器数据引脚LIGHT_PIN 为 A1
dht DHT; //dht类
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
unsigned int light = 0; //定义光线 无符号整形存储变量
void sensor_handle();//温湿度函数声明
void sensor_light();//光线函数声明
void setup() {
Serial.begin(115200);
Serial.print("Temp Test Code:");
Serial.println("OK");
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print("Intelligent ");
lcd.setCursor(0,1);
lcd.print("Window System");
delay(5000);
lcd.clear();//清屏
}
void loop() {
lcd.home (); // set cursor to 0,0
//lcd.clear();//清屏
sensor_handle();
sensor_light();
delay(200);
}
/**********************************************************
温湿度传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature; //将温度赋值
humidity = DHT.humidity;//将湿度赋值
//Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0,0); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Temp:");
lcd.print(temperature);//lcd.print(millis());
//lcd.print("°");
lcd.print((char)223);//温度符号"°"
lcd.print("C");
lcd.setCursor(0,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Humi:");
lcd.print(humidity);//lcd.print(millis());
lcd.print("%");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println(" DHT_11 is error ");
delay(500);
}else
{
Serial.println(" DHT_11 is OK");
delay(500);
}
}
/**********************************************************
光线传感器处理函数
功能:光敏电阻受到光线的照射阻值会迅速变小。因此:light变量-大-无光;light变量-小-有光
**********************************************************/
void sensor_light()
{
light = analogRead(LIGHT_PIN);
Serial.print("Light : ");
Serial.println(light);
if(light<=300)
{
//light<=300 有光-光敏电阻值变小-光线亮
//lcd.clear();//清屏
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”12“第12个开始
//lcd.print("LG:");
lcd.print("Light");
Serial.println(" Light is ok");
}
else
{
//光线暗-阻值大-暗
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”11“第11个开始
//lcd.print("LG:");
lcd.print("Dark");
lcd.setCursor(15,0);
lcd.print(" ");
Serial.println(" Light is error ");
}
}
智能窗户0620:
功能:
1、温湿度
2、光线
3、雨滴传感器
#include //温湿度传感器头文件
#include //I2C头文件
#include //LCD液晶屏// for 16 x 2 LCD module
#include //LCD液晶屏
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // 0x27 is the I2C bus address for an unmodified backpack
#define DHT11_PIN A0//定义温湿传感器数据引脚DHT11_PIN 为 A0
#define LIGHT_PIN A1//定义光线传感器数据引脚LIGHT_PIN 为 A1
#define WATER_A7PIN A7//定义水滴传感器数据引脚WATER_PIN 为 A7
#define WATER_D3PIN 3
dht DHT; //dht类
unsigned int temperature = 0;//定义温度 存储变量
unsigned int humidity = 0;//定义湿度 无符号整形存储变量
unsigned int light = 0; //定义光线 无符号整形存储变量
unsigned int water_A7 = 0; //定义水滴模拟存储变量初始化为“0”
unsigned int water_D3 = 0; //定义水滴数字存储变量
void sensor_handle();//温湿度函数声明
void sensor_light();//光线函数声明
void window();
void sensor_water();
void setup() {
Serial.begin(9600);
Serial.print("Temp Test Code:");
Serial.println("OK");
lcd.begin (16,2); // for 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print("Intelligent ");
lcd.setCursor(0,1);
lcd.print("Window System");
for(int i = 5;i > 0;i--)
{
lcd.setCursor(14,0);
lcd.print(i);
delay(1000);
}
lcd.clear();//清屏
pinMode(WATER_D3PIN,INPUT);
}
void loop() {
lcd.home (); // set cursor to 0,0
//lcd.clear();//清屏
sensor_handle();
sensor_light();
window();
sensor_water();
delay(2000);
}
/**********************************************************
温湿度传感器处理函数
**********************************************************/
void sensor_handle(){
int chk = DHT.read11(DHT11_PIN);//A0
temperature = DHT.temperature - 5; //将温度赋值
humidity = DHT.humidity - 10;//将湿度赋值
//Serial.println("************************************");
Serial.print("Temp : ");
Serial.print(temperature);
Serial.println(" ℃");
Serial.print("Humi : ");
Serial.print(humidity);
Serial.println(" %");
lcd.setCursor(0,0); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Temp:");
lcd.print(temperature);//lcd.print(millis());
//lcd.print("°");
lcd.print((char)223);//温度符号"°"
lcd.print("C");
lcd.setCursor(0,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Humi:");
lcd.print(humidity);//lcd.print(millis());
lcd.print("%");
if(temperature > 29 or humidity > 89){//如果温度或湿度达到阈值
Serial.println(" DHT_11 is error ");
delay(500);
}else
{
Serial.println(" DHT_11 is OK");
delay(500);
}
}
/**********************************************************
光线传感器处理函数
功能:光敏电阻受到光线的照射阻值会迅速变小。因此:light变量-大-无光;light变量-小-有光
**********************************************************/
void sensor_light()
{
light = analogRead(LIGHT_PIN);
Serial.print("Light : ");
Serial.println(light);
if(light<=300)
{
//light<=300 有光-光敏电阻值变小-光线亮
//lcd.clear();//清屏
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”12“第12个开始
//lcd.print("LG:");
lcd.print("Light");
Serial.println(" Light is ok");
}
else
{
//光线暗-阻值大-暗
lcd.setCursor(11,0); // LCD液晶屏,“0”是第1行 ”11“第11个开始
//lcd.print("LG:");
lcd.print("Dark");
lcd.setCursor(15,0);
lcd.print(" ");
Serial.println(" Light is error ");
}
}
/**********************************************************
窗户状态处理函数
功能:控制电机打开、关闭窗户
**********************************************************/
void window()
{
if(temperature > 29 || humidity > 89 || light>=300 )
{
lcd.setCursor(11,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print("Open");
}
else
{
lcd.setCursor(11,1); // LCD液晶屏,“1”是第2行 ”9“第9个开始
lcd.print(" ");
}
}
void sensor_water()
{
water_A7 = analogRead(WATER_A7PIN);
water_D3 = digitalRead(WATER_D3PIN);
if(water_A7 <= 500 && water_D3 == 0)//判断有水时:WATER_A7PIN读取的数值变小 、WATER_D3PIN数值为“0”
{
}
else
{
}
Serial.print("WATER_A7PIN : ");
Serial.println(water_A7);
Serial.print("WATER_D3PIN : ");
Serial.println(water_D3);
}
红绿灯项目06/25最终版本:
#include
Servo myservo;
/******************红绿灯******************/
unsigned int G1_LIGHT = 13;//绿灯
unsigned int Y1_LIGHT = 2;//黄灯
unsigned int R1_LIGHT = 3;//红灯
unsigned int G2_LIGHT = 4;//绿灯
unsigned int Y2_LIGHT = 5;//黄灯
unsigned int R2_LIGHT = 6;//红灯
unsigned int G3_LIGHT = 8;//绿灯
unsigned int Y3_LIGHT = 9;//黄灯
unsigned int R3_LIGHT = 10;//红灯
unsigned int G4_LIGHT = 11;//绿灯
//unsigned int Y4_LIGHT = 8;//黄灯人行道红绿灯
unsigned int R4_LIGHT = 12;//红灯
/******************延时时间******************/
unsigned int G_Time = 20;//绿灯倒计时“20”秒
unsigned int Y_Time = 5;
unsigned int R_Time = 10;
//unsigned int count = 30;//计数变量初始化为 0
/******************函数声明******************/
void RYG_light ();
void setup() {
Serial.begin(9600);
pinMode(R1_LIGHT,OUTPUT);//输出模式
pinMode(Y1_LIGHT,OUTPUT);
pinMode(G1_LIGHT,OUTPUT);
pinMode(R2_LIGHT,OUTPUT);//输出模式
pinMode(Y2_LIGHT,OUTPUT);
pinMode(G2_LIGHT,OUTPUT);
pinMode(R3_LIGHT,OUTPUT);//输出模式
pinMode(Y3_LIGHT,OUTPUT);
pinMode(G3_LIGHT,OUTPUT);
pinMode(R4_LIGHT,OUTPUT);//输出模式人行道12
//pinMode(Y4_LIGHT,OUTPUT);
pinMode(G4_LIGHT,OUTPUT); //11
for(int i=0;i > 0; i++)
{
digitalWrite(i,LOW);
}
myservo.attach(9);//Servo PIN
}
void loop() {
RYG_light ();
}
void RYG_light ()
{
// R_random = random(0, 1);//随机数
// Y_random = random(0, 1);
// G_random = random(0, 1);
//
// digitalWrite((random(1,3)),HIGH);//1
// digitalWrite((random(0, 1)),HIGH);//1
//
for(int count = 30 ;count > -15 && count <= 30;count--)//car time : 0-30 human time :-15 - 0
{
if(20 < count && count <= 30)
{
digitalWrite(G1_LIGHT,HIGH);//
digitalWrite(Y1_LIGHT,LOW);
digitalWrite(R1_LIGHT,LOW);
digitalWrite(G2_LIGHT,HIGH);
digitalWrite(Y2_LIGHT,LOW);//
digitalWrite(R2_LIGHT,LOW);
digitalWrite(G3_LIGHT,HIGH);
digitalWrite(Y3_LIGHT,LOW);
digitalWrite(R3_LIGHT,LOW);//
Serial.print("Green-YELLOW-RED- LIGHT");
Serial.println(count);
delay(500);//
}
if(15 < count && count <= 20)
{
digitalWrite(G2_LIGHT,HIGH);
digitalWrite(Y2_LIGHT,LOW);//
digitalWrite(R2_LIGHT,LOW);
digitalWrite(G3_LIGHT,HIGH);
digitalWrite(Y3_LIGHT,LOW);
digitalWrite(R3_LIGHT,LOW);//
digitalWrite(G1_LIGHT,LOW);
digitalWrite(Y1_LIGHT,HIGH);//********11111111
digitalWrite(R1_LIGHT,LOW);
delay(500);//
digitalWrite(G1_LIGHT,LOW);
digitalWrite(Y1_LIGHT,LOW);//*********1111111111
digitalWrite(R1_LIGHT,LOW);
Serial.print("Green-YELLOW-RED- LIGHT");
Serial.println(count);
//delay(500);//
}
if(10 < count && count <= 15)
{
digitalWrite(G1_LIGHT,LOW);
digitalWrite(Y1_LIGHT,LOW);
digitalWrite(R1_LIGHT,HIGH); //
digitalWrite(G3_LIGHT,HIGH);
digitalWrite(Y3_LIGHT,LOW);
digitalWrite(R3_LIGHT,LOW);//
digitalWrite(G2_LIGHT,LOW);
digitalWrite(Y2_LIGHT,HIGH);//*******2222222
digitalWrite(R2_LIGHT,LOW);
delay(500);//
digitalWrite(G2_LIGHT,LOW);
digitalWrite(Y2_LIGHT,LOW);//******22222222
digitalWrite(R2_LIGHT,LOW);
Serial.print("Green-YELLOW-RED- LIGHT");
Serial.println(count);
//delay(500);//
}
if(5 < count && count <= 10)
{
digitalWrite(G1_LIGHT,LOW);
digitalWrite(Y1_LIGHT,LOW);
digitalWrite(R1_LIGHT,HIGH); //
digitalWrite(G2_LIGHT,LOW);
digitalWrite(Y2_LIGHT,LOW);//
digitalWrite(R2_LIGHT,HIGH);
digitalWrite(G3_LIGHT,LOW);
digitalWrite(Y3_LIGHT,HIGH);//33333333333333
digitalWrite(R3_LIGHT,LOW);
delay(500);//
digitalWrite(G3_LIGHT,LOW);
digitalWrite(Y3_LIGHT,LOW);//333333333
digitalWrite(R3_LIGHT,LOW);
Serial.print("Green-YELLOW-RED- LIGHT");
Serial.println(count);
//delay(500);//
}
if(count <= 5)
{
digitalWrite(G1_LIGHT,LOW);
digitalWrite(Y1_LIGHT,LOW);
digitalWrite(R1_LIGHT,HIGH); //
digitalWrite(G2_LIGHT,LOW);
digitalWrite(Y2_LIGHT,LOW);//
digitalWrite(R2_LIGHT,HIGH);
digitalWrite(G3_LIGHT,LOW);
digitalWrite(Y3_LIGHT,LOW);//
digitalWrite(R3_LIGHT,HIGH);
delay(500);//
}
if(digitalRead(R3_LIGHT) == HIGH && digitalRead(R2_LIGHT) == HIGH && digitalRead(R1_LIGHT) == HIGH)
{
Serial.println("HUMAN STREET :Green light!\n");
digitalWrite(G4_LIGHT,HIGH);
digitalWrite(R4_LIGHT,LOW);
myservo.write(0); //Servo 0
}
else
{
Serial.println("HUMAN STREET :Red light!\n");
digitalWrite(G4_LIGHT,LOW);
digitalWrite(R4_LIGHT,HIGH);
myservo.write(90); //Servo 90
}
delay(500);//
}
}
交通灯项目0620:
功能描述:
/**********************************************************
*程序课题:交通灯
*程序功能:地面交通信号灯与交通灯柱上信号灯一致,且人行道红灯时打开栅栏,防止行人闯红灯
*编写:Naiva
**********************************************************/
#include
unsigned int G_LIGHT = 8;//绿灯引脚定义为“8”
unsigned int Y_LIGHT = 9;//黄灯
unsigned int R_LIGHT = 10;//红灯
unsigned int B_Switch = 12;//手动模式按钮
unsigned int LED = 13;
boolean buttonUp = true;//flag旗标-之前被按下过为true,按钮又弹起来。
unsigned int R_BUTTON = 11;//手动模式_红灯_按钮
unsigned int Y_BUTTON = 4;
unsigned int G_BUTTON = 3;
unsigned int G_Time = 20;//绿灯倒计时“20”秒
unsigned int Y_Time = 5;
unsigned int R_Time = 10;
Servo myservo;//定义一个myservo
unsigned int count = 0;//计数变量初始化为 0
unsigned int i = 0;//计数变量初始化为 0
void RYG_light2();//函数声明
void Choose_ (); //模式选择
void R_LIGHT_BUTTON();//自动模式:红色按钮
void Y_LIGHT_BUTTON();
void G_LIGHT_BUTTON();
void setup() {
Serial.begin(9600);
pinMode(R_LIGHT,OUTPUT);//输出模式
pinMode(Y_LIGHT,OUTPUT);
pinMode(G_LIGHT,OUTPUT);
pinMode(B_Switch,INPUT);//读取Pin_11引脚,读取输入模式
//digitalWrite(HIGH);//初始化为HIGH,上拉电阻为“1”
pinMode(13,OUTPUT);
digitalWrite(13,LOW);//LED_13_PIN 关闭状态
pinMode(R_BUTTON,INPUT);//红色按钮,设置为输入
pinMode(Y_BUTTON,INPUT);
pinMode(G_BUTTON,INPUT);
myservo.attach(5);//舵机
//digitalWrite();
}
void loop() {
Choose_ ();//函数调用,B_Switch选择模式
if(digitalRead(13) == HIGH)//手动模式
{
Serial.println("模式一:手动模式");
R_LIGHT_BUTTON();//红灯
Y_LIGHT_BUTTON();//
G_LIGHT_BUTTON();//
}
else if(digitalRead(13) == LOW)//自动模式
{
Serial.println("模式二:自动模式");
RYG_light2();//
}
//RYG_light1();
//RYG_light2();
delay(200);
}
/**********************************************************
模式函数:自动模式与手动模式
功能描述:B_Switch读取按键状态“1”“0”,
状态“1”==“手动模式"且"13_PIN_LED==HIGH”;
状态“0”==“自动模式”且"13_PIN_LED==LOW”
**********************************************************/
void Choose_ ()
{
Serial.println(digitalRead(B_Switch));
if(digitalRead(B_Switch) == HIGH && buttonUp == true)//按钮按下的一瞬间"1"
//digitalRead(B_Switch)!= LOW && buttonUp ==true
{
digitalWrite(13,!digitalRead(13)); //测试点亮_13_PIN_LED灯 HIGH & LOW
buttonUp = false;
}
else if(digitalRead(B_Switch)== LOW && buttonUp == false)//按钮没有按下"0"
//digitalRead(B_Switch)== HIGH && buttonUp !=true
{
buttonUp = true;
}
}
/**********************************************************
手动控制红灯函数:手动模式-控制红灯亮
功能描述:手动模式-控制红灯亮
**********************************************************/
void R_LIGHT_BUTTON()
{
Serial.println(digitalRead(R_BUTTON));
if(digitalRead(R_BUTTON) == HIGH && buttonUp == true)//按钮按下的一瞬间"1"
//digitalRead(B_Switch)!= LOW && buttonUp ==true
{
digitalWrite(G_LIGHT,LOW);//
digitalWrite(Y_LIGHT,LOW);
digitalWrite(R_LIGHT,!digitalRead(R_LIGHT));
//digitalWrite(13,!digitalRead(13)); //测试点亮_13_PIN_LED灯 HIGH & LOW
buttonUp = false;
}
else if(digitalRead(R_BUTTON)== LOW && buttonUp == false)//按钮没有按下"0"
//digitalRead(B_Switch)== HIGH && buttonUp !=true
{
buttonUp = true;
}
if(digitalRead(R_LIGHT) == HIGH)
{
myservo.write(90); //舵机上拉围栏90°
}
else
{
myservo.write(0); //舵机上拉围栏0°
}
}
/**********************************************************
手动控制黄灯函数:手动模式-控制黄灯亮
功能描述:手动模式-控制黄灯亮
**********************************************************/
void Y_LIGHT_BUTTON()
{
Serial.println(digitalRead(Y_BUTTON));
if(digitalRead(Y_BUTTON) == HIGH && buttonUp == true)//按钮按下的一瞬间"1"
//digitalRead(B_Switch)!= LOW && buttonUp ==true
{
digitalWrite(G_LIGHT,LOW);//
digitalWrite(R_LIGHT,LOW);
digitalWrite(Y_LIGHT,!digitalRead(Y_LIGHT));
//digitalWrite(13,!digitalRead(13)); //测试点亮_13_PIN_LED灯 HIGH & LOW
buttonUp = false;
}
else if(digitalRead(R_BUTTON)== LOW && buttonUp == false)//按钮没有按下"0"
//digitalRead(B_Switch)== HIGH && buttonUp !=true
{
buttonUp = true;
}
}
/**********************************************************
手动控制绿灯函数:手动模式-控制绿灯亮
功能描述:手动模式-控制绿灯亮
**********************************************************/
void G_LIGHT_BUTTON()
{
Serial.println(digitalRead(G_BUTTON));
if(digitalRead(G_BUTTON) == HIGH && buttonUp == true)//按钮按下的一瞬间"1"
//digitalRead(B_Switch)!= LOW && buttonUp ==true
{
digitalWrite(Y_LIGHT,LOW);//
digitalWrite(R_LIGHT,LOW);
digitalWrite(G_LIGHT,!digitalRead(G_LIGHT));
//digitalWrite(13,!digitalRead(13)); //测试点亮_13_PIN_LED灯 HIGH & LOW
buttonUp = false;
}
else if(digitalRead(G_BUTTON)== LOW && buttonUp == false)//按钮没有按下"0"
//digitalRead(B_Switch)== HIGH && buttonUp !=true
{
buttonUp = true;
}
}
/**********************************************************
自动模式-红绿灯函数2:三色红绿灯计时
功能:红45秒、黄5秒、绿10秒 三色交通灯
**********************************************************/
void RYG_light2 ()
{
for(int G_count = G_Time;digitalRead(13) == LOW&&G_count > 0;G_count--)
{
Choose_ ();//检查是否为“自动模式状态”
myservo.write(0); //舵机下放围栏90°
digitalWrite(G_LIGHT,HIGH);//
digitalWrite(Y_LIGHT,LOW);
digitalWrite(R_LIGHT,LOW);
Serial.print("Green LIGHT:");
Serial.println(G_count);
delay(1000);
}
for( int Y_count = Y_Time;digitalRead(13) == LOW&&Y_count > 0;Y_count--)
{
Choose_ ();//检查是否为“自动模式状态”
digitalWrite(R_LIGHT,LOW);
digitalWrite(G_LIGHT,LOW);
digitalWrite(Y_LIGHT,HIGH);//
delay(500);
digitalWrite(Y_LIGHT,LOW);//
delay(500);
Serial.print("Yellow LIGHT:");
Serial.println(Y_count);
}
for(int R_count = R_Time;digitalRead(13) == LOW&&R_count > 0;R_count--)
{
Choose_ ();//检查是否为“自动模式状态”
myservo.write(90); //舵机上拉围栏0°
digitalWrite(G_LIGHT,LOW);
digitalWrite(Y_LIGHT,LOW);
digitalWrite(R_LIGHT,HIGH);//
Serial.print("Red LIGHT:");
Serial.println(R_count);
delay(1000);
}
}