图形化编程好用?自制一个ESP32数显时间继电器

这个东西就是实现在一定时间内按照间隔运行,淘宝上有很多,实际上如果不是为了测试我并没有必要自己做一个。

主要这个是我试着使用Mixly——一种图形化编程软件,支持Arduino IDE。这是我使用这个工具完成的一个简单项目,总的耗时为2.5小时

但是随着使用,我不得不怀疑这个软件真的是给小朋友用的吗,图形化后,逻辑上面的易用性确实提升了,很多语句不用查询不用百度搜索。

 

但是细节上的修改反而有比较多的繁琐的问题,比如说要配置一个value+1000,你不能直接写value+1000必须要拖拽一个模块下来

最终 整个项目的图形化界面有这么大

 

生成的代码有个优点是你不用去关心漏掉什么符号一类,只要在意一下这个东西的逻辑到底有没有搞清楚。


#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
volatile int times;
volatile int interval;
volatile unsigned long temp;
volatile unsigned long temp2;
volatile int run;
volatile int min2;
volatile int seconds;

void page1() {
  u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
  u8g2.setFontPosTop();
  u8g2.setCursor(3,4);
  u8g2.print("运行时间");
  u8g2.setCursor(3+5*12,4);
  u8g2.print(times);
  u8g2.setCursor(3+8*12,4);
  u8g2.print("分钟");
  u8g2.setCursor(3,20);
  u8g2.print("运行间隔");
  u8g2.setCursor(3+5*12,20);
  u8g2.print(interval);
  u8g2.setCursor(3+8*12,20);
  u8g2.print("秒");
  u8g2.setFont(u8g2_font_helvR24_tf);
  u8g2.setFontPosTop();
  u8g2.setCursor(3,20+12);
  u8g2.print(min2);
  u8g2.setCursor(3+12*3,20+12);
  u8g2.print(":");
  u8g2.setCursor(3+12*6,20+12);
  u8g2.print(seconds);
}

void stoprun() {
  //停止计时器运行
  //
  u8g2.firstPage();
  do
  {
    u8g2.drawFrame(22,18,5*16,18);
    u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
    u8g2.setFontPosTop();
    u8g2.setCursor(32,20);
    u8g2.print("停止运行");
    run = 0;
    min2 = 0;
    seconds = 0;
  }while(u8g2.nextPage());
  digitalWrite(33,HIGH);
  delay(1000);
  digitalWrite(33,LOW);
}

void beep1() {
  digitalWrite(33,HIGH);
  delay(10);
  digitalWrite(33,LOW);
}

void beep2() {
  digitalWrite(33,HIGH);
  delay(100);
  digitalWrite(33,LOW);
  delay(100);
  digitalWrite(33,HIGH);
  delay(100);
  digitalWrite(33,LOW);
}

void Active() {
  u8g2.firstPage();
  do
  {
    u8g2.drawFrame(22,16,6*16,22);
    u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
    u8g2.setFontPosTop();
    u8g2.setCursor(32,20);
    u8g2.print("执行器启动");
  }while(u8g2.nextPage());
}

void Reset() {
  u8g2.firstPage();
  do
  {
    u8g2.drawFrame(22,16,5*16,22);
    u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
    u8g2.setFontPosTop();
    u8g2.setCursor(32,20);
    u8g2.print("恢复默认");
  }while(u8g2.nextPage());
}

void Deactive() {
  u8g2.firstPage();
  do
  {
    u8g2.drawFrame(22,18,5*16,18);
    u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
    u8g2.setFontPosTop();
    u8g2.setCursor(32,20);
    u8g2.print("执行器停止");
  }while(u8g2.nextPage());
}

void setup(){
  u8g2.enableUTF8Print();

  u8g2.setI2CAddress(0x3C*2);
  u8g2.begin();
  pinMode(32, OUTPUT);
  pinMode(33, OUTPUT);
  times = 1;
  interval = 15;
  temp = 0;
  temp2 = 0;
  run = 0;
  min2 = 0;
  seconds = 0;
  pinMode(34, INPUT);
  pinMode(35, INPUT);
}

