251|5

22

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第2期】arduinoUNOR4+homeassistant任务提交 [复制链接]

  本帖最后由 白菜虫虫 于 2024-11-2 22:59 编辑
很开心又一次参加得捷和eeworld联合举办的follow me活动。
这次活动使用的板卡是Arduino UNO R4 WiFi。其实对于arduino还是有一些小情结的,因为当时虽然第一款学的MCU是51,但真正入门并领略了微电子的乐趣,还是arduino UNO R3,所以这次能参加follow me的活动还是很nice的。
5600fdd50fa65f566a2f2d92ab9db4de

 
任务实现简介:
这次完成的任务主要有以下这些,具体实现方式相见后面。
入门任务(必做):搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
基础任务(必做):驱动12x8点阵LED;
                                用DAC生成正弦波;
                                用OPAMP放大DAC信号;
                                用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
进阶任务(必做):通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
扩展任务(必做,自选任务):
                                1.通过外部AHT20温湿度传感器,上传温湿度到HA,通过HA面板显示数据
                                2.连接XiaoC3到HA,并用板载LED模拟灯泡。用HA面板控制LED亮灭模拟控制家庭照明灯的亮灭。

 

物料清单:
 
本次使用的物料主要由:
1、arduino UNO R4 wifi 开发板
2、AHT20温湿度传感器
3、Seeed XIAO C3开发板
 
 
任务实现详情:

 

入门任务(必做):搭建环境并开启第一步Blink / 串口打印Hello EEWorld!

 

搭配器件: Arduino UNO R4 WiFi
设计思路:初始化数字引脚,重复点亮LED和熄灭LED并添加适当延时;初始化串口,输出文字“Hello EEWorld!”。
软件流程图
 
 
 每次做入门任务,其实最重要的还是环境的搭建。既然板卡是Arduino UNO R4 WiFi,那么使用的编程软件自然首选arduinoIDE。
1.下载安装软件
 首先,打开arduino官网的软件下载页面
根据自己的操作系统,选择合适的软件版本下载。
然后按照默认设置一路next安装完毕。
 
在右侧的侧边栏点第二个图标,出现开发板管理器栏,输入Arduino UNO R4并
回车搜索,选择arduino官方的arduino UNO R4 Boards板卡进行安装。
3.点亮板卡
3.1依次点击文件→示例→内置示例 01.basics→blink。
3.2依次点击→工具→开发板→arduino UNO R4 boards→arduino UNO R4 wifi
3.3然后点击(→)编译上传。
等待软件编译上传完成,开发板上的小灯开始闪烁,blink程序烧录完成。
4.串口打印Hello EEWorld!
将刚才的程序进行修改
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  Serial.print("Hello EEWorld!");
}
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

 

点击工具→串口监视器。
再次点击(→)编译上传,串口监视器输出Hello EEWorld!
 
 
 
 
 
基础任务(必做):1、驱动12x8点阵LED;2、用DAC生成正弦波;3、用OPAMP放大DAC信号;4、用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
搭配器件: Arduino UNO R4 WiFi
设计思路:1、点阵LED的驱动很简单,找到相应的库简单修改就行,以二维数组,一维数组,字符串数组三选一的方式将需要显示的内容表示出来,然后通过驱动库进行显示。因为步骤太简单了,就不画流程图了。
2-4生成波形及采集的部分,主要就是通过DAC生成一个波形,将波形通过分压电阻输入给运算放大器的正负反馈输入端,然后进行放大并输出给ADC进行采样,并将采集到的数据通过串口输出,通过ARDUINO IDE自带的串口绘图仪进行观察。
软件流程图
 
 
 1.驱动12x8点阵LED;
