本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
本文将介绍如何制作一个温度计,用于测量我们所在房间的温度,也可称其为房间舒适温度计。它可测量10℃-35℃,温度计的分辨率是0.5℃。温度显示在WS2812 LED条上(包含50个二极管)。
该温度计可从刻度观察温度,也可从LED颜色得知温度:二极管的颜色在较低的温度下逐渐从深蓝色变为浅蓝色,然后在舒适的温度下通过绿色阴影,在较高的温度下变为红色。所以只要看一眼温度计,就能断定温度是否在舒适区。
打开时,温度计工作在“点”模式,当前温度由一个二极管的照明显示。按下按钮,操作模式切换到线性。在这种模式下,所有二极管从初始温度到特定温度都点亮。下次按下按钮时,设备切换到测试模式,现在所有二极管都依次逐个接通到最大值,然后返回。要返回到点模式,需要再次按键。
项目演示:
硬件组件:
软件应用:
示意图:
代码:
#include "Wire.h" // 导入用于通过I2C交谈的wire库
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_NeoPixel.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Celcius=0;
int buttonPin = 2; // 针脚0上的瞬时按钮
int oldButtonVal = 0;
#define NUM_PIXEL 50
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, PIN, NEO_GRB + NEO_KHZ800);
int nPatterns = 3;
int lightPattern = 1;
int out =0;
int t =0;
void setup()
{
Serial.begin(9600); //打开串行监视器
strip.begin();
clearStrip();
strip.show();
strip.setBrightness(10);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH); // 按钮引脚高,所以按下时会降到0
sensors.begin();
}
void testing(){
for(int L = 0; L<50; L++) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));//从蓝色(冷)到绿色(ok)到红色(暖)的渐变,第一个值这里205=开始颜色,第二个值42=结束颜色
strip.show();
delay(100);
}
for(int L = 49; L>=0; L--) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));//从蓝色(冷)到绿色(正常)到红色(暖)的渐变,第一个值205=开始颜色,第二个值42=结束颜色
strip.show();
delay(100);
}
delay(1000);
}
void dot() {
sensors.requestTemperatures();
Celcius=sensors.getTempCByIndex(0)*2;
int t = map(Celcius, 20, 70, 0, NUM_PIXEL);
for(uint16_t L = 0; L<t; L++) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255))); //从蓝色(冷)到绿色(正常)到红色(暖)的渐变,第一个值205=开始颜色,第二个值42=结束颜色
}
strip.show(); //带上输出
Serial.print("The Temperature is: ");
Serial.print(Celcius);
delay(1000);
}
void line() {
sensors.requestTemperatures();
Celcius=sensors.getTempCByIndex(0)*2;
int t = map(Celcius, 20, 70, 0, NUM_PIXEL);
for(uint16_t L = 0; L<t; L++) {
strip.setPixelColor(L,wheel(((205+(L*3)) & 255))); //从蓝色(冷)到绿色(正常)到红色(暖)的渐变,第一个值205=开始颜色,第二个值42=结束颜色
}
strip.show(); //带上输出
Serial.print("The Temperature is: ");
Serial.print(Celcius);
delay(1000);
}
void loop() {
//读取按钮值的静态压力;
int buttonVal = digitalRead(buttonPin);
if (buttonVal == LOW && oldButtonVal == HIGH) {// 按钮刚按下
lightPattern = lightPattern + 1;
}
if (lightPattern > nPatterns) lightPattern = 1;
oldButtonVal = buttonVal;
switch(lightPattern) {
case 1:
dot();
break;
case 2:
line();
break;
case 3:
testing();
break;
}
}
//色轮 ################################################################
uint32_t wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 205) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else {
WheelPos -= 205;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
void clearStrip(){
for(int i = 0; i < NUM_PIXEL; i++) {
strip.setPixelColor(i, 0);
}
}
开启“人工智能”——贝尔金WeMo智能插座套装拆解
2014-05-23
iPhone 6 plus最专业传感器深入解析
2014-10-22
智能手机里面都装着哪些传感器?它们都记录了你的什么?
2016-04-11
NXP开发板不知道选什么,看这里就对了!
2016-07-28
盘点全球知名传感器芯片巨头Top10
2015-08-21
这套工业物联网解决方案把乐高变成了一座智慧城市
2019-06-24
[项目实录]全流程LoRaWAN开发
2019-07-22
【视频秀】用STM32和光传感器控制电机马达开关窗户
2019-06-12
一款小尺寸、高性能的智能家居设备
2019-06-21
无线传感器网络——传感器原理与应用系列课程
2019-07-24
讨论