void loop(){
  u8g2.firstPage();
  do
  {
    page1();
  }while(u8g2.nextPage());
  digitalWrite(32,LOW);
  digitalWrite(33,LOW);
  // 按键判断
  if (!digitalRead(34)) {
    interval = interval + 5;
    beep1();
    temp = millis();
    do{
      if (temp + 1000 < millis()) {
        //如果已经运行那么停止
        if (run == 1) {
          stoprun();
          while(true);

        }
        u8g2.firstPage();
        do
        {
          digitalWrite(33,HIGH);
          u8g2.drawFrame(22,14,5*16,23);
          u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
          u8g2.setFontPosTop();
          u8g2.setCursor(32,20);
          u8g2.print("开始运行");
          delay(200);
          seconds = seconds - 5;
          digitalWrite(33,LOW);
          run = 1;
        }while(u8g2.nextPage());
        delay(1200);

      }
    }while((!digitalRead(34)));

  }
  if (!digitalRead(35)) {
    beep1();
    times = times + 1;
    temp = millis();
    do{
      if (temp + 1000 < millis()) {
        //复位设置
        Reset();
        beep2();
        interval = 15;
        times = 1;

      }
    }while((!digitalRead(35)));

  }
  if (run == 1) {
    if (temp2 + 1000 < millis()) {
      seconds = seconds + 1;
      temp2 = millis();

    }
    if ((long) (seconds) % (long) (interval) == 0) {
      //设置RELAY启动
      Active();
      digitalWrite(32,HIGH);
      delay(2000);
      seconds = seconds + 2;
      temp2 = millis();
      digitalWrite(32,LOW);

    }
    if (seconds > times * 60) {
      run = 0;
      stoprun();

    }

  }

  digitalWrite(33,LOW);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
### 回答1: 可以使用以下代码控制esp32通过继电器控制电控锁:int pinRelay = 2; //定义继电器控制引脚int statusLock = 0; //定义电控锁状态void setup() { pinMode(pinRelay,OUTPUT); //设置继电器控制引脚 }void loop() { if(statusLock == 0) { digitalWrite(pinRelay, HIGH); //打开继电器 statusLock = 1; } else { digitalWrite(pinRelay, LOW); //关闭继电器 statusLock = 0; } } ### 回答2: 下面是一个简单的esp32通过继电器控制电控锁的代码示例: ```cpp #include <WiFi.h> // 定义WiFi网络的信息 const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; // 继电器控制锁的引脚 const int relayPin = 13; void setup() { // 初始化串口通信 Serial.begin(115200); // 连接WiFi网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("正在连接到WiFi网络..."); } Serial.println("已成功连接到WiFi网络!"); // 设置继电器引脚为输出模式 pinMode(relayPin, OUTPUT); } void loop() { // 检测终端(手机等)是否发送了控制命令 if (Serial.available() > 0) { char command = Serial.read(); // 如果接收到的命令是 '1',则闭合继电器,控制电控锁解锁 if (command == '1') { digitalWrite(relayPin, HIGH); Serial.println("电控锁已解锁!"); } // 如果接收到的命令是 '0',则断开继电器,控制电控锁上锁 else if (command == '0') { digitalWrite(relayPin, LOW); Serial.println("电控锁已上锁!"); } } } ``` 这段代码实现了通过网络控制esp32上的继电器,从而控制电控锁的状态。当esp32成功连接到WiFi网络后,它会等待终端(手机等)发送命令。当接收到命令 '1' 时,继电器闭合,电控锁解锁;当接收到命令 '0' 时,继电器断开,电控锁上锁。 为了使用这段代码,你需要将WiFi网络的名称和密码替换为你的网络信息,并将继电器的引脚连接到esp32的引脚13。同时,在终端发送命令时,可以使用串口通信(通过USB连接到电脑)或者其他网络通信方式(例如通过WebSocket)。 ### 回答3: ESP32是一款功能强大的Wi-Fi和蓝牙双模开发板,可以通过继电器来实现对电控锁的控制。下面是一个示例代码,通过ESP32的GPIO口控制继电器开关,实现对电控锁的操作: ``` #include <Arduino.h> const int relayPin = 4; // 设置继电器控制的GPIO口编号 void setup() { pinMode(relayPin, OUTPUT); // 将继电器控制的GPIO口设置为输出模式 } void loop() { digitalWrite(relayPin, HIGH); // 控制继电器闭合,电控锁解锁(具体动作根据电控锁的接线方式而定) delay(2000); // 等待2秒,保持电控锁处于解锁状态 digitalWrite(relayPin, LOW); // 控制继电器断开,电控锁上锁(具体动作根据电控锁的接线方式而定) delay(2000); // 等待2秒,保持电控锁处于上锁状态 } ``` 在上述代码中,我们首先定义了一个常量`relayPin`来表示控制继电器的GPIO口编号,此处以GPIO 4为例。在`setup()`函数中,我们将该GPIO口设置为输出模式,以便我们能够通过控制电平来打开或关闭继电器。在`loop()`函数中,我们通过`digitalWrite()`函数将继电器控制的GPIO口电平设置为高电平或低电平,从而控制继电器的闭合和断开,从而控制电控锁的解锁和上锁动作。通过使用`delay()`函数,我们可以控制电控锁处于解锁或上锁状态的持续时间。 请注意,以上代码仅为示例代码,具体控制继电器和电控锁的方式还需根据具体的硬件接口和相关文档进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值