Arduino UNO R4 WiFi开发板自带了一个12X8的led矩阵,还是挺好玩的。
这个LED矩阵的驱动也是比较简单的,使用Arduino_LED_Matrix库就可以轻松驱动。(具体可以参考示例当中LED_Martrix相关例程。)
而操作起来一般也就三种方式,
①8x12数组,具体参见 Matrix Frame Buffer例程
②三组8位16进制数,具体参见Displays single frames例程
③字符串显示,具体参见ArduinoGraphics例程
我这次选择体验的是第三种方式,只需要修改例程中的text[]数组,编译上传即可。
2.用DAC生成正弦波;
开始研究了半天没找到资料,后来还是在arduinoIED的示例立马找到了。
//FollowMe第二季第2期-白菜虫虫-任务2.1(驱动12x8点阵LED)
#include "analogWave.h"
analogWave wave(DAC);
int freq = 10;
void setup() {
  wave.sine(freq);
}
void loop() {
}

 

A0引脚是波形输出,把示波器接好A0和GND。
3.用OPAMP放大DAC信号;
OPAMP运算放大器的例程同样可以在arduino里面找到。
//FollowMe第二季第2期-白菜虫虫-任务2.3(用DAC生成正弦波)
#include "analogWave.h"
#include <OPAMP.h>
analogWave wave(DAC);  
int freq = 10;  
void setup () {
  Serial.begin(9600);
  delay(2000);
  wave.sine(freq);
  if (!OPAMP.begin(OPAMP_SPEED_HIGHSPEED)) {
    Serial.println("Failed to start OPAMP!");
  }
  bool const isRunning = OPAMP.isRunning(0);
  if (isRunning) {
    Serial.println("OPAMP running on channel 0!");
  } else {
    Serial.println("OPAMP channel 0 is not running!");
  }
}
void loop() {
  delay(2000);
}

 

编译上传,把A0的输入接到A1,然后用示波器接OPAMP运算放大器的输出A3。
这个波形有点失真,想了想应该是偷懒没接负反馈的问题。
把A3的输出接到A2的负反馈输入。
波形恢复正常。
这里由于是又偷懒没给负反馈做分压,所以A3的输出波形虽然正常了,但是放大倍数有点忒小了,需要增大放大倍数的同学可以给负反馈做一个分压,用分压后A3输出波形给A2做输入。
负反馈增加分压电阻:
后续找到了几颗直插电阻,现在添加上使用分压电阻的做法。
首先是直接给A3的输出增加分压电阻,取大约1/2的电压输入到A2。通过示波器和ADC查看均存在削峰的情况,波谷倒是显示正常。、
猜测是超过了ARUDINO的上限,于是考虑给输入也增加分压。
A0的输出通过2/3的分压输入给A1,依旧削峰。再次改变电路,把A0的1/3分压给A1作为输入,波形全部正常显示。
电路图如下:

分压后的输入波形:

接负反馈后的输出波形:

 

4.用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
这一步就比较简单了。
在上一个任务的基础上简单修改就可以了。
//FollowMe第二季第2期-白菜虫虫-任务2.4(用DAC生成正弦波)
#include "analogWave.h"
#include <OPAMP.h>
analogWave wave(DAC);  
int freq = 10;  
int sensorPin = A5;
void setup () {
  Serial.begin(9600);
  delay(2000);
  wave.sine(freq);
  if (!OPAMP.begin(OPAMP_SPEED_HIGHSPEED)) {
    Serial.println("Failed to start OPAMP!");
  }
  bool const isRunning = OPAMP.isRunning(0);
  if (isRunning) {
    Serial.println("OPAMP running on channel 0!");
  } else {
    Serial.println("OPAMP channel 0 is not running!");
  }
}
void loop() {
  Serial.println(analogRead(sensorPin));
}

 

编译上传,然后点击arduinoIED菜单栏 工具→串口绘图仪就能看到波形。
再给大家看看不加负反馈时候的波形。
因为放大之后的波形超过了ADC采样的范围,所以波峰波谷都被削平了。想用ADC看波形的兄弟们也可以给ADC输入加上分压电路。
 
这里也补充增加了输入和负反馈分压后的ADC采样波形:
输入波形

负反馈分压输出波形

 

 
 
