- 2024-12-04
-
回复了主题帖:
今天下午两点直播STM32全球线上峰会,STM32N6重磅发布,快来直播间【抽开发板】啦!
已报名
- 2024-12-03
-
回复了主题帖:
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
报名成功
- 2024-10-30
-
回复了主题帖:
ST NUCLEO-WB09KE无法烧录问题
这个问题有解决吗?
- 2024-10-29
-
发表了主题帖:
【2024 DigiKey 创意大赛】+基于Teensy4.1环境温湿度和气压监测
本帖最后由 流水源 于 2024-10-29 23:48 编辑
一 作品简介
本次作品主要主要实现环境的温湿度以及大气压的监测显示。主控MCU使用的是Teensy4.1开发板,环境参数检测使用的是BME680传感器。BME680传感器集成了测量气体,温湿度,大气压等参数。外加电子罗盘传感器ICM20948,ICM20948可以检测3轴加速度,3轴角速度和3轴磁感应,用于设备姿态检测。设备上外加了3.5寸显示屏用于显示数据。做这个设备可以很方便观察当前环境状态,可以用于户外探险环境温湿度及大气压,海拔高度监测及电子罗盘功能,也可以用于家庭室内环境监测。
特意为本次项目做了一个Teensy4.1的扩展底板,底板上安装了BME680和ICM20948传感器,以及LCD显示屏。整体如下:
二 系统框图
整个系统框图如下所示。整体设计比较简单,主要实现数据读取和显示。BME680和ICM20948这两个传感器都是用I2C接口驱动,但是设备地址不一样,所以两个传感器接在同一个I2C接口,而LCD屏使用SPI接口驱动。
三、软件功能说明
本次软件开发使用的是ArduinoIDE开发环境开发的,之前用过几次Arduino开发,觉得这个很方便,基本上驱动都写好了,只用写应用。而且Teensy4.1推荐的开发环境也是用Arduino。
用arduino开发我们首先要安装Teensy4.1开发板。
开发板安装网址: https://www.pjrc.com/teensy/package_teensy_index.json
安装之后就可以开发选择Teensy4.1开发板的例子了。
接着我们还要下载BME680和ICM20948的驱动库了。
BME680传感器我选择的是Adafruit BME680的库。
ICM20948可以用下面2个库。我使用的是第2个库。
LCD驱动库选择如下DFRobot GDL。这个LCD是DFRobot的一个显示屏模块。
开发过程中参考了例子代码,然后将例子代码整合。
下面是设备初始化过程:
然后是传感器数据监测显示界面:
显示界面可以根据陀螺仪的姿态自动切换横竖屏显示。
通过串口打印数据如下:
四、作品源码
五、作品功能演示视频
[localvideo]d6b20522b222f9493ce8015108d0a829[/localvideo]
六、项目总结
通过本次大赛有一些收获,也发现了自己的一些不足。利用本次大赛我更加熟悉使用ArduinoIDE的开发环境使用,也学习了对BME680和ICM20948传感器的驱动使用.,特别是关于ICM20948这个9轴陀螺仪的姿态的计算方式。本次大赛时间有限,项目做的有点简陋,后面有机会继续完善一下,继续加点新功能。
- 2024-10-27
-
加入了学习《 【2024 DigiKey创意大赛】 《智能起居室环境控制台》任务报告汇总》,观看 【2024 DigiKey创意大赛】 《智能起居室环境控制台》任务报告汇总
- 2024-10-09
-
发表了主题帖:
【2024 DigiKey 创意大赛】使用Teensy4.1读取传感器测试
本次特意做了一个Teensy4.1的扩展底板,加上了传感器座子和LCD屏接口。实现了BME680和ICM20948传感器的数据读取和显示。
扩展版如下:
底板扩展了LCD屏接口,网口,USB HOST,arduino接口,can,rs485,rs232。
开发使用的是arduino ide。直接下载teensy4.1开发板资料库和传感器BME680,ICM20948驱动。
https://www.pjrc.com/teensy/package_teensy_index.json Teensy4.1开发板添加网址。
lcd显示数据效果。
- 2024-08-31
-
回复了主题帖:
>>征集 | 使用 MCU,哪些问题最令你头大?
MCU选型主要问题:
首先是外设资源要方便查看对比,需要的外设资源是否足够。
再就是开发工具是否容易上手,开发库SDK和demo例子是否容易应用。
最后就是开发遇到问题,能有技术支持。
- 2024-08-27
-
发表了主题帖:
【Follow me第二季第1期】+任务提交汇总
本帖最后由 流水源 于 2024-10-9 20:56 编辑
主要任务提交汇总:
入门开发环境使用的是arduino ide开发的。搭建环境很简单,就不多说了。具体搭建如下帖子。
【Follow me第二季第1期】arduino开发环境的搭建和点灯 https://bbs.eeworld.com.cn/thread-1289879-1-1.html
下面是基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换。主要使用了Adafruit Circuit Playground Express开发板,通过USB供电。
在如下帖子,实现彩灯跑马变幻颜色。
【Follow me第二季第1期】arduino控制板载炫彩跑马灯 https://bbs.eeworld.com.cn/thread-1289916-1-1.html
上面就是红绿蓝3种不同颜色的灯循环跑马效果了。
代码:
/////////////////////////////////////////////////////////////////////////////////////////
//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111
#if TASK_NUM == 1
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
//基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
// 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_PIN, OUTPUT);
Serial.begin(115200);
cplay.begin();
cplay.setBrightness(50);
}
// the loop function runs over and over again forever
void loop() {
Serial.println(cplay.lightSensor());
Serial.println(cplay.temperature());
digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level)
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 25*i+25, 0, 0); // 设置LED为red色
delay(100);
}
cplay.clearPixels();
delay(100); // wait for a second
digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 0, 0, 25*i+25); // 设置LED为blue色
delay(100);
}
cplay.clearPixels();
delay(100); // wait for a second
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 0, 25*i+25, 0); // 设置LED为green色
delay(100);
}
cplay.clearPixels();
delay(100); // wait for a second
}
#endif
接着基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度。主要使用了Adafruit Circuit Playground Express开发板,通过USB供电。
具体查看如下帖子:
【Follow me第二季第1期】监测环境温度和光线,通过板载LED展示舒适程度 https://bbs.eeworld.com.cn/thread-1290437-1-1.html
主要是取温度和光照一个舒适的数据范围,在范围内,所有10个彩灯为绿色呼吸。
前5颗彩灯标识温度舒适范围,在舒适范围内5个灯绿色呼吸,高于舒适温度范围用红色灯标识,灯的数量越多表示温度越高。低于舒适温度范围用蓝色灯标识,灯的数量越多表示温度越低。
后5颗彩灯标识光照舒适范围,在舒适范围内5个灯绿色呼吸,高于舒适光照范围用红色灯标识,灯的数量越多表示光照越强。低于舒适光照范围用蓝色灯标识,灯的数量越多表示光照越弱。
下面全绿灯表示温度和光照都在设置的舒适数据范围。
下面是光照超出舒适范围,太亮了。有一边显示红灯。
下面是温度不在舒适范围,太冷了。使用蓝色灯标识。
代码如下:
#if TASK_NUM == 2
//2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
//基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
uint32_t lightbress;
uint8_t l_dir;
int light_val;
int temp_val;
int g_state;
// 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_PIN, OUTPUT);
Serial.begin(115200);
cplay.begin();
cplay.setBrightness(50);
lightbress = 0;
l_dir = 0;
g_state = 0;
}
// the loop function runs over and over again forever
void loop()
{
light_val = cplay.lightSensor();
temp_val = cplay.temperature() * 100;
Serial.println(light_val);
Serial.println(temp_val);
switch(g_state)
{
case 0:
for (int i = 0; i < 10; i++)
{
cplay.strip.setPixelColor(i, 0, lightbress * 10, 0); // 设置LED为green色
}
cplay.strip.show();
if(l_dir == 0)
{
lightbress++;
if(lightbress == 15) l_dir = 1;
}else
{
if(lightbress) lightbress--;
else l_dir = 0;
}
if((light_val > 510) || (light_val < 190) || (temp_val > 3250)||(temp_val < 2950))
{
lightbress = 0;
g_state = 1;
}
break;
case 1:
//温度
int level;
uint8_t r_color,g_color,b_color;
if(temp_val > 3200)
{
level = (temp_val - 3200)/100;
r_color = lightbress * 10;
b_color = 0;
g_color = 0;
}else if(temp_val < 3000)
{
level = (3000 - temp_val)/100;
b_color = lightbress * 10;
r_color = 0;
g_color = 0;
}else
{
g_color = lightbress * 10;
r_color = 0;
b_color = 0;
}
if(level >= 5) level = 5;
for (int i = 0; i < 5; i++)
{
if(i<level) cplay.strip.setPixelColor(i, r_color, g_color, b_color); // 设置LED为blue red色
else cplay.strip.setPixelColor(i, 0, g_color, 0); // 设置LED为blue red色
}
//光照
if(light_val > 500)
{
level = (light_val - 500)/80;
r_color = lightbress * 10;
b_color = 0;
g_color = 0;
}else if(light_val < 200)
{
level = (200 - light_val)/30;
b_color = lightbress * 10;
r_color = 0;
g_color = 0;
}else
{
g_color = lightbress * 10;
r_color = 0;
b_color = 0;
}
if(level >= 5) level = 5;
for (int i = 5; i < 10; i++)
{
if(i>=(10-level)) cplay.strip.setPixelColor(i, r_color, g_color, b_color); // 设置LED为blue red色
else cplay.strip.setPixelColor(i, 0, g_color, 0); // 设置LED为blue red色
}
cplay.strip.show();
lightbress++;
if(lightbress == 15) lightbress = 0;
if((light_val <= 500) && (light_val >= 200) && (temp_val <= 3250) && (temp_val >= 2950))
{
lightbress = 0;
g_state = 0;
}
break;
}
delay(100);
}
#endif
接着是基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警。
使用的是光照传感器来检测距离远近的。用手从远往近挡住光线传感器可以看到亮灯数变化。
具体帖子如下:
【Follow me第二季第1期】接近检测设定安全距离并通过板载LED展示 https://bbs.eeworld.com.cn/thread-1290460-1-1.html
使用光照来检测距离,环境光有很大影响。后面我尝试使用了红外发射和接收管来做了一下。但是使用红外时检测距离不是很大。
代码如下:
#if TASK_NUM == 3
//333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
//基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
int light_val;
int level;
// 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_PIN, OUTPUT);
Serial.begin(115200);
cplay.begin();
cplay.setBrightness(50);
pinMode(CPLAY_IR_EMITTER, OUTPUT);
digitalWrite(CPLAY_IR_EMITTER, LOW); // When not sending PWM, we want it low
pinMode(A10, INPUT);
}
void loop()
{
uint8_t r_color,g_color,b_color;
// light_val = cplay.lightSensor();
// Serial.println(light_val);
// if(light_val < 350)
// {
// level = (350-light_val)/30;
// if (CircuitPlayground.slideSwitch()) {
// CircuitPlayground.speaker.enable(true);
// Serial.println("Slide to the left");
// }
// }else
// {
// level = 0;
// CircuitPlayground.speaker.enable(false);
// }
// if(level > 7)
// {
// r_color = 0x50;
// g_color = 0;
// b_color = 0;
// CircuitPlayground.playTone(500 + level * 500, 100);
// }else if(level >4)
// {
// r_color = 0;
// g_color = 0x50;
// b_color = 0;
// CircuitPlayground.playTone(500 + level * 500, 100);
// }else
// {
// r_color = 0;
// g_color = 0;
// b_color = 0x50;
// CircuitPlayground.playTone(500 + level * 500, 100);
// }
// for (int i = 0; i < 10; i++)
// {
// if(i<level) cplay.strip.setPixelColor(i, r_color, g_color, b_color); //
// else cplay.strip.setPixelColor(i, 0, 0, 0); //
// }
// cplay.strip.show();
// Measure the proximity level and use it to light up its LEDs.
digitalWrite(CPLAY_IR_EMITTER, HIGH);
delay(10);
digitalWrite(CPLAY_IR_EMITTER, LOW);
int prox = analogRead(A10);
if(prox > 650) level = 11;
else if(prox < 300) level = 0;
else level = (prox - 300)/34;
Serial.print("IR_Vol:");Serial.println(prox);
Serial.print("Level: ");Serial.println(level);
for (int i = 0; i < 10; i++) {
if(i<level) cplay.strip.setPixelColor(i, 250, 0, 0); //
else cplay.strip.setPixelColor(i, 0, 0, 0); //
}
CircuitPlayground.strip.show();
if (level > 4) {
CircuitPlayground.playTone(330, 100);
}
delay(100);
}
#endif
再接着是进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果。
这个是通过读取加速度传感器来实现不同姿态显示灯光。通过Z轴加速度来确定倾斜的角度大小,角度越小就显示红色灯,角度越大实现蓝色灯垂下的效果。
通过X,Y轴加速度的数值来确定方位,通过正负值分为4个象限来显示周围的灯。
下面是倾斜不同角度的灯光效果。
当水平放置时,所有灯为红色,并且有个绿灯跑马灯效果。
代码:
#if TASK_NUM == 4
//444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
//进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
#include <Adafruit_CircuitPlayground.h>
#define LED_PIN 13
int x,y,z;
uint8_t r,g,b;
uint8_t led_color[16][4];
uint8_t led_num,led_index;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Circuit Playground test!");
CircuitPlayground.begin();
CircuitPlayground.strip.setBrightness(255);
led_num = 6;
led_index = 0;
}
void loop()
{
x = CircuitPlayground.motionX() * 100;
y = CircuitPlayground.motionY() * 100;
z = CircuitPlayground.motionZ() * 100;
if((z > 900) || (z < -900)) led_num = 6;
else if((z > 830) || (z < -830)) led_num = 5;
else if((z > 750) || (z < -750)) led_num = 4;
else if((z > 600) || (z < -600)) led_num = 3;
else if((z > 300) || (z < -300)) led_num = 2;
else led_num = 1;
if(led_num < 6)
{
if((x>0) && (y>0)) //1
{
int ttan = 100*y / x;
if(ttan < 26) led_index = 9;
else if(ttan < 100) led_index = 10;
else if(ttan < 373) led_index = 11;
else led_index = 0;
}else if((x<0) && (y>0)) //2
{
int ttan = 0 - (100*y / x);
if(ttan < 26) led_index = 3;
else if(ttan < 100) led_index = 2;
else if(ttan < 373) led_index = 1;
else led_index = 0;
}else if((x<0) && (y<0)) //3
{
int ttan = (100*y / x);
if(ttan < 26) led_index = 3;
else if(ttan < 100) led_index = 4;
else if(ttan < 373) led_index = 5;
else led_index = 6;
}else if((x>0) && (y<0)) //4
{
int ttan = 0 - (100*y / x);
if(ttan < 26) led_index = 9;
else if(ttan < 100) led_index = 8;
else if(ttan < 373) led_index = 7;
else led_index = 6;
}
}else
{
led_index ++;
led_index %= 12;
}
for (int i = 1; i <= 6; i++)
{
if(i<=led_num)
{
led_color[(led_index + i) % 12 ][0] = 0x80;
led_color[(led_index + i) % 12 ][1] = 0;
led_color[(led_index + i) % 12 ][2] = 0;
led_color[(12 + led_index - i) % 12 ][0] = 0x80;
led_color[(12 + led_index - i) % 12 ][1] = 0;
led_color[(12 + led_index - i) % 12 ][2] = 0;
}else
{
led_color[(led_index + i) % 12 ][0] = 0;
led_color[(led_index + i) % 12 ][1] = 0;
led_color[(led_index + i) % 12 ][2] = 0x30;
led_color[(12 + led_index - i) % 12 ][0] = 0;
led_color[(12 + led_index - i) % 12 ][1] = 0;
led_color[(12 + led_index - i) % 12 ][2] = 0x30;
}
}
led_color[(led_index )][0] = 0;
led_color[(led_index )][1] = 0xF0;
led_color[(led_index )][2] = 0;
for (int i = 1; i < 12; i++)
{
if(i<6)
{
CircuitPlayground.strip.setPixelColor(i-1,led_color[i][0], led_color[i][1], led_color[i][2]); //
}
else if(i>6)
{
CircuitPlayground.strip.setPixelColor(i-2,led_color[i][0], led_color[i][1], led_color[i][2]); //
}
}
CircuitPlayground.strip.show();
/************* TEST ACCEL */
// Display the results (acceleration is measured in m/s*s)
Serial.print("X: "); Serial.print(x);
Serial.print(" \tY: "); Serial.print(y);
Serial.print(" \tZ: "); Serial.print(z);
Serial.println(" m/s^2");
delay(50);
digitalWrite(LED_PIN, HIGH);
delay(50);
digitalWrite(LED_PIN, LOW);
}
#endif
最后是创意任务:钢琴弹奏,通过触摸引脚弹奏音乐,并配合灯光效果。
板上有7个触摸端口,正好可以对应do、re、mi、fa、sol、la、si 7个音节。这里还实现了通过左右按键来改变低,中,高音。
主要代码如下:
#if TASK_NUM == 5
//5555555555555555555555555555555555555555555555555555555555555555555555555555555
//创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果
#include <Adafruit_CircuitPlayground.h>
#define LED_PIN 13
#define TONE_DURATION_MS 80 // Duration in milliseconds to play a tone when touched.
uint16_t CAP_THRESHOLD = 200; // Threshold for a capacitive touch (higher = less sensitive).
uint8_t playSound;
uint16_t cap_val;
uint8_t music_lmh = 1; //0-低音,1-中音,2-高音
uint16_t music_hz_tbl[3][8]= //音频对照表
{
{262, 294, 330, 349, 392, 440, 494, 0},
{523, 587, 659, 698, 784, 880, 988, 0},
{1046, 1175, 1318, 1397, 1568, 1760, 1976, 0},
};
void setup()
{
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
Serial.println("Circuit Playground test!");
CircuitPlayground.begin();
CAP_THRESHOLD = 600;
}
void loop()
{
if (CircuitPlayground.slideSwitch())
{
if(playSound) Serial.println("Slide to the left");
playSound = 0;
} else
{
if(!playSound) Serial.println("Slide to the right");
playSound = 1;
}
/************* TEST BOTH BUTTONS */
if (CircuitPlayground.leftButton()) {
Serial.println("Left level ++");
music_lmh++;
if(music_lmh>2) music_lmh=2;
while(CircuitPlayground.leftButton()) delay(10);
}
if (CircuitPlayground.rightButton()) {
Serial.println("Right level --");
if(music_lmh) music_lmh--;
while(CircuitPlayground.rightButton()) delay(10);
}
//清除灯
for (int i=0; i<10; ++i)
{
CircuitPlayground.strip.setPixelColor(i, 0);
}
CircuitPlayground.strip.show();
//11111111111111111111111111111111
cap_val = CircuitPlayground.readCap(3);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("#1:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(0));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][0], TONE_DURATION_MS); // 262hz = C4
}
}
//2222222222222222222222222222222
cap_val = CircuitPlayground.readCap(2);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t#2:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][1], TONE_DURATION_MS); // 294hz = D4
}
}
//333333333333333333333333333333333
cap_val = CircuitPlayground.readCap(0);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t\t#3:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10*3));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][2], TONE_DURATION_MS); // 330hz = E4
}
}
//4444444444444444444444444444444444
cap_val = CircuitPlayground.readCap(1);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t\t\t#4:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10*4));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][3], TONE_DURATION_MS); // 349hz = F4
}
}
//555555555555555555555555555555555
cap_val = CircuitPlayground.readCap(6);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t\t\t\t#5:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10*5));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][4], TONE_DURATION_MS); // 392hz = G4
}
}
//66666666666666666666666666666666666
cap_val = CircuitPlayground.readCap(9);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t\t\t\t\t#6:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10*6));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][5], TONE_DURATION_MS); // 440hz = A4
delay(5);
}
}
//7777777777777777777777777777777777777
cap_val = CircuitPlayground.readCap(10);
if (cap_val >= CAP_THRESHOLD) {
Serial.print("\t\t\t\t\t\t#7:"); Serial.println(cap_val);
if (playSound) {
for (int i=0; i<10; ++i) CircuitPlayground.strip.setPixelColor(i, CircuitPlayground.colorWheel(256/10*8));
CircuitPlayground.strip.show();
CircuitPlayground.playTone(music_hz_tbl[music_lmh][6], TONE_DURATION_MS); // 494hz = B4
}
}
delay(30);
}
#endif
代码文件:
最后总结:
第一次参加这个活动,比较顺利完成了上述任务。这次参加活动主要使用了arduino ide来开发,也是初次使用这个arduino。以前也听说了很多arduino的优势,但是没怎么用过。当初参加活动也是为了学习一下arduino的开发方式。所以开始的时候花了不少时间熟悉这个arduino开发环境,总的来说用过之后感觉用这个arduino开发太方便了,外设所有驱动都写好了,直接写应用就可以了。再就是这个Adafruit Circuit Playground Express开发板上面板载外设多,功能强大,不需要外接设备就可以做很多创意了,这也是吸引我的地方。
下面就是整个任务的视频效果。
视频:
[localvideo]49fb950afe097f7e6b1cd3624da1432c[/localvideo]
- 2024-08-25
-
加入了学习《【Follow me第二季第1期】汇总任务报告》,观看 【Follow me第二季第1期】汇总任务报告
- 2024-08-14
-
回复了主题帖:
【Follow me第二季第1期】接近检测设定安全距离并通过板载LED展示
秦天qintian0303 发表于 2024-8-13 21:03
有一个人用这种方法后就大家都用这种方法了,只能说也算是一种方法,不过明显是希望用红外反射的方法进行 ...
就是红外应该只是个开关信号,就做不了渐变
-
回复了主题帖:
【Follow me第二季第1期】接近检测设定安全距离并通过板载LED展示
wangerxian 发表于 2024-8-13 19:13
光线传感器测量接近距离?那环境光影响不是很大咯?
环境光如果在变化肯定是有影响的。利用红外的进行接近检测还没研究出来,晚点尝试一下红外的
-
回复了主题帖:
【2024 DigiKey 创意大赛】开箱贴
wangerxian 发表于 2024-8-13 19:20
哪个板子上有这么多传感器?没看到呀。
那2个小板子上都是传感器
- 2024-08-13
-
发表了主题帖:
【Follow me第二季第1期】接近检测设定安全距离并通过板载LED展示
下面实现基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警。
原理是利用光线传感器来确定距离远近。当光线变弱时说明接近中,当光线数据增大说明远离中。
本次实现当接近光线变弱,数据变小时,点亮彩灯,越近亮的彩灯数越多。而且接近过程中,根据距离远近,灯光由蓝色变绿色然后变红色。
使用arduino开发,代码如下:
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
int light_val;
// 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_PIN, OUTPUT);
Serial.begin(115200);
cplay.begin();
cplay.setBrightness(50);
}
void loop()
{
int level;
uint8_t r_color,g_color,b_color;
light_val = cplay.lightSensor();
Serial.println(light_val);
if(light_val < 350)
{
level = (350-light_val)/30;
if (CircuitPlayground.slideSwitch()) {
CircuitPlayground.speaker.enable(true);
Serial.println("Slide to the left");
}
}else
{
level = 0;
CircuitPlayground.speaker.enable(false);
}
if(level > 7)
{
r_color = 0x50;
g_color = 0;
b_color = 0;
CircuitPlayground.playTone(500 + level * 500, 100);
}else if(level >4)
{
r_color = 0;
g_color = 0x50;
b_color = 0;
CircuitPlayground.playTone(500 + level * 500, 100);
}else
{
r_color = 0;
g_color = 0;
b_color = 0x50;
CircuitPlayground.playTone(500 + level * 500, 100);
}
for (int i = 0; i < 10; i++)
{
if(i<level) cplay.strip.setPixelColor(i, r_color, g_color, b_color); //
else cplay.strip.setPixelColor(i, 0, 0, 0); //
}
cplay.strip.show();
if (CircuitPlayground.leftButton()) {
Serial.println("Left button pressed!");
}
if (CircuitPlayground.rightButton()) {
Serial.println("Right button pressed!");
}
delay(100);
}
实现的效果如下:
[localvideo]42e4bf800212bd86da5f8ed8d26ba80d[/localvideo]
-
发表了主题帖:
【Follow me第二季第1期】监测环境温度和光线,通过板载LED展示舒适程度
本帖最后由 流水源 于 2024-8-13 15:13 编辑
本次实现的是基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度。
通过读取板上温度传感器和光线检测传感器。设定适宜的温度和光照范围。
当在适宜的范围内,10个彩灯为绿色呼吸状态。
当温度超过上限,一边显示红色呼吸,超出越多亮的灯越多。当温度低于下限时,显示蓝色呼吸,低的越多,亮的灯越多。
当光照超过上限,另一边显示红色呼吸,超出越多亮的灯越多。当光照低于下限时,显示蓝色呼吸,低的越多,亮的灯越多。
还是使用arduino开发,代码如下:
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
//基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
uint32_t lightbress;
uint8_t l_dir;
int light_val;
int temp_val;
int g_state;
// 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_PIN, OUTPUT);
Serial.begin(115200);
cplay.begin();
cplay.setBrightness(50);
lightbress = 0;
l_dir = 0;
g_state = 0;
}
// the loop function runs over and over again forever
void loop()
{
light_val = cplay.lightSensor();
temp_val = cplay.temperature() * 100;
Serial.println(light_val);
Serial.println(temp_val);
switch(g_state)
{
case 0:
for (int i = 0; i < 10; i++)
{
cplay.strip.setPixelColor(i, 0, lightbress * 10, 0); // 设置LED为green色
}
cplay.strip.show();
if(l_dir == 0)
{
lightbress++;
if(lightbress == 15) l_dir = 1;
}else
{
if(lightbress) lightbress--;
else l_dir = 0;
}
if((light_val > 510) || (light_val < 190) || (temp_val > 3250)||(temp_val < 2950))
{
lightbress = 0;
g_state = 1;
}
break;
case 1:
//温度
int level;
uint8_t r_color,g_color,b_color;
if(temp_val > 3200)
{
level = (temp_val - 3200)/100;
r_color = lightbress * 10;
b_color = 0;
g_color = 0;
}else if(temp_val < 3000)
{
level = (3000 - temp_val)/100;
b_color = lightbress * 10;
r_color = 0;
g_color = 0;
}else
{
g_color = lightbress * 10;
r_color = 0;
b_color = 0;
}
if(level >= 5) level = 5;
for (int i = 0; i < 5; i++)
{
if(i<level) cplay.strip.setPixelColor(i, r_color, g_color, b_color); // 设置LED为blue red色
else cplay.strip.setPixelColor(i, 0, g_color, 0); // 设置LED为blue red色
}
//光照
if(light_val > 500)
{
level = (light_val - 500)/80;
r_color = lightbress * 10;
b_color = 0;
g_color = 0;
}else if(light_val < 200)
{
level = (200 - light_val)/30;
b_color = lightbress * 10;
r_color = 0;
g_color = 0;
}else
{
g_color = lightbress * 10;
r_color = 0;
b_color = 0;
}
if(level >= 5) level = 5;
for (int i = 5; i < 10; i++)
{
if(i>=(10-level)) cplay.strip.setPixelColor(i, r_color, g_color, b_color); // 设置LED为blue red色
else cplay.strip.setPixelColor(i, 0, g_color, 0); // 设置LED为blue red色
}
cplay.strip.show();
lightbress++;
if(lightbress == 15) lightbress = 0;
if((light_val <= 500) && (light_val >= 200) && (temp_val <= 3250) && (temp_val >= 2950))
{
lightbress = 0;
g_state = 0;
}
break;
}
delay(100);
}
编译下载后,实现效果如下:
正常舒适范围:
[localvideo]4e6f90ad23efbd97714a4e45c1b91b67[/localvideo]
光照下:
[localvideo]35252238660bd592abf722704ef30c51[/localvideo]
把板子放到空调下吹冷,然后温度上升到舒适
[localvideo]7da3e50341728545cd2f46c720a5dead[/localvideo]
-
发表了主题帖:
【2024 DigiKey 创意大赛】开箱贴
买了RT1062 Teensy 4.1 i.MX ARM® Cortex®-M7 MPU 评估板,AK09916,ICM-20948加速计,陀螺仪,磁力计,传感器Qwiic,STEMMA QT平台评估扩展板,BME680气体,湿度,压力,温度传感器Qwiic,STEMMA QT平台评估扩展板。主要是RT1062 NXP的mpu和各种传感器。这次得捷发货挺快的。
下一步开始搞项目了。
- 2024-08-07
-
发表了主题帖:
【Follow me第二季第1期】arduino控制板载炫彩跑马灯
首先升级安装Adafruit_Circuit_Playground库,目前是V1.12.0版本。
然后在arduino代码中添加Adafruit_Circuit_Playground库。
然后初始化Adafruit_Circuit_Playground库,以及彩灯初始化。
炫彩跑马灯代码如下:
#include <Adafruit_CircuitPlayground.h>
#include <Adafruit_Circuit_Playground.h>
Adafruit_CircuitPlayground cplay = Adafruit_CircuitPlayground();
#define LED_PIN 13
// 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_PIN, OUTPUT);
cplay.begin();
cplay.setBrightness(50);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level)
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 25*i+25, 0, 0); // 设置LED为red色
delay(100);
}
cplay.clearPixels();
delay(300); // wait for a second
digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 0, 0, 25*i+25); // 设置LED为blue色
delay(100);
}
cplay.clearPixels();
delay(100); // wait for a second
for (int i = 0; i < 10; i++) {
cplay.setPixelColor(i, 0, 25*i+25, 0); // 设置LED为green色
delay(100);
}
cplay.clearPixels();
delay(100); // wait for a second
}
编译下载之后就可以看到跑马灯了。
效果如下:
[localvideo]59a5277baecd047e05a53e7e8a073322[/localvideo]
-
加入了学习《【Follow me第二季第1期】使用Makecode图形化完成任务》,观看 【Follow me第二季第1期】使用Makecode图形化完成任务
-
发表了主题帖:
【Follow me第二季第1期】arduino开发环境的搭建和点灯
参考资料:https://learn.adafruit.com/adafruit-circuit-playground-express/set-up-arduino-ide
首先打开arduino软件,在开发板管理器搜索 Arduino SAMD Boards,然后安装开发板即可。
这里我已经安装完成了。
下一步就可以编写代码编译点灯了。如果板子驱动无法自动安装,可以安装如下驱动软件:
选择开发板和下载串口:
先写个简单的点灯代码。LED灯在D13端口。
#define LED_PIN 13
// 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_PIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(300); // wait for a second
digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW
delay(100); // wait for a second
}
编译下载:
点灯效果,D13红灯亮灭。
- 2024-05-20
-
发表了主题帖:
【Beetle ESP32 C6迷你开发板】+通过网络获取天气信息
ESP32-C6支持很多无线通信协议,下面就通过wifi获取天气信息。
本次获取天气使用的是心知天气服务。使用该服务需要注册心知天气账号,获取个人使用的API KEY。
下面是获取天气的接口:
也可以获取3天内的天气(免费版):
下面就是代码实现了。首先就是需要WIFI,JSON,和HTTPClient库支持。
#include <WiFi.h>
#include <Arduino_JSON.h>
#include <HTTPClient.h>
const char *ssid = "SSID"; //WIFI名称
const char *pwd = "PWD"; //WIFI密码
//填入你获得的API Key
String openWeatherMapApiKey = "API KEY";
//String http_api_str = "https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c" //now
//返回例子
//{"results":[
//{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
//"now":{"text":"晴","code":"0","temperature":"22"},"last_update":"2024-05-20T10:22:03+08:00"}
//]}
//3Day https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=3
//返回例子
//{"results":
//[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
//"daily":[
// {"date":"2024-05-20","text_day":"大雨","code_day":"15","text_night":"雷阵雨","code_night":"11","high":"25","low":"21","rainfall":"29.50","precip":"0.92","wind_direction":"东","wind_direction_degree":"90","wind_speed":"23.4","wind_scale":"4","humidity":"91"},
// {"date":"2024-05-21","text_day":"雷阵雨","code_day":"11","text_night":"雷阵雨","code_night":"11","high":"27","low":"21","rainfall":"1.29","precip":"0.24","wind_direction":"无持续风向","wind_direction_degree":"","wind_speed":"8.4","wind_scale":"2","humidity":"87"},
// {"date":"2024-05-22","text_day":"雷阵雨","code_day":"11","text_night":"雷阵雨","code_night":"11","high":"28","low":"24","rainfall":"0.88","precip":"0.22","wind_direction":"无持续风向","wind_direction_degree":"","wind_speed":"3.0","wind_scale":"1","humidity":"91"}],
//"last_update":"2024-05-20T08:00:00+08:00"}
//]}
获取天气服务的JSON数据。
//获取天气JSON数据
String httpGETRequest(const char* serverName)
{
WiFiClient client;
HTTPClient http;
//连接网址
http.begin(client, serverName);
//发送HTTP站点请求
int httpResponseCode = http.GET();
//该数组用于储存获得的数据
String payload = "{}";
//将获得的数据放入数组
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
//释放资源
http.end();
//返回获得的数据用于Json处理
return payload;
}
初始化连接WIFI热点:
WiFi.mode(WIFI_MODE_STA);
Serial.println(WiFi.macAddress());
WiFi.begin(ssid, pwd);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
定时循环获取天气信息:
//发送HTTP获取请求
if ((millis() - lastTime) > timerDelay)
{
timerDelay = 60000;
//检测WIFI是否已经连接
if(WiFi.status()== WL_CONNECTED)
{
String serverPath = "http://api.seniverse.com/v3/weather/now.json?key=" + openWeatherMapApiKey + "&location=" + city + "&language=en&unit=c";
Serial.println("=======================================================================");
//将组合好的URL放入httpGETRequest函数中通过HTTP获取请求以获得文本
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
//将解析的Json对象值储存在Jsonu缓冲区中
JSONVar myObject = JSON.parse(jsonBuffer);
//判断解析是否成功
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.println("=======================================================================");
// Serial.print("JSON object = ");
// Serial.println(myObject);
Serial.print("Weather: ");
Serial.println(myObject["results"][0]["now"]["text"]);
Serial.print("Code: ");
Serial.println(myObject["results"][0]["now"]["code"]);
Serial.print("Temperature: ");
Serial.println(myObject["results"][0]["now"]["temperature"]);
Serial.println("=======================================================================");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
下面是打印输出的天气信息:
整体代码如下:
#include <WiFi.h>
#include <Wire.h>
#include <Arduino_JSON.h>
#include <HTTPClient.h>
#include <RPR-0521RS.h>
#include <shtc3.h>
RPR0521RS rpr0521rs;
SHTC3 d_shtc3;
#define myLED 15 //设置引脚15为LED引脚
const char *ssid = "SSID"; //WIFI名称
const char *pwd = "PWD"; //WIFI密码
//填入你获得的API Key
String openWeatherMapApiKey = "API KEY";//你的心知天气API KEY
//String http_api_str = "https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c" //now
//返回例子
//{"results":[
//{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
//"now":{"text":"晴","code":"0","temperature":"22"},"last_update":"2024-05-20T10:22:03+08:00"}
//]}
//3Day https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=3
//返回例子
//{"results":
//[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
//"daily":[
// {"date":"2024-05-20","text_day":"大雨","code_day":"15","text_night":"雷阵雨","code_night":"11","high":"25","low":"21","rainfall":"29.50","precip":"0.92","wind_direction":"东","wind_direction_degree":"90","wind_speed":"23.4","wind_scale":"4","humidity":"91"},
// {"date":"2024-05-21","text_day":"雷阵雨","code_day":"11","text_night":"雷阵雨","code_night":"11","high":"27","low":"21","rainfall":"1.29","precip":"0.24","wind_direction":"无持续风向","wind_direction_degree":"","wind_speed":"8.4","wind_scale":"2","humidity":"87"},
// {"date":"2024-05-22","text_day":"雷阵雨","code_day":"11","text_night":"雷阵雨","code_night":"11","high":"28","low":"24","rainfall":"0.88","precip":"0.22","wind_direction":"无持续风向","wind_direction_degree":"","wind_speed":"3.0","wind_scale":"1","humidity":"91"}],
//"last_update":"2024-05-20T08:00:00+08:00"}
//]}
const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
// 填写城市名以及国家简写
String city = "GuangZhou";
String jsonBuffer;
unsigned long lastTime = 0;
//设置每10分钟获得一次天气数据
unsigned long timerDelay = 10000;
//打印时间
void printLocalTime()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
}
//获取天气JSON数据
String httpGETRequest(const char* serverName)
{
WiFiClient client;
HTTPClient http;
//连接网址
http.begin(client, serverName);
//发送HTTP站点请求
int httpResponseCode = http.GET();
//该数组用于储存获得的数据
String payload = "{}";
//将获得的数据放入数组
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
//释放资源
http.end();
//返回获得的数据用于Json处理
return payload;
}
//====================================================================================================================================================
void setup()
{
byte rc;
pinMode(myLED, OUTPUT);
digitalWrite(myLED, HIGH);
Serial.begin(115200);
Serial.println("******************************** senser test *******************************************");
//set the resolution to 12 bits (0-4096)
analogReadResolution(12);
Wire.begin();
rc = rpr0521rs.init();
Serial.print(F("RPR-0521RS Init = "));
Serial.println(rc);
rc = d_shtc3.Init();
Serial.print(F("SHTC3 Init = "));
Serial.println(rc);
WiFi.mode(WIFI_MODE_STA);
Serial.println(WiFi.macAddress());
WiFi.begin(ssid, pwd);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
// 从网络时间服务器上获取并设置时间
// 获取成功后芯片会使用RTC时钟保持时间的更新
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
lastTime = millis();
}
//====================================================================================================================================================
void loop()
{
byte rc;
byte near_far;
unsigned short ps_val;
float als_val;
int temp;
int rh;
digitalWrite(myLED, HIGH);
delay(100);
printLocalTime();
Serial.println("----------------------------------------");
// read the analog / millivolts value for pin 2:
int analogValue = analogRead(0);
int analogVolts = analogReadMilliVolts(0);
// print out the values you read:
Serial.print("ADC analog value = ");
Serial.println(analogValue);
Serial.print("ADC millivolts value = ");
Serial.print(analogVolts);
Serial.println("mV");
// Please adjust the calculation coefficient according to the actual measurement.
Serial.print("BAT millivolts value = ");
Serial.print(analogVolts * 2.1218 + 1000);
Serial.println("mV");
Serial.println("----------------------------------------");
delay(100);
rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
if (rc == 0) {
Serial.print(F("RPR-0521RS (Proximity) = "));
Serial.print(ps_val);
near_far = rpr0521rs.check_near_far(ps_val);
if (near_far == RPR0521RS_NEAR_VAL) {
Serial.print(F(" Near,"));
} else {
Serial.print(F(" Far,"));
}
if (als_val != RPR0521RS_ERROR) {
Serial.print(F("\t (Ambient Light) = "));
Serial.print(als_val);
Serial.println(F("[lx]."));
}
}
delay(100);
rc = d_shtc3.GetMode1_TempRH(&temp, &rh);
if (rc == 0) {
Serial.print(F("SHTC3 Temp = "));
Serial.print(temp);
Serial.print("^C,");
Serial.print(F(" \t RH = "));
Serial.print(rh);
Serial.println("%");
Serial.println();
}
digitalWrite(myLED, LOW);
delay(800);
//发送HTTP获取请求
if ((millis() - lastTime) > timerDelay)
{
timerDelay = 60000;
//检测WIFI是否已经连接
if(WiFi.status()== WL_CONNECTED)
{
String serverPath = "http://api.seniverse.com/v3/weather/now.json?key=" + openWeatherMapApiKey + "&location=" + city + "&language=en&unit=c";
Serial.println("=======================================================================");
//将组合好的URL放入httpGETRequest函数中通过HTTP获取请求以获得文本
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
//将解析的Json对象值储存在Jsonu缓冲区中
JSONVar myObject = JSON.parse(jsonBuffer);
//判断解析是否成功
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
Serial.println("=======================================================================");
// Serial.print("JSON object = ");
// Serial.println(myObject);
Serial.print("Weather: ");
Serial.println(myObject["results"][0]["now"]["text"]);
Serial.print("Code: ");
Serial.println(myObject["results"][0]["now"]["code"]);
Serial.print("Temperature: ");
Serial.println(myObject["results"][0]["now"]["temperature"]);
// Serial.print("Pressure: ");
// //myObject["now"]["pressure"]前为{}前的引号内容,后为读取哪一个引号后数据
// Serial.println(myObject["now"]["pressure"]);
// Serial.print("Humidity: ");
// Serial.println(myObject["now"]["humidity"]);
// Serial.print("Wind Speed: ");
// Serial.println(myObject["now"]["wind_speed"]);
Serial.println("=======================================================================");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
- 2024-05-13
-
发表了主题帖:
【Beetle ESP32 C6迷你开发板】+基于arduino读取温湿度传感器SHTC3数据
SHTC3简单说明
SHTC3是一个检测温度和湿度的传感器,可以检测-40℃~125℃的温度范围和0%~100%的湿度范围,典型精度为±2 %RH和±0.2°C。
SHTC3的工作电压范围为:1.62V~3.6V。
SHTC3使用的通讯方式是I2C,通讯速率可以达到400KHz。
SHTC3只有4个引脚,电源和地、2个I2C通讯引脚。
SHTC3的I2C设备地址为0x70。
下面就是SHTC3的驱动程序。要注意SHTC3的寄存器是16位的2个字节。
#ifndef __DRV_SHTC3_H
#define __DRV_SHTC3_H
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
#define SHTC3_ADDRESS (0x70)
#define SHTC3_CRC_POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
/*=========================================================================*/
/*=========================================================================
REGISTERS
-----------------------------------------------------------------------*/
//ID16BIT:B15 to 12 & 10 to 6: unspecified info.bits 11 & 5 to 0: SHTC3 identifier
#define SHTC3_REG_ID (0xEFC8) //xxxx 1xxx xx00 0111
#define SHTC3_REG_SLEEP (0xB098) //
#define SHTC3_REG_WAKEUP (0x3517) //
#define SHTC3_REG_RESET (0x805D) //
//Mode1
#define SHTC3_REG_CENM_TEMP_RH (0x7CA2) //��ͨģʽ����ʱ�䳤��>10ms
#define SHTC3_REG_CENM_RH_TEMP (0x5C24) //
#define SHTC3_REG_CELPM_TEMP_RH (0x6458) //����ģʽ����ʱ���: <1ms
#define SHTC3_REG_CELPM_RH_TEMP (0x44DE) //
//Mode2
#define SHTC3_REG_CDNM_TEMP_RH (0x7866) //
#define SHTC3_REG_CDNM_RH_TEMP (0x58E0) //
#define SHTC3_REG_CDLPM_TEMP_RH (0x609C) //
#define SHTC3_REG_CDLPM_RH_TEMP (0x401A) //
//==============================================================================
class SHTC3
{
public:
SHTC3(void);
int Init(void) ;
byte GetMode1_TempRH(int *temp, int *humi);
byte write(unsigned int memory_address, unsigned char *data, int size);
byte read (unsigned int memory_address, unsigned char *data, int size);
private:
uint16_t shtc3_id;
};
#endif
下面是操作SHTC3的寄存器接口。要注意SHTC3的寄存器是16位的2个字节。
#include <Arduino.h>
#include <Wire.h>
#include "shtc3.h"
byte SHTC3::write(unsigned int memory_address, unsigned char *data, int size)
{
byte rc;
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write((memory_address>>8) & 0xFF);
Wire.write(memory_address & 0xFF);
if((data != NULL) && (size != 0))
Wire.write(data, size);
rc = Wire.endTransmission();
return (rc);
}
byte SHTC3::read(unsigned int memory_address, unsigned char *data, int size)
{
byte rc;
unsigned int cnt;
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write((memory_address>>8) & 0xFF);
Wire.write(memory_address & 0xFF);
rc = Wire.endTransmission(false);
if (rc != 0) {
return (rc);
}
Wire.requestFrom(SHTC3_ADDRESS, size, true);
if((data != NULL) && (size != 0))
{
cnt = 0;
while(Wire.available()) {
data[cnt] = Wire.read();
cnt++;
}
}
return (0);
}
将驱动程序添加到Arduino的库文件夹下。下面是测试读取代码。
#include <Wire.h>
#include <RPR-0521RS.h>
#include <shtc3.h>
RPR0521RS rpr0521rs;
SHTC3 d_shtc3;
#define myLED 15 //设置引脚15为LED引脚
void setup() {
byte rc;
pinMode(myLED, OUTPUT);
digitalWrite(myLED, HIGH);
Serial.begin(115200);
Serial.println("******************************** senser test *******************************************");
Wire.begin();
rc = rpr0521rs.init();
Serial.print(F("RPR-0521RS Init = "));
Serial.println(rc);
rc = d_shtc3.Init();
Serial.print(F("SHTC3 Init = "));
Serial.println(rc);
}
void loop() {
byte rc;
byte near_far;
unsigned short ps_val;
float als_val;
int temp;
int rh;
digitalWrite(myLED, HIGH);
delay(100);
rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
if (rc == 0) {
Serial.print(F("RPR-0521RS (Proximity) = "));
Serial.print(ps_val);
near_far = rpr0521rs.check_near_far(ps_val);
if (near_far == RPR0521RS_NEAR_VAL) {
Serial.print(F(" Near,"));
} else {
Serial.print(F(" Far,"));
}
if (als_val != RPR0521RS_ERROR) {
Serial.print(F("\t (Ambient Light) = "));
Serial.print(als_val);
Serial.println(F("[lx]."));
}
}
delay(100);
rc = d_shtc3.GetMode1_TempRH(&temp, &rh);
if (rc == 0) {
Serial.print(F("SHTC3 Temp = "));
Serial.print(temp);
Serial.print("^C,");
Serial.print(F(" \t RH = "));
Serial.print(rh);
Serial.println("%");
Serial.println();
}
digitalWrite(myLED, LOW);
delay(800);
}
通过串口输出信息,可以看到温湿度读取成功。
资料: