Arduino和ESP-01s串烧示例

发布于 2024-05-25  984 次阅读


介绍

首先,介绍一下本次项目-我的结课作业

经过一学期的学习,也是多多少少了解了一点关于Arduino的东西了,现在我们开始介绍我和我搭档的大作业,也希望这个作业可以帮助到你们。

功能介绍

由于老师提供的开发板是Arduino UNO R3,根本不具备wifi或者是蓝牙功能,这就是的我们的项目很难有特点。

于是我们开始专研ESP-01s(下面简称ESP)和Arduino的串烧,网络端向ESP发送数据再由ESP向Arduino发送处理后的数据,这样就可以控制我们的主板了。

原谅一下站主没有找到Arduino的Fritzing插件,站主这几天也比较忙没有去画这些插件。

图一·Fritzing图

点灯科技

图二·手机端

很明显我们这个产品是一个超市系统,简述产品功能如下:

数据流:

图三·数据流

模块与实现功能:

序号主--模块次--模块作用
1U型光电传感器有源蜂鸣器(HH)检测客流量,模拟“欢迎光临”
2干簧管U型发光电传感器、有源蜂鸣器(JB)检测用户是否逃单,有则报警
3LED--绿灯(APP直接操控)上班打卡,上班常亮,下班关闭
4普通LED(APP直接操控)模拟店内的所有照明(可添加)
5温度报警器LED(红)、有源蜂鸣器报警
6烟雾报警器LED(红)、有源蜂鸣器(JB)报警
7温度传感器LED(红)、有源蜂鸣器报警
828BYJ-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.3vESP供电是3.3v

源代码里面有一个控件连接了小爱同学,不需要的话可以删除。

  • alipay_img
  • wechat_img
心若有所向往,何惧道阻且长。
最后更新于 2024-05-25