介绍
首先,介绍一下本次项目-我的结课作业
经过一学期的学习,也是多多少少了解了一点关于Arduino的东西了,现在我们开始介绍我和我搭档的大作业,也希望这个作业可以帮助到你们。
功能介绍
由于老师提供的开发板是Arduino UNO R3,根本不具备wifi或者是蓝牙功能,这就是的我们的项目很难有特点。
于是我们开始专研ESP-01s(下面简称ESP)和Arduino的串烧,网络端向ESP发送数据再由ESP向Arduino发送处理后的数据,这样就可以控制我们的主板了。
原谅一下站主没有找到Arduino的Fritzing插件,站主这几天也比较忙没有去画这些插件。

图一·Fritzing图

图二·手机端
很明显我们这个产品是一个超市系统,简述产品功能如下:
数据流:

图三·数据流
模块与实现功能:
| 序号 | 主--模块 | 次--模块 | 作用 |
| 1 | U型光电传感器 | 有源蜂鸣器(HH) | 检测客流量,模拟“欢迎光临” |
| 2 | 干簧管 | U型发光电传感器、有源蜂鸣器(JB) | 检测用户是否逃单,有则报警 |
| 3 | LED--绿灯 | (APP直接操控) | 上班打卡,上班常亮,下班关闭 |
| 4 | 普通LED | (APP直接操控) | 模拟店内的所有照明(可添加) |
| 5 | 温度报警器 | LED(红)、有源蜂鸣器 | 报警 |
| 6 | 烟雾报警器 | LED(红)、有源蜂鸣器(JB) | 报警 |
| 7 | 温度传感器 | LED(红)、有源蜂鸣器 | 报警 |
| 8 | 28BYJ-48步进电机 | ULN2003、继电器 | 开关门 |
| 9 | 按钮 | 重启Arduino(记录的数据不会重置) | 关闭报警(报警不能由系统关系) |
| 10 | 光敏传感器 | 普通LED | 光线充足自动关灯 |
| 11 | 继电器 | 由APP直接控制反馈数据给Arduino |
表1·控件表
源代码:
Arduino源代码:
#include <Stepper.h>
//常数
int count = 0; //流量监控
int count1 = 0; //火焰次数
int count2 = 0; //烟雾次数
int a = 0, b = 0, c = 0;
//Arduino 端口使用
const int WEN = 13; //温度报警
const int LOUD = 12; //蜂鸣器
const int CITIE = A0; //磁报警
const int XX = A1; //U型红外传感器
const int SMOKE = A2; //烟雾报警器
const int FIRE = A3; //火焰报警器
const int LEDB = 7; //蓝灯
const int LEDR = 3; //红灯
const int LEDG = 2; //绿灯
const int JI = 6; //继电器
const int AN = 5; //照明
const int RAID = 4; //雨水传感器
const int HUI = A5; //
//步进电机
const int IN1 = 11;
const int IN2 = 10;
const int IN3 = 9;
const int IN4 = 8;
//继电器回调
const int H = A4; //切换
//电机函数定义
int kstep = 32;
Stepper myStepper(kstep, 11, 10, 9, 8);
bool Running = false;
bool active = true;
//警铃
void JL()
{
for (int i = 200; i <= 800; i++)
{
tone(LOUD, i);
delay(5);
}
delay(1000);
for (int i = 800; i >= 200; i--)
{
tone(LOUD, i);
delay(10);
}
}
//警报器
void JB()
{
float sinVal;
int toneVal;
for (int x = 0; x < 180; x++) {
sinVal = (sin(x * (3.1412 / 180)));
toneVal = 1300 + (int(sinVal * 1000));
tone(LOUD, toneVal);
digitalWrite(LEDR, HIGH);
delay(200);
digitalWrite(LEDR, LOW);
delay(200);
}
}
//灯泡闪烁 LED--R
void LED1()
{
int i;
for (i = 0; i < 20; i++)
{
digitalWrite(LEDR, HIGH);
delay(100);
digitalWrite(LEDR, LOW);
}
}
//LED--B
void LED2()
{
int i;
for (i = 0; i < 20; i++)
{
digitalWrite(LEDB, HIGH);
delay(100);
digitalWrite(LEDB, LOW);
delay(100);
}
}
//欢迎
void HH()
{
int i;
for (i = 0; i < 3; i++)
{
digitalWrite(LOUD, LOW);
delay(100);
digitalWrite(LOUD, HIGH);
delay(100);
}
}
//报警
void yu()
{
int i;
for (i = 0; i < 20; i++)
{
digitalWrite(LOUD, LOW);
delay(50);
digitalWrite(LOUD, HIGH);
delay(50);
}
}
void setup() {
Serial.begin(9600);
pinMode(FIRE, INPUT); //火焰
pinMode(CITIE, INPUT); //磁
pinMode(SMOKE, INPUT); //烟雾
pinMode(XX, INPUT); //红外
pinMode(WEN, INPUT); //温度
pinMode(RAID, INPUT); //雨
pinMode(LEDB, OUTPUT); //蓝灯
pinMode(LEDR, OUTPUT); //红灯
pinMode(LEDG, OUTPUT); //绿灯
pinMode(JI, OUTPUT); //继电器
pinMode(AN, OUTPUT); //照明
pinMode(LOUD, OUTPUT); //蜂鸣器
pinMode(HUI, INPUT);
//步进电机
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
//继电器回调
pinMode(H, INPUT);
//初始化
digitalWrite(LEDB, LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDR, LOW);
digitalWrite(AN, LOW);
digitalWrite(JI, LOW);
digitalWrite(LOUD, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void loop() {
boolean wen = digitalRead(WEN); //温度
boolean citie = digitalRead(CITIE); //干簧管
boolean xx = digitalRead(XX); //U型红外传感器
boolean smoke = digitalRead(SMOKE);//烟雾报警器
boolean fire = digitalRead(FIRE);//火焰报警器
boolean raid = digitalRead(RAID);//雨水传感器
boolean hui = digitalRead(H);//继电器回调
boolean hui1 = digitalRead(HUI); //ESP回调引脚
boolean opening = digitalRead(HUI); //打开关闭电机
boolean qie = digitalRead(H); //切换
//客户进商店
if (xx == HIGH && citie == HIGH)
{
HH();
count++;
}
//用户逃单检测
if (xx == HIGH && citie == LOW)
{
JB();
}
//火焰
if (fire == LOW)
{
JL();
LED1();
count1++;
}
//烟雾
if (smoke == LOW)
{
JB();
count2++;
}
//雨水
if (raid == LOW)
{
yu();
LED2();
}
//温度
if (wen == LOW)
{
int i;
for (i = 0; ; i++)
{
digitalWrite(LOUD, LOW);
delay(200);
digitalWrite(LOUD, HIGH);
delay(200);
}
}
else
{
digitalWrite(LOUD, HIGH);
}
//接受ESP发送的命令
if (Serial.available() > 0)
{
char incomingChar = Serial.read();
switch (incomingChar)
{
case '1': //报警
JB();
break;
case '2':
digitalWrite(LOUD, LOW);
break;
case '3': //照明
digitalWrite(AN, HIGH);
break;
case '4':
digitalWrite(AN, LOW);
break;
case '5': //继电器
digitalWrite(JI, HIGH);
break;
case '6':
digitalWrite(JI, LOW);
break;
case '7': //签到/签退
digitalWrite(LEDG, HIGH);
break;
case '8':
digitalWrite(LEDG, LOW);
break;
case '9': //光感
if (digitalRead(AN) == HIGH)
{
digitalWrite(AN, LOW);
}
break;
default:
break;
}
}
//判断电机启动状态
if (opening == HIGH)
{
if (qie == HIGH && opening == HIGH)
{
myStepper.setSpeed(300);
myStepper.step(32);
}
else if (qie == LOW && opening == HIGH)
{
kstep = -kstep;
myStepper.setSpeed(300);
myStepper.step(-32);
}
}
else
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
//向ESP01发送数据
if (count > a || count1 > b || count2 > c)
{
Serial.print(count);
Serial.print(",");
Serial.print(count1);
Serial.print(",");
Serial.println(count2);
a = count;
b = count1;
c = count2;
}
}
ESP源代码:
#define BLINKER_MIOT_LIGHT
#define BLINKER_WIFI
#include <Blinker.h>
#include <Arduino.h>
//WIFI和阿里云服务器参数
char auth[] = "*********"; //点灯科技密钥
char ssid[] = "***********"; //你的wifi名字
char pswd[] = "****************"; //你的wifi密码
//光敏传感器
int GPIO = 0;
int GPIO1 = 2;
int count = 0, count1 = 0, count2 = 0;
//定义上传参数
BlinkerButton Button1("btn-0sk");//签到
BlinkerButton Button2("btn-g34");//继电器/切换
BlinkerButton Button3("btn-7ep");//照明
BlinkerButton Button4("btn-sze");//报警
BlinkerButton Button5("btn-0bo");//2口
BlinkerNumber COUNST1("mum-8kq"); //流量
BlinkerNumber COUNST2("mum-kin");// 火焰报警次数
BlinkerNumber COUNST3("mum-jzh");// 烟雾报警次数
//签到/签退
void button1_callback(const String & state)
{
Blinker.vibrate();
if (state == "on")
{
Serial.println("7");
Button1.print("on");
} else if (state == "off")
{
Serial.println("8");
Button1.print("off");
}
}
//继电器
void button2_callback(const String & state)
{
Blinker.vibrate();
if (state == "on")
{
Serial.println("5");
Button2.print("on");
}
else if (state == "off")
{
Serial.println("6");
Button2.print("off");
}
}
//照明
void button3_callback(const String & state)
{
Blinker.vibrate();
if (state == "on")
{
Serial.println("3");
Button3.print("on");
}
else if (state == "off")
{
Serial.println("4");
Button3.print("off");
}
}
//报警
void button4_callback(const String & state)
{
Blinker.vibrate();
if (state == "on")
{
Serial.println("1");
Button4.print("on");
}
else if (state == "off")
{
Serial.println("2");
Button4.print("off");
}
}
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_OFF)
{
Serial.println("2");
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_ON)
{
Serial.println("1");
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
}
}
//2号口
void button5_callback(const String & state)
{
Blinker.vibrate();
if (state == "on")
{
digitalWrite(GPIO1, HIGH);
Button5.print("on");
} else if (state == "off")
{
digitalWrite(GPIO1, LOW);
Button5.print("off");
}
}
void setup()
{
pinMode(GPIO, INPUT);
pinMode(GPIO1, OUTPUT);
Serial.begin(9600);
digitalWrite(GPIO1, LOW);
//联网、加数据数据同步到小爱同学和点灯科技
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
Button4.attach(button4_callback);
Button5.attach(button5_callback);
BlinkerMIOT.attachPowerState(miotPowerState);
}
void loop()
{
Blinker.run();
//向Arduino发送光感数据
boolean light = digitalRead(GPIO);
if (light == LOW)
{
Serial.println("9");
}
//接受Arduino发送的数据
if (Serial.available() > 0)
{
String data = "";
while (Serial.available())
{
char c = Serial.read();
if (c == '\n') {
int commaIndex1 = data.indexOf(',');
int commaIndex2 = data.indexOf(',', commaIndex1 + 1);
if (commaIndex1 != -1 && commaIndex2 != -1) {
int data1 = data.substring(0, commaIndex1).toInt();
int data2 = data.substring(commaIndex1 + 1, commaIndex2).toInt();
int data3 = data.substring(commaIndex2 + 1).toInt();
count += data1;
count1 += data2;
count2 += data3;
COUNST1.print(count);
COUNST2.print(count1);
COUNST3.print(count2);
}
data = "";
}
else
{
data += c;
}
}
}
}
源码都有注释,Arduino和ESP的接线图在图一
记住:ESP和Arduino的频率必须一致,不然就会丢包。ESP供电是3.3v,ESP供电是3.3v,ESP供电是3.3v。
源代码里面有一个控件连接了小爱同学,不需要的话可以删除。








Comments NOTHING