309|0

19

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第2期】任务汇总 [复制链接]

  本帖最后由 JectXie 于 2024-11-1 13:20 编辑

下载附件  保存到相册

2024-9-29 19:29 上传

主控:这次用到的是Arduino UNo R4 WIFI这款板子,高级货,联网模组是ESP32-S3 MINI,我后面才知道正常板子是邮票孔,这个MINI的pin在这块PCB的底部,芯片强悍,但是也确实不好拆,得用加热台才拆得下来。我觉得他选用Mini应该也有防止普通开发者会把他拆下来。毕竟这个ESP32-S3 确实强很多。
传感器:LTR-329是一个光感模块,可以把光的流明以数字形式展示。
传感器:SHT40 这是一个温湿度传感器,是SHT30的升级款。具体参数还需要未来有项目使用到的时候再来对比。
 
3、完成任务历程
3.1 搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
3.1.1 下载Arduino IDE,
3.1.2 安装开发板、
3.1.3 将开发板插入电脑USB接口、查看电脑识别出来的串口号是多少、
3.1.4 在IDE中设置好串口、完成烧录(后续任务会重复很多遍烧录过程,后面不再介绍烧录流程)
流程图
3.2 驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
3.2.1 学习UNO4 WIFI开发板对于11个IO控制96个灯的设计思路、
3.2.2 学习DAC、ADC相关基础知识
3.2.3 学习OPAMP相关原理知识
3.2.4 学习使用IDE 串口展示曲线功能
1、驱动12x8点阵LED流程图           2、用DAC生成正弦波流程图      3、用OPAMP放大DAC信号流程图
     
 
4、用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线流程图
 
3.3 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
3.3.1 连接WIFI
3.3.2 安装MQTT服务
3.3.3 安装HA
3.3.4 学习设备接入HA的MQTT配置指令
 
3.4 通过外部LTR-329 环境光传感器,上传光照度到HA,通过HA面板显示数据
3.4.1 使用官方库读取流明数值
3.4.2 串口打印数值
3.4.3 数据接入HA,发布流明数据,HA面板显示
 
3.5 通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
3.5.1 使用官方库读取温湿度
3.5.2 串口打印数值
3.5.3 数据接入HA,分别发布温度和湿度数据,HA面板显示
 
4、完整任务的视频介绍

5、任务过程发帖记录

5.1 开发环境搭建 https://bbs.eeworld.com.cn/thread-1291460-1-1.html

5.2 驱动 12*8 点阵屏 https://bbs.eeworld.com.cn/thread-1292150-1-1.html

5.3 用DAC生成正弦波 https://bbs.eeworld.com.cn/thread-1292151-1-1.html

5.4 用OPAMP放大DAC信号 https://bbs.eeworld.com.cn/thread-1292152-1-1.html

5.5 ADC采集并将数据打印到上位机 https://bbs.eeworld.com.cn/thread-1291640-1-1.html

5.6 开发板使用MQTT接入HA https://bbs.eeworld.com.cn/thread-1292197-1-1.html

5.7 读取LTR-329传感器数据接入HA,并在HA面板展示数据 https://bbs.eeworld.com.cn/thread-1292368-1-1.html

5.8 读取SHT40传感器数据接入HA,并在HA面板展示数据 https://bbs.eeworld.com.cn/thread-1292361-1-1.html

 

6、各任务详细说明

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

6.1.1 任务简介 

这一部分主要学习了如何搭建Arduino 开发环境,如何串口打印响应数据,这是学习任何Arduio 开发板的第一步。

 

6.1.2代码片段

  • void setup() {
  • Serial.begin(115200);
  • // 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
  • Serial.println("Hello EEWorld!");
  • }

6.1.3 效果图

 

6.1.4 帖子链接 

https://bbs.eeworld.com.cn/thread-1291460-1-1.html

 

6.2 基础任务(必做):驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线

6.2.1 任务简介 

说是一个任务,实际里面是4个任务,任务2和3对新手不友好。但是可以学到新知识,很好。相信出题的老师很用心的出的这四题。

6.2.2 代码片段