进阶任务(必做):通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
搭配器件: Arduino UNO R4 WiFi
设计思路:这一步主要是HA平台的搭建,平台搭建好了之后使用UNO R4通过MQTT发送一个注册传感器的消息,HA平台接收到后就会显示一个温湿度传感器的标签。
软件流程图
 
 
 1.搭建HomeAssistant。
homeassistant的安装坑很多,建议按照官网的说明进行。我个人是选择的VMware虚拟机的方式进行安装的。
参照官网说明,按照自己设备或操作系统选择合适的方式进行安装。
安装完毕在浏览器输入IP地址:8123打开homeassistant,比如我的就是http://192.168.11.135:8123/
第一次启动经过漫长的等待,进行科学上网可以有效缩短等待时间。
更新完毕会进入注册和设置页面,需要设置登录使用的账号密码和一些其他东西,按照提示进行设置就可以。
2.安装mqtt 服务器
点击设置,点右下角加载项商店,搜索emqx并安装。
打开emqx,添加自己的一个自己的mqtt账号。
3.配置
在设置→设备与服务→集成中搜索添加并配置mqtt项目。
配置mqtt集成的时候,建议单独注册一个HA用户分配给mqtt使用,不要使用默认管理账户。
homeassistant端配置完毕之后,来看UNO R4端,UNO R4主要是配置并连接到mqtt服务器。
先搜索安装ArduinoMqttClient库,然后根据示例修改为我们的程序:
//FollowMe第二季第2期-白菜虫虫-进阶任务
#include <ArduinoJson.h>
#include <ArduinoMqttClient.h>
#include <WiFiS3.h>
char ssid[] = "BAICAICHONGCHONG";
char pass[] = "PASSWORD";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "192.168.66.121";
int        port     = 1883;
const char register_topic[]  = "homeassistant/sensor/sensorBedroomT/config";
const char refresh_topic[]  = "homeassistant/followme/state";
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
String register_doc1="{\"device_class\":\"temperature\",\"name\":\"Temperature\",\"state_topic\":\"homeassistant/followme/state\",\"unit_of_measurement\":\"C\",\"value_template\":\"{{value_json.temp}}\",\"unique_id\":\"temp01ae\",""\"device\":{\"identifiers\":[\"bedroom01ae\"],\"name\":\"FollowMe\"}}";
String register_doc2="{\"device_class\":\"temperature\",\"name\":\"Temperature\",\"state_topic\":\"homeassistant/followme/state\",\"unit_of_measurement\":\"C\",\"value_template\":\"{{value_json.temp}}\",\"unique_id\":\"temp01ae\",""\"device\":{\"identifiers\":[\"bedroom01ae\"],\"name\":\"FollowMe\"}}";  // attempt to connect to WiFi network:
  Serial.print("Attempting to connect to WPA SSID: ");
  Serial.println(ssid);
  while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
    // failed, retry
    Serial.print(".");
    delay(5000);
  }
  Serial.println("You're connected to the network");
  Serial.println();
  // You can provide a unique client ID, if not set the library uses Arduino-millis()
  // Each client must have a unique client ID
 mqttClient.setId("clientId");
  // You can provide a username and password for authentication
 mqttClient.setUsernamePassword("unor4", "test123");
  Serial.print("Attempting to connect to the MQTT broker: ");
  Serial.println(broker);
  if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());
    while (1);
  }
  Serial.println("You're connected to the MQTT broker!");
  Serial.println();
  mqttClient.poll();
  Serial.print("register sensor");
  Serial.println();
  mqttClient.beginMessage(register_topic);
  mqttClient.print(register_doc1);
  mqttClient.print(register_doc2);
  mqttClient.endMessage();
}
void loop() {
  String refresh_doc= "{\"temp\": 23.20, \"hum\": 43.70}";
  mqttClient.poll();
    Serial.print("refresh data");
    mqttClient.beginMessage(refresh_topic);
    mqttClient.print(refresh_doc);
    mqttClient.endMessage();
    Serial.println();
    delay(1000);
}

 

