Nodemcu(Esp8266)の折腾日记🤪~🤪~🤪~ 2022-08-01 学习 暂无评论 ## 写在前面 🥳🥳🥳 > 上周五从淮北回来,开发板和模块都到了,浅玩了一会儿,没学过嵌入式,这些东西太陌生了😅😅😅,而且c++也太久没碰,忘记的差不多了。 Tips(开发板相关): > - 不是所有的灯都是高电平亮,低电平灭,nodemcu板载的led就是低电平亮,高电平灭 - 引脚的分类(我知道的): - gnd 就是地线 - vcc 就是正极 - clk 可以输入时钟信号 - 引脚的模式: - 输入 INPUT 引脚可以接收电平信号 - 输出 OUTPUT 引脚输出电平信号 - 上拉 INPUT_PULLUP 不知道干啥的,好像是可以控制电阻的, - 有的模块有封装好的库,可以直接使用,有些是不需要的,比如led灯,只要给i/o引脚输入高电平就可以亮了,但是数码管是需要第三方的库,使用起来才比较“优雅” Tips(编程相关): > - setup() 初始化的时候执行的代码块 - 需要用pinMod(pin,mod)定义引脚模式,不然操作不了引脚, - loop() 循环的代码块 这里面的代码会一直循环,nodemcu硬件应该是只有单线程,实现多线程的话需要用第三方的库 ticker,b站有相关的教程 Timeline: 2022-8-1:顶多能点个灯,我终于可以控制rgb的灯了,为什么花了这么长时间,有两个原因, 1. 忘记定义引脚模式为输出模式 2. nodemcu板子上的引脚和esp8266的原始引脚是不对应的,板子上的D2应该定义GPIO4,给我睁大眼睛,看仔细。😒😒😒 接下来需要安排好引脚和模块的位置,用按钮输入信号,mqtt协议,巴法云,等。 📅:20220802 > 现在只剩下无源蜂鸣器没解决了 1. 当按钮按下的时候,数码管开始倒计时,并且向topic发送一条消息on,倒计时结束后会继续显示时间, 2. 当接收到mqtt的消息的时候也会开始倒计时,效果和开关是一样的 3. 也已经通过巴法云接入到了天猫精灵,应该也是可以直接接入米家的 ⭐代码分析⭐: MQTT: ``` c++ #include #include //********************需要修改的部分*******************// //巴法云私钥 #define ID_MQTT "****" //用户私钥,控制台获取 const char *topic = "TickDown001"; //主题名字,可在巴法云控制台自行创建,名称随意 //**************************************************// const char *mqtt_server = "bemfa.com"; //默认,MQTT服务器 const int mqtt_server_port = 9501; //默认,MQTT服务器 WiFiClient espClient; PubSubClient client(espClient); client.setServer(mqtt_server, mqtt_server_port); //设置mqtt服务器 client.setCallback(callback); // mqtt消息处理 //巴法云回调函数 void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Topic:"); Serial.println(topic); String msg = ""; for (int i = 0; i < length; i++) { msg += (char)payload[i]; } Serial.print("Msg:"); Serial.println(msg); if (msg == "on" && IsStart == false) { IsStart = true; startTick(); } else if (msg == "off") { //如果接收字符off,亮灯 } msg = ""; } //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); client.publish(topic, "倒计时正在进行中!!!"); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(ID_MQTT)) { Serial.println("connected"); Serial.print("subscribe:"); Serial.println(topic); //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } //loop函数巴法云 if (!client.connected()) { reconnect(); } client.loop(); ``` 以上是更MQTT协议相关的代码,其实很容易理解的 - 先引入必要的库 - 必要的几个参数 - 用户私钥 控制台获取 - topic主题,再控制台创建,智能家居的话可以是开关、插座、空调等等 - mqtt服务器地址和端口 - 实例化client需要传一个wifi的实例,然后`setServer()`传入服务器、端口、`setCallback()`设置回调函数 - 回调函数有三个参数,第一个是主题,第二个是返回值,第三个是值的长度,需要转换成string类型 - 订阅主题 `subscribe()`,执行多行可以订阅多个主题 - 发布消息`publish()`第一个参数是主题名,第二个是发布的内容 - `client.connected()`可以返回mqtt连接状态 - `client.loop();`这个可以理解成发送心跳包和读取服务器数据,需要一直执行的 📅:20220806 > 前几天把蜂鸣器也解决了,这里踩了一个坑(其实就是自己脑子不能转弯🥴🥴🥴) >下面是一张在网上找了一张频率对应的表  > 小学二年级学过频率的定义,一秒钟内震动的次数,比如“哆”频率是262,也就是一秒钟震动262次,1000/262=3.816794 3.8167毫秒,3816微妙震动一次,但是`delay()`方法最小单位是毫秒,所以要用这个微秒来做延迟`os_delay_us()` 其实3816是它的周期,一个周期是低电平 间隔 高电平 间隔 组成的,所以这个间隔的时间需要3816/2=1908us, 这是音调,要想出音乐还得要有拍子,比如哆的四分音符,它的for循环的次数就是 1000000/4/1908\*2=262.054507次,八分音符就是1000000/8/1908\*2=131.027254次 折腾倒计时就算结束了,下一个准备弄远程空调和远程开关 以上! 标签:学习, c++, 嵌入式