驱动12x8点阵LED代码

  • #include "ArduinoGraphics.h"
  • #include "Arduino_LED_Matrix.h"
  • ArduinoLEDMatrix matrix;
  • int scrollSpeed = 200;
  • void setup() {
  • Serial.begin(115200);
  • matrix.begin();
  • matrix.beginDraw();
  • matrix.stroke(0xFFFFFFFF);
  • matrix.textFont(Font_4x6);
  • matrix.beginText(0, 1, 0xFFFFFF);
  • scrollText("WAIT RECEIVE DATA . . .");
  • Serial.println("WAIT RECEIVE DATA . . .");
  • matrix.endText();
  • matrix.endDraw();
  • }
  • void loop() {
  • if (Serial.available() > 0) {
  • String inputData = Serial.readString();
  • Serial.println(inputData);
  • matrix.clear();
  • scrollText(inputData);
  • delay(100);
  • }
  • }
  • void scrollText(const String& text) {
  • int textWidth = text.length() * 6;
  • int matrixWidth = matrix.width();
  • for (int x = matrixWidth; x >= -textWidth; x--) {
  • matrix.beginDraw();
  • matrix.stroke(0xFFFFFFFF);
  • matrix.textFont(Font_5x7);
  • matrix.beginText(x, 1, 0xFFFFFF);
  • matrix.println(text);
  • matrix.endText();
  • matrix.endDraw();
  • delay(scrollSpeed);
  • }
  • }

用DAC生成正弦波代码

  • #include <Arduino.h>
  • #include <math.h>
  • #define DAC_PIN A0// ESP32 DAC pin (GPIO 25)
  • void setup() {
  • pinMode(DAC_PIN, OUTPUT);
  • }
  • void loop() {
  • for(int i = 0; i < 360; i++){
  • float rad = i * PI / 180.0;
  • int outputValue = 127 + 127 * sin(rad);// 生成正弦波信号
  • analogWrite(DAC_PIN, outputValue);// 输出到 DAC
  • delay(10);// 控制波形频率
  • }
  • }

用OPAMP放大DAC信号代码

用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线代码

  • // 定义模拟输入引脚
  • const int analogPin = A0; // 可以选择A0到A5的任意引脚
  • void setup() {
  • // 初始化串口通信
  • Serial.begin(9600);
  • }
  • void loop() {
  • // 读取模拟输入引脚的值
  • int sensorValue = analogRead(analogPin);
  • // 将读取的值发送到串口监视器
  • //Serial.print("Analog reading: ");
  • Serial.println(sensorValue);
  • // 延迟一段时间,以便读取数据的间隔更明显
  • delay(100); // 延迟0.1秒
  • }

 

6.2.3 效果图
2、SDS814X_HD_PNG_2.png
3、
4、
6.2.4 帖子链接
 

6.3 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)

6.3.1 任务简介 

这个任务主要学习了如果使用HA,HA设备如何接入,因为实验中使用了群晖NAS的Docker,存在一定的缺陷,所以导致只有一种设备接入配置的方式(发送配置的MQTT指令),实际上还可以修改配置文件来达到添加设备的目的。

6.3.2 代码片段

  • #include <WiFi.h>
  • char ssid[] = "CMCC-NxAn"; // your network SSID (name)
  • char pass[] = "mhcsm2m4"; // your network password
  • void setup() {
  • Serial.begin(9600);
  • while (!Serial) {
  • ;
  • }
  • // Connect to WiFi
  • 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("\nYou're connected to the network");
  • Serial.print("IP Address: ");
  • Serial.println(WiFi.localIP());
  • Serial.print("Gateway IP: ");
  • Serial.println(WiFi.gatewayIP());
  • Serial.print("Subnet Mask: ");
  • Serial.println(WiFi.subnetMask());
  • Serial.println();
  • }
  • void loop() {
  • Serial.print("IP Address: ");
  • Serial.println(WiFi.localIP());
  • delay(1000);
  • }

 

6.3.3 效果图
6.3.4 帖子链接

6.4 通过外部LTR-329 环境光传感器,上传光照度到HA,通过HA面板显示数据

6.4.1 任务简介 

首先给Arduino 连接wifi、读取光照数据,显示光照数据。这个任务难度就比较友好,不过可以学习的地方有很多,可以深入了解MQTT协议。

