В данной статье мы рассмотрим создание на основы платы Arduino Nano и датчика температуры DS18B20 термометра с красивым внешним видом для измерения температуры в комнате. Измеренная температура будет отображаться с помощью адресной светодиодной ленты.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Digilent WS2812 Addressable LED Strip (адресная светодиодная лента) (купить на AliExpress).
- Датчик температуры DS18B20 (купить на AliExpress).
- Кнопочный переключатель.
Общие принципы работы проекта
В данной статье мы рассмотрим создание термометра для измерения комнатной температуры, то есть в диапазоне примерно от 10 до 35 градусов Цельсия.
Измерять температуру мы будем с помощью датчика DS18B20, обладающего точностью измерения температуры в 0,5 градуса. Более подробно о его характеристиках и способу подключения к плате Arduino вы можете прочитать в данной статье. Измеренная температура будет отображать на адресном светодиодном индикаторе (LED bar) WS2812, который содержит 50 светодиодов. С помощью данного индикатора значение температуры будет отображаться весьма наглядно, используя для этого цвет светодиодов.
При изменении температуры цвет свечения светодиодов будет постепенно изменяться от темно-синего (для низких температур), далее к светло-синему, затем к зеленому (область комфортных температур) и далее до красного (высокие температуры). То есть одного беглого взгляда на термометр будет достаточно чтобы определить находится ли температура в "комфортной зоне" или нет.
Кнопочный переключатель в нашем проекте будет использоваться для изменения режимов работы термометра. Когда переключатель будет отжат, термометр будет функционировать в режиме "DOT" (точка) и текущая температура будет отображаться с помощью свечения одного светодиода.
При нажатии кнопочного переключателя режим работы термометра будет изменяться на линейный. В этом режиме будут светиться все светодиоды, начиная от начальной точки и до измеренной температуры. Если мы нажмем на кнопочный переключатель еще раз, то термометр будет переключать в тестовый режим – все светодиоды на индикаторы будут последовательно зажигаться один за другим. Если мы нажмем кнопку еще раз, то термометр снова вернется в режим DOT и т.д.
Схема проекта
Схема комнатного термометра на основе платы Arduino Nano представлена на следующем рисунке.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include "Wire.h" // библиотека для работы с протоколом I2C #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); // последовательная связь со скоростью 9600 бод strip.begin(); clearStrip(); strip.show(); strip.setBrightness(10); pinMode(buttonPin, INPUT); digitalWrite(buttonPin, HIGH); // по умолчанию на контакте кнопки уровень HIGH, при нажатии кнопки на этом контакте уровень 0 sensors.begin(); } void testing(){ for(int L = 0; L<50; L++) { clearStrip(); strip.setPixelColor(L,wheel(((205+(L*3)) & 255)));// градиент от синего цвета (холодные температуры) к зеленому (комфортные температуры) и далее к красному (жаркие температуры), первое значение 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(); //Output on strip 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(); //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; } } //Color wheel ################################################################ 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); } } |