В данном проекте будет рассказано, как сделать термометр, предназначенный для измерения температуры в помещении, где мы находимся, он также известен как комнатный термометр температуры комфорта.

Диапазон измерения нашего термометра составляет от 10 градусов до 35 градусов по Цельсию. Термометр имеет разрешение 0,5 градусов. Температура отображается на светодиодной панели из последовательных RGB-светодиодов WS2812, содержащей 50 таких диодов. Преимущество этого термометра заключается в том, что в дополнение к шкале мы можем увидеть температуру через цвет светодиода.
При изменении температуры, цвет диода постепенно меняется от темно-синего при более низких температурах, следующий светло-синий цвет, далее зеленые оттенки при комфортных температурах, и красные уровни при более высоких температурах. Так что только с первым взглядом на термометр мы можем сделать вывод, находится ли температура в зоне комфорта.
Устройство очень просто для создания и содержит только несколько компонентов: Arduino Nano, светодиодная лента из 50 светодиодов WS2812, датчик температуры DS18B20 и переключатель изменения режимов работы.

Нажав кнопку, режим работы переключается на линейный. В этом режиме все диоды освещают от начальной к определенной температуре. При следующем нажатии кнопки, устройство переключается в режим тестирования, и теперь все диоды включаются последовательно по одному на максимум, а затем возвращаются в исходное состояние.
Схема подключения компонентов термометра на Arduino представлена далее.

Код программы для работы термометра на Arduino следующий:
#include "Wire.h"
#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;
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); //turn on serial monitor
strip.begin();
clearStrip();
strip.show();
strip.setBrightness(10);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
sensors.begin();
}
void testing(){
for(int L = 0; L<50; L++) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));
strip.show();
delay(100);
}
for(int L = 49; L>=0; L--) {
clearStrip();
strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));
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)));
}
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)));
}
strip.show(); //Output on strip
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);
}
}
© digitrode.ru