409|3

33

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

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)
通过
链接已隐藏,如需查看请登录或者注册
这个项目实现了ha平台的一键部署
再向隔壁的二舅妈借用了一个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);
}

 

我通过mqttx软件来查看mqtt连接数据MQTTX 下载
通过配置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最简单的办法分享给大家,让大家少走一点我踩过的坑。谢谢这次机会,下次我还要参加

最新回复

你这来了这么多传感器啊,不过应该超限了吧   详情 回复 发表于 2024-10-8 12:17
点赞 关注
 
 

回复
举报

10

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

学习一下

 
 
 

回复

6450

帖子

9

TA的资源

版主

板凳
 

你这来了这么多传感器啊,不过应该超限了吧

点评

没啦,都是得捷买的,不同活动的都有,这不刚好一起智能化了  详情 回复 发表于 2024-10-8 19:48
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

33

帖子

4

TA的资源

一粒金砂(中级)

4
 
秦天qintian0303 发表于 2024-10-8 12:17 你这来了这么多传感器啊,不过应该超限了吧

没啦,都是得捷买的,不同活动的都有,这不刚好一起智能化了

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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