一、接线框图
1、下载fritzing
https://github.com/fritzing/fritzing-app/releases
打开的软件界面如下:
2、系统框图
硬件信息:
- Devkit – Arduino UNO
- 温湿度传感器 – DHT11
- 光敏传感器 – 光敏电阻
- 人体感应传感器 – DHT11
- 烟雾传感器 – MQ-2
- WiFi通信模块 – ESP8266-12F
- TTS语音模块 – Lu6288
二、Arduino IDE 下载
P.S. 如果upload代码过程中出现can't open device /dev/ttyUSB0,Permissions Denied
,运行如下指令:
sudo touch /etc/udev/rules.d/70-ttyusb.rules
echo "KERNEL=="ttyUSB[0-9]*",MODE="0666"" > /etc/udev/rules.d/70-ttyusb.rules
然后查看USB设备是否已经被赋予权限
wie@wie-virtual-machine:~/arduino-ide_2.3.2_Linux_64bit$ sudo ls -al /dev/ttyUSB*
crw-rw-rw-+ 1 root dialout 188, 0 Mar 24 18:09 /dev/ttyUSB0
三、Arduino IDE 导入 机智云 Gizwits
查看Arduino的库文件存放目录地址
把生成的机智云代码开发包拷贝到 arduino的库路径
编译成功
P.S. 机智云API 和ESP32 12F的通信默认采用D0和D1(与USB程序下载冲突),因此给板子下载程序的时候需要先把和ESP32 12F的连接断开
四、实现代码
sound.h – 该文件只能在win下用笔记本进行编辑,不能使用Arduino IDE 编译,否则会引起语音合成错误,在Arduino IDE看到文件内容乱码即为正确
//此处修改语音数据,MR628语音合成协议为<G>开头,
//所以只需修改<G>后的内容,请勿删除<G>或更改其位置
const char sound[]={"<G>欢迎使用MR628语音合成模块"};
main.ino
#include <DHT.h>
#include "sound.h"
#include <Gizwits.h>
#include <Wire.h>
#include <SoftwareSerial.h>
/*
MQ-2 <----------> A2
DHT11 <----------> D2
光敏电阻 <----------> A0
HC-SR505 <----------> D3
RED_LED <----------> D13
*/
//由于Arduino IDE编码问题,串口直接发送中文语音模块无法正确识别,因此将语音合成数据放在“sound.h”文件中,
//此文件在Arduino IDE中显示乱码,无需在意。请使用记事本打开"sound.h"文件修改语音数据,切勿在Arduino IDE中直接修改,
//否则会引起语音合成数据错误!
//此处修改语音数据,MR628语音合成协议为<G>开头,
//所以只需修改<G>后的内容,请勿删除<G>或更改其位置
/********************** GPIO setting start *************************/
#define LED 13 // 设置LED的引脚
#define BEEP 12 // 设置BEEP的引脚
#define MQ2_PIN A2 // 设置MQ-2连接的引脚
#define DHTPIN 2 // 设置DHT11连接的引脚
#define DHTTYPE DHT11 // 设置使用的传感器类型
#define photosensitivePin A0 // 定义光敏电阻模拟口A0 光越亮,值越小;光越暗,值越大
#define phTimeInterval 1000 // 检测一次的时间间隔
#define PIROUT 3 // 设置HC-SR505热释电运动传感器连接的引脚
/********************** GPIO setting end *************************/
// enum Mode
// {
// leisure_mode = 0;
// work_mode;
// quiet_mode;
// }
unsigned long phTimes = 0; // 记录设备运行时间
int photosenVal = 0; // 光照度数值
int photoContent = 0;
int MQ2_Value = 0;
float humidity = 0;
float temperature = 0;
bool varW_Human = 0;
int mode = 0;
DHT dht(DHTPIN, DHTTYPE); // 创建DHT对象
SoftwareSerial sound_Serial(9,8); // 新建一个 sound_Serial 对象,RX:9,TX:8 for Lu6288
SoftwareSerial debug_Serial(A3, A4); // A3 -> RX, A4 -> TX
Gizwits myGizwits;
void setup() {
sound_Serial.begin(9600); // 初始化软串口通信 -- for sound report
sound_Serial.listen(); // 监听软串口通信 -- for sound report
Serial.begin(9600); // 初始化串口通信 -- for ESP8266-12F
debug_Serial.begin(9600); // 初始化串口通信 -- for debug
dht.begin(); // 初始化DHT传感器
pinMode(PIROUT, INPUT); // 模块连接引脚D2,并设置为输入模式
pinMode(LED, OUTPUT); // 模块连接引脚D13,并设置为输出入模式
pinMode(MQ2_PIN, INPUT); // 模块连接引脚A2,并设置为输出入模式
myGizwits.begin();
debug_Serial.println("GoKit init OK \n");
}
void loop() {
// //Configure network
// if(key < 2)
// {
// delay(2000);
// myGizwits.setBindMode(WIFI_AIRLINK_MODE); // WIFI_AIRLINK_MODE \ WIFI_SOFTAP_MODE \ WIFI_RESET_MODE
// delay(2000);
// key ++;
// }
/********************************************************************************/
//获取光敏电阻的值
getPhData();
// 读取温湿度传感器的数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
debug_Serial.println("无法从DHT传感器读取数据!");
}
// 读取MQ2传感器的数据
MQ2_Value = analogRead(MQ2_PIN);
// 打印温湿度数据
debug_Serial.print("湿度: ");
debug_Serial.print(humidity);
debug_Serial.print("%\t");
debug_Serial.print("温度: ");
debug_Serial.print(temperature);
debug_Serial.print("°C");
debug_Serial.print("%\t");
debug_Serial.print("MQ2: ");
debug_Serial.println(MQ2_Value);
if (humidity > 75 || temperature > 31) {
debug_Serial.println("温湿度大于阈值亮灯");
digitalWrite(LED, HIGH); // 亮灯
}
if (digitalRead(PIROUT) == HIGH) {
varW_Human = 1;
debug_Serial.println("有人在这里!");
digitalWrite(LED, HIGH);
}
else{
varW_Human = 0;
debug_Serial.println("无人在这里");
digitalWrite(LED, LOW);
}
sound_Serial.print("<M>0");//关闭背景音乐
delay(50);
sound_Serial.print(sound);//发送语音合成指令
delay(2000); // 延迟2秒后再次读取数据
//wifiStatusHandle();
// if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
{
debug_Serial.println(F("WIFI_CON_ROUTER!"));
bool varW_Human = 1;//Add Sensor Data Collection
myGizwits.write(VALUE_Human, varW_Human);
unsigned long varW_Humidity = (int)humidity;//Add Sensor Data Collection
myGizwits.write(VALUE_Humidity, varW_Humidity);
float varW_temperature = temperature;//Add Sensor Data Collection
myGizwits.write(VALUE_temperature, varW_temperature);
}
myGizwits.process();
}
/*获取光敏电阻的值*/
void getPhData() {
if (millis() - phTimes >= phTimeInterval) { //一定时间检测一次
phTimes = millis();
photosenVal = analogRead(photosensitivePin); //获取原始值
photosenVal = constrain(photosenVal, 10, 1024); //原始值限制在一定范围
photoContent = map(photosenVal, 10, 1024, 100, 0); //映射到对应的区间
debug_Serial.print("原始数据: "); //串口打印对应的值
debug_Serial.print(photosenVal); //串口打印对应的值
debug_Serial.print(" ,光照强度: "); //串口打印对应的值
debug_Serial.print(photoContent); //串口打印对应的值
debug_Serial.println(" %"); //串口打印对应的值
}
}
/**
* Wifi status printf
* @param none
* @return none
*/
void wifiStatusHandle()
{
if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
{
debug_Serial.println(F("WIFI_CON_ROUTER!"));
bool varW_Human = 1;//Add Sensor Data Collection
myGizwits.write(VALUE_Human, varW_Human);
unsigned long varW_Humidity = (int)humidity;//Add Sensor Data Collection
myGizwits.write(VALUE_Humidity, varW_Humidity);
float varW_temperature = temperature;//Add Sensor Data Collection
myGizwits.write(VALUE_temperature, varW_temperature);
}
}