- 搭建环境并开启第一步Blink / 串口打印Hello EEWorld!链接
- 驱动12x8点阵LED!链接
- 用DAC生成正弦波!链接
- 用OPAMP放大DAC信号!链接
- 用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线!链接
- 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)链接
- 通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据!链接
入门任务
环境搭建:搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
本次活动使用Arduino进行开发,虽然也可也使用瑞萨官方的IDE,但是Arduino比较方便!
1.打开Arduino IDE官网,选择对应的系统和系统位数下载即可
2.在开发板管理器中,搜索Arduino UNO R4 Boards,并且安装一下(安装完成后就可以看到对应的例程了)
3,插上板卡,这IDE的设备选择器中就可以看到一样名字的板卡了
串口打印和闪烁LED:
因为安装了这块开发板的板子,所以可以直接使用LED_BUILTIN这个引脚来使用,只需要初始化引脚为输出,并且设置串口的波特率,就可以正常工作了,下面贴出代码和视频
void setup() {
// open the serial port:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
Serial.print("Hello Arduino! LED ON\r\n");
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
Serial.print("Hello Arduino! LED OFF\r\n");
delay(1000);
}
【Follow me第二季第2期】入门任务(必做):搭建环境并开启第一步Blink - 串口打... - DigiKey得捷技术专区 - 电子工程世界-论坛
基础任务一:驱动12x8点阵LED!
设计思路:和控制单个LED相似,是需要给LED通上正向电压,设置GPIO的输出电压为1或者0即可控制灯的亮或者灭。但是正常使用的时候用一个I/O控制一个LED还是合理的,但是如果有七七四九个LED,总不能用49个IO来分别控制LED吧,那也太奢华了。所以采用矩阵的方式来控制,可以参考板卡对应的例程:需要使用到的是"Arduino_LED_Matrix.h"和"Arduino_LED_Matrix.h"这两个库,只需要事先将要显示的内容保存到Buff里面,然后再传进去就可以显示了
下面贴出代码和视频
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
void setup() {
Serial.begin(115200);
matrix.begin();
}
char SerialRcvBuf[100];
void loop() {
if(Serial.available() > 0)
{
memset(SerialRcvBuf, 0, sizeof(SerialRcvBuf));
// 添加5个空格到缓冲区的开头
for (int i = 0; i < 6; i++)
{
SerialRcvBuf[i] = ' ';
}
byte rcvMark = 6;
while (Serial.available() > 0 && rcvMark < 100)
{
SerialRcvBuf[rcvMark] = char(Serial.read());
delay(2); // 短暂延迟以防止过快读取
rcvMark++;
}
// Serial.println(SerialRcvBuf);
}
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(80);
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(SerialRcvBuf);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
}
【Follow me第二季第2期】基础任务(必做)之 驱动12x8点阵LED - DigiKey得捷技术专区 - 电子工程世界-论坛
基础任务二:用DAC生成正弦波!
连接示意图:为了防止STM32示波器烧掉,所以将输出的波形电压进行分压
代码部分十分简单,只需要一行设置频率即可
下面贴出代码和视频
#include "analogWave.h"
analogWave wave(DAC);
int freq = 1000;
void setup() {
wave.sine(freq);
}
void loop() {
}
【Follow me第二季第2期】基础任务(必做)之 用DAC生成正弦波 - DigiKey得捷技术专区 - 电子工程世界-论坛
基础任务三:用OPAMP放大DAC信号!
连接示意图:为了防止STM32示波器烧掉,所以将输出的波形电压进行分压,并且将运放连接成同相比例运放,V0 = (1 + Rf / R3) * vi
代码部分十分简单,相比于输出DAC波形,多了一行启动运放
下面贴出代码和视频
#include "analogWave.h"
#include <OPAMP.h>
analogWave wave(DAC);
int freq = 1000;
void setup() {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
wave.sine(freq);
}
void loop() {
}
【Follow me第二季第2期】基础任务(必做)之 用OPAMP放大DAC信号 - DigiKey得捷技术专区 - 电子工程世界-论坛
基础任务四:用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线!
通过Arduino显示波形很方便,IDE不仅自带了串口调试器还支持波形显示,只需要传入数据就可以产生波形,需要注意的是最高将串口的波特率调高一点可以稍微是波形更加平滑一丢丢
下面贴出代码和视频
#include "analogWave.h"
analogWave wave(DAC);
int freq = 1;
void setup() {
Serial.begin(460800);
wave.sine(freq);
}
void loop() {
int ReadValue = analogRead(A5);
Serial.println(ReadValue);
delay(50);
}
【Follow me第二季第2期】用ADC采集打印数据到串口等其他接口可上传到上位机显示 - DigiKey得捷技术专区 - 电子工程世界-论坛
进阶任务+创意任务二:搭建HA平台,并且将传感器数据上传
这个进阶任务的难点在于HA平台搭建和设备的接入,下面将介绍如何搭建平台和接入板卡
配置树莓派HA平台
-
插入烧写好的镜像SD卡到树莓派
-
接网线到路由器
-
将电脑通过WiFi或者网线接入到上面树莓派接入的路由器
-
接HDMI到显示屏等能够显示的设备(有条件的最后接上,没有问题也不是很大)
-
上电!
若插上HDMI,稍稍稍微的登上那么一段时间,等待系统启动完成就可以看到这个界面了,若没有显示屏,不要捉急,在网站上输入
等待网页显示。若成功启动了,恭喜你完成了第一步!!!
能成功进入网站上,会显示这个界面准备,我一开始信了这个鬼(这最多可能需要20分钟),结果等了一个多小时都没有进去……
第二天起来看到已经到了Home Assistant 的欢迎界面,按照步骤一步步下去就可以了
点击FINISH之后,恭喜你现在已经启动并运行了 Home Assistant!!!
HA配置
SSH安装
-
设置
-
加载项
-
加载项商店
-
搜索ssh
-
安装后
-
成功安装的界面:
Samba 安装
-
设置
-
加载项
-
加载项商店
-
搜索Samba
-
安装
-
配置:用户名和密码
-
使用:
-
Win+R
-
输出\ip,例如
,这个ip就是上面ssh中查到的ip地址
-
就可以跟使用文件夹一样,对树莓派里面的文件进行操作了
安装MQTT
-
设置
-
加载项
-
加载项商店
-
搜索MQTT
-
设置-》设备于服务-》打开MQTT-》配置,就可以了以下界面,进行配置ip,用户名、密码等信息,记住这些信息哟
-
添加设备,使用的软件是MQTTx,发送下面数据,湿度同理
{
"name": "SHT40 Humidity",
"state_topic": "homeassistant/sensor/sht40_humidity/state",
"unit_of_measurement": "%rH",
"device_class": "temperature",
"json_attributes_topic": "homeassistant/sensor/sht40_humidity/attributes",
"unique_id": "sht40_humidity",
"device": {
"identifiers": ["sht40"],
"name": "SHT40 Sensor",
"model": "SHT40",
"manufacturer": "SHT"
}
}
-
就可以看到添加的设备了
.
下面贴出代码和视频
#include "Adafruit_SHT4x.h"
#define SDA_PIN 27
#define SCL_PIN 26
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
#include <WiFi.h>
#include <ArduinoMqttClient.h>
char ssid[] = "wifi"; // your network SSID (name)
char pass[] = "passpword"; // your network password
char mqtt_user[] = "master";
char mqtt_pass[] = "1";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "192.168.1.22"; // MQTT broker address
int port = 1883;
const char subscribe_topic[] = "/status";
const char publish_topic_sht40_temperature[] = "homeassistant/sensor/sht40_temperature/state";
const char publish_topic_sht40_humidity[] = "homeassistant/sensor/sht40_humidity/state";
sensors_event_t humidity, temp;
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
TwoWire i2cWire = TwoWire(SCL_PIN, SDA_PIN);
Serial.println("SHT40 测试");
if (! sht4.begin(&i2cWire)) {
Serial.println("无法访问SHT40");
while (1) delay(1);
}
Serial.println("开始读取SHT40序列号");
Serial.print("SHT40的序列号是:");
Serial.println(sht4.readSerial(), HEX);
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:
uint32_t timestamp = millis();
Serial.println("1");
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
Serial.println("2");
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();
}
【Follow me第二季第2期】进阶任务+扩展任务二 之 将SHT40数据通过MQTT传输到HA平台 - DigiKey得捷技术专区 - 电子工程世界-论坛
项目总结
这块开发板是我第一块Arduino开发板,与之前学习使用的都是STM32这些板子。听说了Arduino使用起来非常的方便,现在在上面进行开发亲身体会到这便捷和乐趣。通过对上面任务的完成,不断的学习了一些库以及Arduino外设的使用,虽然有时候并不知道库里的引脚是哪个引脚,现在也能方便的跳进库文件里面查看了。最后感谢得捷和电子森林能够提供这行活动的机会,让我探索Arduino的世界!
项目源码