亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

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

基于Arduino的房间舒适温度计

发布时间:2021-05-25
分享到:

基于Arduino的房间舒适温度计

发布时间:2021-05-25
分享到:

本文将介绍如何制作一个温度计,用于测量我们所在房间的温度,也可称其为房间舒适温度计。它可测量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); 

}

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论