编译并上传后,刷新HA界面,可以看到新的传感器。
 
 
 
 
扩展任务(必做,自选任务
1.通过外部AHT20温湿度传感器,上传温湿度到HA,通过HA面板显示数据
搭配器件: Arduino UNO R4 WiFi、AHT20温湿度传感器
设计思路:UNO R4通过IIC采集AHT20等传感器的温湿度数据,并以MQTT的方式上传到HA。
软件流程图
 
 
首先要将AHT20温湿度传感器接在UNO R4上,如果传感器有Qwiic接口,可以使用PRT-14426(Qwiic缆线-50mm)把传感器连接到UNO R4上,或者也可以使用杜邦线进行连接,注意按照VCC→3.3V,GND→GND,SCL→A5,SDA→A4的顺序进行连接。
然后搜索并安装驱动库,我使用的是DFRobot_AHT20库
接下来将我们进阶任务的程序进行修改:
//FollowMe第二季第2期-白菜虫虫-扩展任务1
#include <ArduinoJson.h>
#include <ArduinoMqttClient.h>
#include <WiFiS3.h>
#include "DFRobot_AHT20.h"
DFRobot_AHT20 aht20;
char ssid[] = "sishuiyouyu";    // your network SSID (name)
char pass[] = "Jj19860123";    // your network password (use for WPA, or use as key for WEP)
// char ssid[] = "FAST_7664";    // your network SSID (name)
// char pass[] = "12345678";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "192.168.66.121";
// const char broker[] = "192.168.11.140";
int        port     = 1883;
const char register_topicT[]  = "homeassistant/sensor/sensorBedroomT/config";
const char register_topicH[]  = "homeassistant/sensor/sensorBedroomH/config";
const char refresh_topic[]  = "homeassistant/followme/state";
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
String register_docT="{\"device_class\":\"temperature\",\"name\":\"Temperature\",\"state_topic\":\"homeassistant/followme/state\",\"unit_of_measurement\":\"C\",\"value_template\":\"{{value_json.temp}}\",\"unique_id\":\"temp01ae\",\"device\":{\"identifiers\":[\"bedroom01ae\"],\"name\":\"FollowMe\"}}";
String register_docH="{\"device_class\":\"humidity\",\"name\":\"Humidity\",\"state_topic\":\"homeassistant/followme/state\",\"unit_of_measurement\":\"%\",\"value_template\":\"{{value_json.hum}}\",\"unique_id\":\"hum01ae\",\"device\":{\"identifiers\":[\"bedroom01ae\"],\"name\":\"FollowMe\"}}";
  uint8_t status;
  while((status = aht20.begin()) != 0){
    Serial.print("AHT20 sensor initialization failed. error status : ");
    Serial.println(status);
    delay(1000);
  }
  // attempt to connect to WiFi network:
  Serial.print("Attempting to connect to WPA SSID: ");
  Serial.println(ssid);
  while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
    // failed, retry
    Serial.print(".");
    delay(5000);
  }
  Serial.println("You're connected to the network");
  Serial.println();
  // You can provide a unique client ID, if not set the library uses Arduino-millis()
  // Each client must have a unique client ID
 mqttClient.setId("clientId");
  // You can provide a username and password for authentication
 mqttClient.setUsernamePassword("unor4", "test123");
  Serial.print("Attempting to connect to the MQTT broker: ");
  Serial.println(broker);
  if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());
    while (1);
  }
  Serial.println("You're connected to the MQTT broker!");
  Serial.println();
  mqttClient.poll();
  Serial.print("register sensor");
  Serial.println();
  mqttClient.beginMessage(register_topicT);
  mqttClient.print(register_docT);
  mqttClient.endMessage();
  mqttClient.poll();
  mqttClient.beginMessage(register_topicH);
  mqttClient.print(register_docH);
  mqttClient.endMessage();
}
void loop() {
  if(aht20.startMeasurementReady(/* crcEn = */true)){
    Serial.print("temperature(-40~85 C): ");
    Serial.print(aht20.getTemperature_C());
    Serial.print(" C, ");
    Serial.print("humidity(0~100): ");
    Serial.print(aht20.getHumidity_RH());
    // String refresh_doc= +gcvt()++gcvt()+;
    mqttClient.poll();
    Serial.print("refresh data");
    mqttClient.beginMessage(refresh_topic);
    mqttClient.print("{\"temp\": ");
    mqttClient.print(aht20.getTemperature_C());
    mqttClient.print(", \"hum\": ");
    mqttClient.print(aht20.getHumidity_RH());
    mqttClient.print("}");
    mqttClient.endMessage();
    Serial.println();
    delay(1000);
  }
  else{
    mqttClient.poll();
    Serial.print("wait aht20");
    delay(1000);
  }
}

 

