消息接收器

最近这段时间忙着做一个硬件通知接收器,又重新点燃了我的电子制作的兴趣,买了很多的电子原件,包括第一次尝试使用嘉立创的打版工作,制作了几块电路板,我本身没有手机不离手的习惯,所以有很多消息通知我都不能及时接收到,以至于错过了很多重要的通知,比如服务器受到攻击,Mysql下线,redis爆内存…之前使用server酱,里面有一个开源的PushDeer的lot硬件项目,挺适合长时间在电脑旁的我,怎奈人家淘宝店铺下架了产品,于是就开始想手动攒一个起来,但是我没有采用他的方案,因为手里有一块esp32的板子,使用Arduino就直接做了个原型。

#include <Arduino.h>
#include <PubSubClient.h>
#include "config.h"
#include "function.h"
#include <SPI.h>
#include <FS.h>
#include <SPIFFS.h>
#include <TFT_eSPI.h>
#include <ezTime.h>

// 获取时间
Timezone myTZ;

TFT_eSPI tft = TFT_eSPI(); // 创建TFT对象

void setup()
{
    Serial.begin(115200); // 初始化串口

    // 指示灯引脚
    pinMode(led, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(boot, INPUT_PULLUP);
    pinMode(BL, OUTPUT);
    digitalWrite(buzzer, HIGH);

    // 初始化显示屏
    lcdShow();

    // 连接wifi
    tft.println("连接wifi...");
    connectWifi();

    // 连接mqtt代理
    tft.println("连接MQTT代理...");
    firstConnectMqtt();

    // 初始化时间
    tft.println("初始化时间...");
    myTZ.setLocation(F("Asia/Shanghai")); // 设置时区
    ezt::setServer("ntp1.aliyun.com");    // 设置NTP服务器
    waitForSync();                        // 等待时间同步
    tft.println("初始化完成...");

    // 清除屏幕
    tft.setCursor(0, 0);
    tft.fillScreen(TFT_BLACK);
    tft.println("等待接收消息...");
    isShowWaitReceive = true;
    showWaitReceiveTime = millis();
    // 峰鸣器通知成功
    buzzerStart(1);
    startTime = millis(); // 记录启动时间
}

void bootPush(){
    if (digitalRead(boot) == LOW)
    {
        Serial.println("BOOT 被按下!");
        tft.setCursor(0, 0);
        // 清除屏幕
        tft.fillScreen(TFT_BLACK);
        isShowWaitReceive = false;
        if (screenStatus == true)
        {
            screenStatus = false;
            digitalWrite(BL, LOW);
        }
        else
        {
            screenStatus = true;
            digitalWrite(BL, HIGH);
            tft.println("等待接收消息...");
            isShowWaitReceive = true;
            showWaitReceiveTime = millis();
        }
    }
    delay(260); // 简单的去抖动延时
}

void loop()
{
    // 如果wifi连接断开,重新连接wifi
    if (WiFi.status() != WL_CONNECTED)
    {
        Serial.println("Wifi连接断开, 尝试重新连接...");
        connectWifi();
    }

    // 如果mqtt连接断开,重新连接mqtt
    if (!client.connected())
    {
        Serial.println("MQTT broker连接失败, 尝试重新连接...");
        reconnect();
    }

    client.loop();

    // 检测是否按下 - 按钮按下时通常连接到地,所以是低电平
    bootPush();

    // 如果屏幕开启,根据背光时间关闭屏幕
    if (isShowWaitReceive == true && millis() - showWaitReceiveTime > screenWaitTime)
    {
        digitalWrite(BL, LOW);
        screenStatus = false;
        isShowWaitReceive = false;
    }
}

感觉还不错,在任何地方,只要请求我的一个通用通知接口,手机和设备就能同时收到消息,能很好的达到我的要求,已经能实现基本的要求了,如果再要精细一点,就再打一块小板,将模块组合起来,再用3D打印机打一个壳子,加块电池就能使用了。

虽然是个很小的尝试,但是却激起了我很大的激情,几年前就答应丸子要给他做一个遥控汽车,由于一直没有太长的时间去学着做,所以跳票了好几年,为此还闹过几次,今年寒假,一定要完成这个项目,为此准备了很多元件,然后就是自己的一些知识储备,现在自媒体时代,我也想学着通过视频记录这些,感觉有太多东西要学。

由于我目前其实是自由职业状态,好早之前我其实就想通过这些小电子制作,能跳出我现有的圈子,能拓展出我的第二块业务,因为这是我喜欢热爱的,我相信自己肯定可以做好。

一条评论

  1. 很有意思,想起以前实习的时候我们一个领导让我跟着学硬件我还不乐意,想在想来错失了一个机会。

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注