【Follow me第二季第1期】基础任务一、二、三
[复制链接]
本帖最后由 aramy 于 2024-8-26 08:58 编辑
基础任务一:控制板载炫彩LED,跑马灯点亮和颜色变换
板子外边缘有一圈全彩LED灯,一共10颗。跑马灯就是依次逐个点亮LED灯,利用肉眼的视觉残留,感觉到灯光的运动。这里使用了最大的亮度,颜色使用一个随机数,让10颗LED灯依次亮起,每次亮20ms。
#include <Adafruit_CircuitPlayground.h>
void setup()
{
CircuitPlayground.begin();
Serial.begin(115200);
CircuitPlayground.strip.setBrightness(255);
}
void loop()
{
uint32_t color=random(0, 0xffffff);
for (int i = 0; i < 10; ++i)
{
CircuitPlayground.strip.setPixelColor(i, color);
CircuitPlayground.strip.show();
delay(20);
CircuitPlayground.strip.clear();
}
}
WeChat_20240815104125
基础任务二:监测环境温度和光线,通过板载LED展示舒适程度
板子上集成了超多的传感器,其中就有温度计和光线传感器。因为没有显示屏,就需要使用LED展示温度和光线的信息。光线强弱直接和LED灯的亮度挂钩,光线越强,LED灯越亮。实测中光线传感器非常靠近0~2号LED灯的位置,这样LED灯的光线会影响到光线传感器读取环境光强数据。所以0~3号LED灯,没有去驱动,使其处于关闭状态。
环境光线强度由LED灯的亮度表现,温度就由LED灯的颜色来表现了。设定最低温度和最高温度,最低温度20摄氏度,最高40摄氏度。将这个温度区间映射到全彩色域。越靠近20度,颜色就越偏向冷色调(蓝色),越靠近40度,颜色就约偏向于暖色调(紫红),符合心理上对温度感知的映像。
#include <Adafruit_CircuitPlayground.h>
float MinTemp = 20.0, MaxTemp = 40.0, a, b, c, d;
float tempC;
uint16_t lightval;
void Getabcd()
{
a = MinTemp + (MaxTemp - MinTemp) * 0.2121;
b = MinTemp + (MaxTemp - MinTemp) * 0.3182;
c = MinTemp + (MaxTemp - MinTemp) * 0.4242;
d = MinTemp + (MaxTemp - MinTemp) * 0.8182;
}
//浮点数转颜色 伪彩色
void GetColor(float val,uint8_t rgbval[])
{
byte red = 0, green = 0, blue = 0;
red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);
if ((val > MinTemp) & (val < a))
{
green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);
}
else if ((val >= a) & (val <= c))
{
green = 255;
}
else if (val > c)
{
green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);
}
else if ((val > d) | (val < a))
{
green = 0;
}
if (val <= b)
{
blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);
}
else if ((val > b) & (val <= d))
{
blue = 0;
}
else if (val > d)
{
blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);
}
rgbval[0]=red;
rgbval[1]=green;
rgbval[2]=blue;
// return red << 16 | green << 8 | blue;
}
void setup()
{
CircuitPlayground.begin();
Serial.begin(115200);
CircuitPlayground.strip.setBrightness(255);
Getabcd();
}
void loop()
{
uint8_t rgbval[3];
tempC = CircuitPlayground.temperature();
lightval= CircuitPlayground.lightSensor();
Serial.print(tempC);
Serial.print(" ");
Serial.println(lightval);
GetColor(tempC,rgbval);
CircuitPlayground.strip.setBrightness(lightval>255?255:lightval);
for(uint8_t i=3;i<10;i++)
CircuitPlayground.strip.setPixelColor(i, rgbval[0], rgbval[1], rgbval[2]);
CircuitPlayground.strip.show();
delay(200);
CircuitPlayground.strip.clear();
}
1
基础任务三:接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
板子上有红外发射和接收装置。看文档介绍是可以利用这两个传感器测量距离的。有做测试,但是没能成功。使用AD测量红外接收端,没有获得与距离正相关的数据。还发现长时间点亮红外LED灯,板子都快烤糊了,都出味了。遂放弃使用红外测距,改为超声波模块测距。效果也是非常不错。
距离继续使用上一个实验中的伪彩色转换方法,将距离映射到颜色。将10厘米到300厘米距离 完整映射到全彩色色域。设定阈值,当距离小于20厘米时,驱动蜂鸣器报警。
#include <Adafruit_CircuitPlayground.h>
float MinTemp = 1.0, MaxTemp = 30.0, a, b, c, d;
#define Trig A0 //引脚Tring
#define Echo A1 //引脚Echo
float dm; //距离变量 分米
float temp; //
void Getabcd()
{
a = MinTemp + (MaxTemp - MinTemp) * 0.2121;
b = MinTemp + (MaxTemp - MinTemp) * 0.3182;
c = MinTemp + (MaxTemp - MinTemp) * 0.4242;
d = MinTemp + (MaxTemp - MinTemp) * 0.8182;
}
//浮点数转颜色 伪彩色
void GetColor(float val, uint8_t rgbval[])
{
byte red = 0, green = 0, blue = 0;
red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);
if ((val > MinTemp) & (val < a))
{
green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);
}
else if ((val >= a) & (val <= c))
{
green = 255;
}
else if (val > c)
{
green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);
}
else if ((val > d) | (val < a))
{
green = 0;
}
if (val <= b)
{
blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);
}
else if ((val > b) & (val <= d))
{
blue = 0;
}
else if (val > d)
{
blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);
}
rgbval[0] = red;
rgbval[1] = green;
rgbval[2] = blue;
// return red << 16 | green << 8 | blue;
}
void setup()
{
CircuitPlayground.begin();
Serial.begin(115200);
CircuitPlayground.strip.setBrightness(255);
Getabcd();
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}
void loop()
{
uint8_t rgbval[3];
//给Trig发送一个低高低的短时间脉冲,触发测距
digitalWrite(Trig, LOW); //给Trig发送一个低电平
delayMicroseconds(2); //等待 2微妙
digitalWrite(Trig, HIGH); //给Trig发送一个高电平
delayMicroseconds(10); //等待 10微妙
digitalWrite(Trig, LOW); //给Trig发送一个低电平
temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间, //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时 //返回脉冲的长度 //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000 //因为发送到接收,实际是相同距离走了2回,所以要除以2 //距离(厘米) = (回波时间 * (34 / 1000)) / 2 //简化后的计算公式为 (回波时间 * 17)/ 1000
dm = (temp * 17) / 10000; //把回波时间换算成dm
if (dm > 0)
{
Serial.print("距离=");
Serial.println(dm);
GetColor((30.0 - dm), rgbval);
for (uint8_t i = 0; i < 10; i++)
CircuitPlayground.strip.setPixelColor(i, rgbval[0], rgbval[1], rgbval[2]);
CircuitPlayground.strip.show();
if (dm < 2)
{ //距离小于20cm时,拉响警报
CircuitPlayground.playTone(1000, 500); // 播放警报音500ms
}
}
delay(500);
CircuitPlayground.strip.clear();
}
2
|