6.4.2 代码片段

  • #include "Adafruit_LTR329_LTR303.h"
  • Adafruit_LTR329 ltr = Adafruit_LTR329();
  • #include <WiFi.h>
  • #include <ArduinoMqttClient.h>
  • char ssid[] = "CMCC-NxAn"; // your network SSID (name)
  • char pass[] = "mhcsm2m4"; // your network password
  • char mqtt_user[] = "ject";
  • char mqtt_pass[] = "ject6666";
  • WiFiClient wifiClient;
  • MqttClient mqttClient(wifiClient);
  • const char broker[] = "192.168.124.4"; // MQTT broker address
  • int port = 1883;
  • const char subscribe_topic[] = "/hello";
  • const char publish_topic_ltr329_visible_light[] = "homeassistant/sensor/ltr329_visible_light/state";
  • const char publish_topic_ltr329_ir_light[] = "homeassistant/sensor/ltr329_ir_light/state";
  • void setup() {
  • Serial.begin(115200);
  • Serial.println("Adafruit LTR-329 light sensor test");
  • //连接WIFI
  • // Connect to WiFi
  • 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("\nYou're connected to the network");
  • Serial.print("IP Address: ");
  • Serial.println(WiFi.localIP());
  • Serial.print("Gateway IP: ");
  • Serial.println(WiFi.gatewayIP());
  • Serial.print("Subnet Mask: ");
  • Serial.println(WiFi.subnetMask());
  • Serial.print("MAC Address: ");
  • //Serial.println(WiFi.macAddress());
  • Serial.println();
  • //连接MQTT
  • // Set MQTT username and password
  • mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
  • Serial.print("Attempting to connect to the MQTT 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.print("Subscribing to topic: ");
  • Serial.println(subscribe_topic);
  • // Subscribe to a topic
  • mqttClient.subscribe(subscribe_topic);
  • Serial.print("Waiting for messages on topic: ");
  • Serial.println(subscribe_topic);
  • if (!ltr.begin()) {
  • Serial.println("Couldn't find LTR sensor!");
  • while (1) delay(10);
  • }
  • Serial.println("Found LTR sensor!");
  • // 设置默认增益、积分时间和测量速率
  • ltr.setGain(LTR3XX_GAIN_2); // 默认增益
  • ltr.setIntegrationTime(LTR3XX_INTEGTIME_100); // 默认积分时间
  • ltr.setMeasurementRate(LTR3XX_MEASRATE_200); // 默认测量速率
  • }
  • void loop() {
  • if (ltr.newDataAvailable()) {
  • uint16_t visible_plus_ir, infrared;
  • bool valid = ltr.readBothChannels(visible_plus_ir, infrared);
  • if (valid) {
  • Serial.print("CH0 Visible + IR: ");
  • Serial.print(visible_plus_ir);
  • Serial.print("\t\tCH1 Infrared: ");
  • Serial.println(infrared);
  • publishMessage_ltr329_visible_light(String(visible_plus_ir));
  • publishMessage_ltr329_ir_light(String(infrared));
  • }
  • }
  • delay(1000); // 延时以避免数据更新过于频繁
  • }
  • // Function to publish a message to the MQTT broker
  • //发布所有可见光信息
  • void publishMessage_ltr329_visible_light(const String &message) {
  • mqttClient.beginMessage(publish_topic_ltr329_visible_light);
  • mqttClient.print(message);
  • mqttClient.endMessage();
  • }
  • // Function to publish a message to the MQTT broker
  • //发布红外光信息
  • void publishMessage_ltr329_ir_light(const String &message) {
  • mqttClient.beginMessage(publish_topic_ltr329_ir_light);
  • mqttClient.print(message);
  • mqttClient.endMessage();
  • }

 

6.4.3 效果图
6.4.4 帖子链接

6.5 通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据

6.5.1 任务简介 

这个任务的流程与上一个一模一样,差别在于不同的外设,任务难度比较友好,SHT40是SHT30的升级款,Ada封装的库,更方便开发者应用与集成功能。

6.5.2 代码片段

  • #include "Adafruit_SHT4x.h"
  • Adafruit_SHT4x sht4 = Adafruit_SHT4x();
  • #include <WiFi.h>
  • #include <ArduinoMqttClient.h>
  • char ssid[] = "CMCC-NxAn"; // your network SSID (name)
  • char pass[] = "mhcsm2m4"; // your network password
  • char mqtt_user[] = "ject";
  • char mqtt_pass[] = "ject6666";
  • WiFiClient wifiClient;
  • MqttClient mqttClient(wifiClient);
  • const char broker[] = "192.168.124.4"; // MQTT broker address
  • int port = 1883;
  • const char subscribe_topic[] = "/hello";
  • const char publish_topic_sht40_temperature[] = "homeassistant/sensor/sht40_temperature/state";
  • const char publish_topic_sht40_humidity[] = "homeassistant/sensor/sht40_humidity/state";
  • void setup() {
  • //打开串口
  • Serial.begin(115200);
  • while (!Serial)
  • delay(10); // will pause Zero, Leonardo, etc until serial console opens
  • //连接WIFI
  • // Connect to WiFi
  • 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("\nYou're connected to the network");
  • Serial.print("IP Address: ");
  • Serial.println(WiFi.localIP());
  • Serial.print("Gateway IP: ");
  • Serial.println(WiFi.gatewayIP());
  • Serial.print("Subnet Mask: ");
  • Serial.println(WiFi.subnetMask());
  • Serial.print("MAC Address: ");
  • //Serial.println(WiFi.macAddress());
  • Serial.println();
  • //连接MQTT
  • // Set MQTT username and password
  • mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
  • Serial.print("Attempting to connect to the MQTT 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.print("Subscribing to topic: ");
  • Serial.println(subscribe_topic);
  • // Subscribe to a topic
  • mqttClient.subscribe(subscribe_topic);
  • Serial.print("Waiting for messages on topic: ");
  • Serial.println(subscribe_topic);
  • //连接SHT40
  • Serial.println("SHT40 测试");
  • if (! sht4.begin()) {
  • Serial.println("无法访问SHT40");
  • while (1) delay(1);
  • }
  • Serial.println("开始读取SHT40序列号");
  • Serial.print("SHT40的序列号是:");
  • Serial.println(sht4.readSerial(), HEX);
  • sensors_event_t humidity, temp;
  • uint32_t timestamp = millis();
  • sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  • timestamp = millis() - timestamp;
  • Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
  • Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
  • Serial.print("Read duration (ms): ");
  • Serial.println(timestamp);
  • delay(1000);
  • }
  • void loop() {
  • // put your main code here, to run repeatedly:
  • sensors_event_t humidity, temp;
  • uint32_t timestamp = millis();
  • sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  • timestamp = millis() - timestamp;
  • Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
  • Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
  • Serial.print("Read duration (ms): ");
  • Serial.println(timestamp);
  • delay(1000);
  • publishMessage_sht40_temperature(String(temp.temperature));
  • publishMessage_sht40_humidity(String(humidity.relative_humidity));
  • }
  • // Function to publish a message to the MQTT broker
  • //发布温度信息
  • void publishMessage_sht40_temperature(const String &message) {
  • mqttClient.beginMessage(publish_topic_sht40_temperature);
  • mqttClient.print(message);
  • mqttClient.endMessage();
  • }
  • // Function to publish a message to the MQTT broker
  • //发布湿度信息
  • void publishMessage_sht40_humidity(const String &message) {
  • mqttClient.beginMessage(publish_topic_sht40_humidity);
  • mqttClient.print(message);
  • mqttClient.endMessage();
  • }

 

6.5.3 效果图
6.5.4 帖子链接
 

7、代码合计

整个任务所有代码合计

8、本次活动心得体会(写在最后)

通过这次Followme的活动,很开心可以顺利的完成,这次活动对于我个人自身,自己的代码水平也在一定程度上有提升,从以前每次点完编译不知道对错,到这一次很轻松的完成这些代码。对Arduino也有更深入的理解,对Adafruit系列的传感器也理解的更多。对HA也有更深入的理解与学习,这与在申请这个项目时写的目的已基本达到。

这次使用到了示波器,学会了如何使用,对今后的开发应该会更进一步。

对于本次的活动建议,我觉得官方虽然已经做了很大的努力为申请的用户提供完成任务的便利,但是如果可以在一个特定区域指出出题的目的,可能可以让学习者更好的理解出题人的用意。这应该属于良性发展的一条途径,中间例如ADC、DAC这种专业词汇以及用法,对于非科班出身真的很陌生,也有一丝丝的迷茫。虽然最后都完成了。但是学习过程中也确实有些坎坷。
 

点赞 关注
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
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
快速回复 返回顶部 返回列表