ARDUINO Светодиодные часы на ардуино (Arduino) WS2312

Droniiiii

✩✩✩✩✩✩✩
6 Дек 2020
2
0
Здраствуйте, помогите изменить скетч, сделал часы на ардуино с термометром DHT22 но в скетче написано темпаратура от 00С до 100С, а у меня часы стоять на улице и когда темпаратура упала меньше 0 градусов например если -10 градусов всеравно на часах показывает 00С
C++:
#include <DS3231RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include "FastLED.h"
#include "DHT.h"
#define DHT_PIN 5 // пин подключения датчика DHT 11
#define DHTTYPE DHT22 // DHT 11
#define NUM_LEDS 114 // 4*7*4 +2 количество светодиодов в ленте
#define COLOR_ORDER BRG // определение порядка цветов для ленты
#define DATA_PIN 6 // пин подключения ленты
#define DST_PIN 2 // пин кнопки перевода на летнее время и обратно
#define MIN_PIN 3 // пин кнопки настройки минут
#define HUR_PIN 4 // пин кнопки настройки часов
#define BRI_PIN A3 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)114
#define max_bright 255 // максимальная яркость (0 - 255)
#define min_bright 1 // минимальная яркость (0 - 255)
#define bright_constant 1023 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

tmElements_t tmet;
time_t dateMet;

DHT dht(DHT_PIN, DHTTYPE);

CRGB leds[NUM_LEDS]; // Define LEDs strip
// 0,0,0,0
// 1,1,1,1
// 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
byte digits[13][28] = {{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 0
{0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 1
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit 2
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 3
{1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 4
{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 5
{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 6
{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 7
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 8
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 9 | 2D Array for numbers on 7 segment,
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // ° char
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // C char
{1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; // % char

bool Dot = true; //Dot state
bool DST = false; //DST state
bool TempShow = false;
bool HumidityShow = false;
bool led_state = true; // флаг состояния ленты
int last_digit = 0;
// int ledColor = 0x0000FF; // Color used (in hex)
long ledColor = CRGB::DarkOrchid; // Color used (in hex)
//Random colors i picked up
long ColorTable[16] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::BlueViolet,
CRGB::Crimson,
CRGB::DarkMagenta,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Magenta,
CRGB::MidnightBlue,
CRGB::MediumVioletRed,
CRGB::Navy,
CRGB::Indigo,
CRGB::OrangeRed,
CRGB::purple,
CRGB::RoyalBlue,
CRGB::Tomato
};
void setup() {
Serial.begin(9600);
LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
LEDS.setBrightness(5); // Set initial brightness
pinMode(DST_PIN, INPUT_PULLUP); // Define DST adjust button pin
pinMode(MIN_PIN, INPUT_PULLUP); // Define Minutes adjust button pin
pinMode(HUR_PIN, INPUT_PULLUP); // Define Hours adjust button pin
TempShow = false;
HumidityShow = false;
dht.begin();
}

// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime() {
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (second % 2 == 0) {
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minutes);
};

// Check Light sensor and set brightness accordingly
void BrightnessCheck() {
if (auto_bright) {
if (millis() - bright_timer > 1000) { // каждые 2 мс
bright_timer = millis();
int bright = analogRead(BRI_PIN);
int bright_r;
bright_r = bright%10 > 5 ? ((bright/10)*10)+10 : (bright/10)*10;
new_bright = map(bright_r, 0, bright_constant, min_bright, max_bright); // считать показания с фоторезистора, перевести диапазон
new_bright = constrain(new_bright, min_bright, max_bright);
new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
new_bright_f += 1;
LEDS.setBrightness(new_bright_f); // установить новую яркость
}
}
};

// Convert time to array needet for display
void TimeToArray() {
int Now = GetTime(); // Получить текущее время

int cursor = 114; // номер последнего светодиода

// Serial.print("Time is: ");Serial.println(Now);
if (DST) { // if DST is true then add one hour
Now += 100;
// Serial.print("DST is ON, time set to : ");Serial.println(Now);
};
if (Dot) {
leds[57] = ledColor;
leds[56] = ledColor;
}
else {
leds[57] = 0x000000;
leds[56] = 0x000000;
};

for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // get last digit in time
if (i == 1) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
if (digit != last_digit)
{
ledColor = ColorTable[random(16)];
}
last_digit = digit;

}
else if (i == 2) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 3) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
Now /= 10;
};
};
// Convert temp to array needet for display
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 27) { // 27
TempShow = false;
return;
}
TempShow = true;
int t = dht.readTemperature();
int celsius = t * 100;
// Serial.print("Temp is: ");Serial.println(celsius);

int cursor = 114; // last led number

leds[57] = 0x000000;
leds[56] = 0x000000;

for (int i = 1; i <= 4; i++) {
int digit = celsius % 10; // get last digit in time
if (i == 1) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[11][k]);
if (digits[11][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[11][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 2) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[10][k]);
if (digits[10][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[10][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 3) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
celsius /= 10;
};
};

void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 38) { //38
HumidityShow = false;
return;
}
HumidityShow = true;
int h = dht.readHumidity();
int humidity_percentage = h * 100;
// Serial.print("Humidity is: ");Serial.println(humidity_percentage);

int cursor = 114; // last led number

leds[57] = 0x000000;
leds[56] = 0x000000;

for (int i = 1; i <= 4; i++) {
int digit = humidity_percentage % 10; // get last digit in time
if (i == 1) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[11][k]);
if (digits[12][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[12][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 2) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;

for (int k = 0; k <= 27; k++) {
// Serial.print(digits[10][k]);
if (digits[10][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[10][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 3) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
humidity_percentage /= 10;
};
};

void DSTcheck() {
int buttonDST = digitalRead(2);
// Serial.print("DST is: ");Serial.println(DST);
if (buttonDST == LOW) {
if (DST) {
DST = false;
// Serial.print("Switching DST to: ");Serial.println(DST);
}
else if (!DST) {
DST = true;
// Serial.print("Switching DST to: ");Serial.println(DST);
};
delay(500);
};
}
void TimeAdjust() {
int buttonH = digitalRead(HUR_PIN);
int buttonM = digitalRead(MIN_PIN);
if (buttonH == LOW || buttonM == LOW) {
delay(500);
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
} else {
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
/* coool effect function*/

void loop() // Main loop
{
BrightnessCheck(); // Проверка яркости
DSTcheck(); // Check DST
TimeAdjust(); // Check to se if time is geting modified
TimeToArray(); // Get leds array with required configuration
TempToArray();
HumidityToArray();
FastLED.show(); // Display leds array
if (TempShow == true) delay (5000);
if (HumidityShow == true) delay (5000);
}
 

Вложения

Изменено:

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
для нормальной работы сначала нужно заменить паршивый DHT22(который сдохнет довольно быстро) на нормальный датчик, например
SHT21
 
  • Лойс +1
Реакции: Droniiiii