编译并上传到开发板。
刷新HA页面就能看到不断变化的温度湿度值了。
 
 
2.连接XiaoC3到HA,并用板载LED模拟灯泡。用HA面板控制LED亮灭模拟控制家庭照明灯的亮灭。
搭配器件:Seeed XIAO C3开发板
设计思路:使用ESPHome配合HA来控制XIAO C3为代表的智能终端设备
​​​​​​​软件流程图
 
 
下面我来演示一种更简单的把设备加入HA的方式,这种方式适用于ESP32和ESP8266的驱动板,这里我选择的是XiaoC3。
在HA设置→加载项中搜索并安装ESPHome然后启动它。
添加一个新的设备,选择ESP32-C3,添加完毕后点edit编辑yaml文件,修改SSID和密码,在文件最后添加代码
light:
  - platform: binary
    name: "FollowMeLED"
    output: bin_led

output:
  - id: bin_led
    platform: gpio
    pin: GPIO2 
    inverted: true

要注意缩进,yaml和python类似,是以缩进代表归属的语言。

烧录代码到XiaoC3,刷新HA就可以看到我们的LED。
点击LED标签上的按钮,就可以控制LED的亮灭。
 
 
 
【Follow me第二季第2期】arduinoUNOR4+homeassistant代码汇总.rar (3.28 MB, 下载次数: 2)
活动心得体会:这是活动总体来说收获巨大,以这次活动为契机督促自己详细的研究了homeassistant智能家居的实现方式。期间遇坑无数,爬坑也不少,尤其是HA的搭建,说多了都是泪啊。
重要完成了,也大体学会了,HA还是很好玩的,尤其在生活中也能用得上,监测一下屋里的温湿度和空气质量情况呀,控制一下灯光亮灭啦,控制一些职能家电等等,还能自定义定时或者定条件的自动事项,灰常的方便。
最后,再次感谢主办方得捷和电子工程世界。

最新回复

感谢大佬无私分享!   详情 回复 发表于 2024-9-26 11:15
点赞 关注
 
 

回复
举报

222

帖子

3

TA的资源

一粒金砂(高级)

沙发
 

运放要加反馈电阻不加波形失真严重,起不到运放的作用

点评

是滴,手上没有直插的电阻,所以偷懒这么搞了  详情 回复 发表于 2024-9-25 09:24
 
 
 

回复

22

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
Maker_kun 发表于 2024-9-25 08:46 运放要加反馈电阻不加波形失真严重,起不到运放的作用

是滴,手上没有直插的电阻,所以偷懒这么搞了

 
 
 

回复

22

帖子

3

TA的资源

一粒金砂(中级)

4
 

修改补充了DAC增加负反馈分压电阻的部分,请各位大佬指正

 
 
 

回复

118

帖子

1

TA的资源

一粒金砂(高级)

5
 

感谢大佬无私分享!

点评

大佬不敢当,小小学徒一枚  详情 回复 发表于 2024-9-26 14:12
 
 
 

回复

22

帖子

3

TA的资源

一粒金砂(中级)

6
 
慕容雪花 发表于 2024-9-26 11:15 感谢大佬无私分享!

大佬不敢当,小小学徒一枚

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表