Follow me第二季第2期+多功能HA传感器系统
[复制链接]
本帖最后由 老杰瑞 于 2024-10-8 19:49 编辑
集成多功能Home Assistant (HA) 传感器系统
本系统集成了以下高性能传感器,实现了对环境参数的全面监测,并将数据实时上传至Home Assistant平台:
ArduinoU4wifi:通过wifi连接ha平台,上传传感器数据
SHT40温湿度传感器:精确测量环境温度和湿度,确保舒适的生活和工作条件。
SGP30空气质量传感器:实时监测室内空气质量,包括总挥发性有机化合物(TVOC)和等效二氧化碳(eCO2)的浓度,助力健康生活。
LTR-329环境光传感器:精确检测环境光线强度,包括可见光和红外光,以优化照明控制。
通过将这些传感器集成至一串电路板,本系统不仅简化了安装过程,还提高了数据收集的效率。所有监测数据均可通过HA面板直观展示,便于用户实时监控和远程控制家庭环境。
介绍视频:
流程图
设计思路就是u4读取传感器数据,通过wifi发送给mqtt服务器,ha在配置好mqtt服务器的条件下进行话题监听,更新传感器数据
扩展任务功能演示:
进阶任务(必做):通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
再向隔壁的二舅妈借用了一个mqtt服务器,在ha种添加对应MQTT服务器
到HA的 [开发者工具 – Home Assistant](http://localhost:8123/developer-tools/yaml) 的 -> YAML 配置重新加载 -> 点击 所有YAML 配置 -> 如果代码无异常,则会显示绿色 代表配置已经更新
mqtt:
- sensor:
- unique_id: arduino uno Voltage
name: "arduino Volt"
state_topic: "UNO/arduino/myAnalogInput/stat_t"
suggested_display_precision: 3
添加完这个实体以后就需要上传数据了,使用下面的代码来实现数据上传
#include <ArduinoMqttClient.h>
#include <WiFiS3.h>
#include <WiFiClient.h>
#include "Arduino_LED_Matrix.h" /*包含官方的驱动库*/
#include "analogWave.h" // 包含波形输出的模拟文件
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "quest2"; //WIFI名字
char pass[] = "meiyijia"; //WIFI密码
int status = WL_IDLE_STATUS;
//实例化
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
analogWave wave(DAC); //实例化一个对象
const char broker[] = "210.38.161.158"; //MQTT服务器地址
int port = 1883; //MQTT服务器端口
const char topic1[] = "UNO/arduino/SHT40-Temp/stat_t"; //发布的主题
const char topic2[] = "UNO/arduino/SHT40-humidity/stat_t"; //发布的主题
const char topic3[] = "UNO/arduino/SGP30-brightness/stat_t"; //发布的主题
const char topic4[] = "UNO/arduino/myAnalogInput/stat_t"; //发布的主题
const char mqttuser[] = "admin"; //MQTT服务器的用户名
const char mqttpassword[] = "jyu123456"; //MQTT服务器密码
//set interval for sending messages (milliseconds)
const long interval = 8000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
//A0 DAC 输出一个波形
wave.sine(50); //产生一个50HZ的sin波形
wave.amplitude(0.25); //设置幅度值为4.7 的1/4
// 设置ADC的分辨率
analogReadResolution(14); //change to 14-bit resolution
// 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();
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
mqttClient.setUsernamePassword(mqttuser, mqttpassword);
while (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
delay(1000);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alive which
// avoids being disconnected by the broker
mqttClient.poll();
//通过ADC采集 A0上输出的sin波形
float Rvalue = analogRead(A3) * 4.7/16383; //读取A0引脚的值 A3和 A0连接 14bit ADC采样
mqttClient.beginMessage(topic4);
mqttClient.print(Rvalue); //把读取的值进行上传到MQTT服务器
Serial.println(Rvalue);
mqttClient.endMessage();
delay(10);
}
通过配置mqtt服务器,订阅我的话题“UNO/arduino/myAnalogInput/stat_t”
就可读取到U4的数据
再到ha面板来看数据,成功显示数据
基础任务(必做):驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
点阵部分参考官方例程 Using the Arduino UNO R4 WiFi LED Matrix | Arduino Documentation
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
void setup() {
Serial.begin(115200);
matrix.begin();
}
const uint32_t happy[] = {
0x19819,
0x80000001,
0x81f8000
};
const uint32_t heart[] = {
0x3184a444,
0x44042081,
0x100a0040
};
void loop(){
matrix.loadFrame(happy);
delay(500);
matrix.loadFrame(heart);
delay(500);
}
撸了个笑脸和爱心的图形
下面来写
用DAC生成正弦波;
还是先来到官方wiki看看官方的写法
官方给的应用实例是用电位器来改变驱动蜂鸣器频率
把蜂鸣器电位器注释掉就能输出dac了
#include "analogWave.h" // 包含用于模拟波形生成的库
analogWave wave(DAC); // 创建analogWave类的一个实例,使用DAC引脚
int freq = 10; // 频率,以赫兹为单位,根据需要更改
void setup() {
Serial.begin(115200); // 初始化串行通信,波特率为115200
wave.sine(freq); // 使用初始频率生成正弦波
}
void loop() {
// 从A5引脚读取模拟值,并将其映射到频率范围内
freq = map(analogRead(A5), 0, 1024, 0, 10000);
// 将更新的频率打印到串行监视器
//Serial.println("当前频率为 " + String(freq) + " 赫兹");
//wave.freq(freq); // 将波形发生器的频率设置为更新的值
delay(1000); // 在重复之前延迟一秒钟
}
下一步是用OPAMP放大DAC信号;
用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
老规矩,来看看官方wiki
运算放大器的放大率主要取决于所选的电阻值=1+(R2/R1)
R1 = 接地电阻 (Ω)顾名思义,连接运放反馈口与地的
R2 = 反馈电阻 (Ω)连接输出与反馈口的
具体原理看这一篇原理解释,讲的非常好(不过需要小小翻一下)
由图可得,A1为输入脚,A2为反馈脚,A3为输出脚,为了实现用OPAMP放大DAC信号的需求,我们需要把A1与A0(DAC输出脚短接)
R2与R1都选择10k,得到1+(10k/10K)=2倍的放大倍率
代码部分只需在之前的代码中加下面的
#include <OPAMP.h>
void setup () {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
实际情况:
不知道为什么不是很对头,但也有2倍放大了
下一个任务:用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
把A4连A0测dac输出
把A5连A3测OPAMP放大输出
#include "analogWave.h" // 包含用于模拟波形生成的库
#include <OPAMP.h>
analogWave wave(DAC); // 创建analogWave类的一个实例,使用DAC引脚
int freq = 5; // 频率,以赫兹为单位,根据需要更改
void setup() {
Serial.begin(115200); // 初始化串行通信,波特率为115200
wave.sine(freq); // 使用初始频率生成正弦波
wave.amplitude(0.4); //设置正弦曲线幅值为0.4,默认的太大了,超过adc采样电压了
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {
printf("%d\n",analogRead(A4)); // 读取DAC输出正弦值
Serial.print(" ");
printf("%d\n",analogRead(A5)); // 读取OPAMP输出正弦值
delay(100); // 在重复之前延迟一秒钟
}
结果如下
原因是我delay的太久了,改为delay1
哈哈哈又快过头了,改为10
结果欧克了
最后是入门任务(必做):搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
轻轻松松秒杀
拿到板子后先谷歌一下arduino-UNO R4 WiFi
打开官方教程就可以开始配置环境了,点击图中的arduino软件页面。
下载安装完成后就可以开始配置一下arduino的设置,我推荐暗黑和中文配置,顺眼很多
下一步就是安装板基支持包
在右边的开发板管理器搜索UNO R4即可安装。
安装完成后插上UNO R4 WiFi板子,在开发板中选择UNO R4 WiFi
上面我们的开发环境就配置好了,硬件软件都ok,下面开始实现任务
我最喜欢的就是arduino的示例了,在里面有很多示例代码可以帮我我们快速开发自己需要的功能,再也不要天天为基础代码跑不通调试半天了~
在内置示例中找到blink,编译下载即可实现点灯功能,代码为下
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// 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
}
代码其实就是让led口亮,如何停顿一下,在暗,再停顿一下,如此循环实现
给第一次使用arduino的小伙伴解释一下setup和loop在arduino中,必须有这两个函数,setup为开机运行一次,loop函数在setup运行完后就会不断循环运行,所以在上面的代码中,要先在setup中吧led口的pin配置好为输出模式,LED_BUILTIN在一些头文件中会对应板子上的ledpin脚位,这也是arduino的优势之一,代码可以在多个板子上不动运行
下面我们来实现串口打印功能
照例打开内置示例的AnalogReadSerial,程序功能是将ADC并且将值不断传输给串口
我们对代码进行修改实现我们需要的功能
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// print out the value you read:
Serial.println("Hello EEWorld!");
delay(1); // delay in between reads for stability
}
简单编辑一下即可
打开右上角arduino自带的串口工具即可查看打印的Hello EEWorld!内容!
好了到此为止我们就实现了入门任务
下面是这次项目用到的全部代码
本活动的心得体会:在这次的任务过程中,十分感谢EEWORLD大学堂的直播帮助,让我学习了很多mqtt的相关知识也学会了ha平台的搭建及使用,这对我这个网络软件小白来说很难,但是我真的学到了很多,了解了很多不懂的东西,这就是follow me的意义把!不懂的时候可以去论文看看别人怎么实现的,看看老师直播怎么做的,也能在五花八门的办法中找到最适合自己,最轻松的答案,特别是写文章总结的时候,很难写出我为了解决一些问题付出的时间与精力,只想把1最简单的办法分享给大家,让大家少走一点我踩过的坑。谢谢这次机会,下次我还要参加
|