при использовании датчика BME280 есть возможность использования часов на Улице , как потушить символ"С" и заставить показывать отрицательную температуру (если на улице минусовая температура)?
помощь - это обучение программированию страждущих в трёх постах? Или выдача готового кода на блюдечке?
Не. Это русский форум, осмысленный, но беспощадный, тут не дают ни знаний, ни готового, а пробуют пробудить мосх вопрошающего к желанию учиться и, самаглавна, думать.
Да в строчке написано условие что если temp меньше 0 то выводим знак минуса?
И что, скажете вы сами не могли до этого додуматься ПОЛТОРА МЕСЯЦА?
Честно говоря. у меня только два предположения - либо вы непроходимо глупы и лишены элементарной логики, дибо совершенно не хотите думать, а ждете готового решения. В обоих случаях никакого желания помогать вам не возникает, простите.
dgeka - если вы отмотаете ветку назад. вы увидите, что я довольно охотно помогаю с этими часами тем, кто спрашивает. Но при одном условии - если люди пытаются что-то сделать САМИ.
ShevaLoL а в чем собственно проблема у вас в коде закоментирован пример для DHT11 поменяйте на 22 появится температура. добавьте чтение и вывод влажности будет влажность.
ShevaLoL а в чем собственно проблема у вас в коде закоментирован пример для DHT11 поменяйте на 22 появится температура. добавьте чтение и вывод влажности будет влажность.
Запустил часы на esp8266, но появились некоторые косяки. При переключении на показал температуры/давления/влажности светодиоды через один меняют свой оттенок. Это может произойти как во всех 3 вариантах либо вообще не появиться. Также при запуске анимации смены цвета несколько светодиодов 1го сегмента начинают мерцать. Есть ли такое на ардуино или это "фишки" esp?
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Adafruit_BME280.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 2 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2 // Задаём количество разделительных точек
#define COLOR_CHANGE 1 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN D6 // подключение ленты
#define BRI_PIN A0 // фоторезистор
#define auto_bright 0 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 227 // максимальная яркость (0 - 255)
#define min_bright 0 // минимальная яркость (0 - 255)
#define bright_constant 1010 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define AP_SSID "Mi 5" // Логин к вашему WiFi(кавычки оставить)
#define AP_PASS "22222222" // Пароль у вашему WiFi
#define TIMEZONE 6 // Часовой пояс
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //количество светодиодов в ленте
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
unsigned int localPort = 2390; // local port to listen for UDP packets
unsigned int err_count = 0;
unsigned long ntp_time = 0;
unsigned long Next_ms = 3600000;
unsigned long cur_ms = 0;
unsigned long t_cur = 0;
unsigned long ms1 = 0;
unsigned long ms2 = 10000000UL;
long t_correct = 0;
uint16_t my_s = 0;
uint16_t my_m = 0;
uint16_t my_h = 0;
bool NtpNoConn = false;
IPAddress timeServerIP;
const char *ntpServerName = "0.ru.pool.ntp.org";
const int NTP_PACKET_SIZE = 48;
byte packetBuffer[NTP_PACKET_SIZE];
WiFiUDP udp;
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
0b11000000, // Digit - 15
};
bool Dot = true;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::MediumSpringGreen; // Используемый цвет
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
//CRGB::Salmon,
CRGB::Red,
CRGB::Orchid,
CRGB::DarkOrchid};
/**
* Соединение с WiFi
*/
bool ConnectWiFi(const char *ssid, const char *pass)
{
// Три попытки соединения по WiFi
for (int i = 0; i < 3; i++)
{
Serial.print("\nConnecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
delay(1000);
// Максиммум 12 раз проверка соединения
for (int j = 0; j < 12; j++)
{
if (WiFi.status() == WL_CONNECTED)
{
Serial.print("\nWiFi connect true: ");
Serial.print(WiFi.localIP());
Serial.print("/");
Serial.print(WiFi.subnetMask());
Serial.print("/");
Serial.println(WiFi.gatewayIP());
return true;
}
delay(1000);
Serial.print(WiFi.status());
}
}
Serial.println("\nConnect WiFi failed ...");
return false;
}
unsigned long sendNTPpacket(IPAddress &address)
{
Serial.println("sending NTP packet...");
// Очистка буфера в 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Формируем строку зыпроса NTP сервера
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// Посылаем запрос на NTP сервер (123 порт)
udp.beginPacket(address, 123);
udp.write(packetBuffer, NTP_PACKET_SIZE);
udp.endPacket();
}
/**
* Посылаем и парсим запрос к NTP серверу
*/
bool GetNTP(void)
{
Serial.println("Starting UDP");
udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(udp.localPort());
WiFi.hostByName(ntpServerName, timeServerIP);
sendNTPpacket(timeServerIP);
delay(1000);
int cb = udp.parsePacket();
if (!cb)
{
Serial.println("No packet yet");
return false;
}
else
{
Serial.print("packet received, length=");
Serial.println(cb);
// Читаем пакет в буфер
udp.read(packetBuffer, NTP_PACKET_SIZE);
// 4 байта начиная с 40-го сождержат таймстамп времени - число секунд
// от 01.01.1900
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// Конвертируем два слова в переменную long
unsigned long secsSince1900 = highWord << 16 | lowWord;
// Конвертируем в UNIX-таймстамп (число секунд от 01.01.1970
const unsigned long seventyYears = 2208988800UL;
unsigned long epoch = secsSince1900 - seventyYears;
// Делаем поправку на местную тайм-зону
ntp_time = epoch + TIMEZONE * 3600;
Serial.print("Unix time = ");
Serial.println(ntp_time);
udp.flush(); //empty UDP library rxBuffer
udp.stop(); //stop client & close connection/socket
//WiFi.mode(WIFI_OFF);
}
return true;
}
//новые координаты точек
void BrightDots(boolean Dot_On)
{
for (uint8_t i = 0; i < DOTS_NUM; i++)
{
leds[(LEDS_IN_SEGMENT * 14) + i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit(uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor++;
}
}
};
//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck()
{
if (auto_bright)
{ // если включена адаптивная яркость
if (millis() - bright_timer > 100)
{ // каждые 100 мс
bright_timer = millis(); // сбросить таймер
new_bright = map(analogRead(BRI_PIN), 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);
LEDS.setBrightness(new_bright_f); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
my_h = (ntp_time / 3600) % 24;
my_m = (ntp_time / 60) % 60;
my_s = ntp_time % 60;
if (my_s % 2 == 0)
{
Dot = false;
}
else
{
Dot = true;
};
return (my_h * 100 + my_m);
};
//Меняем эффекты
void fadeall()
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon()
{
static uint8_t hue = 0;
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++)
{
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(20);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS)-1; i >= 0; i--)
{
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(20);
}
}
// Преобразуем время в массив для отображание
void TimeToArray()
{
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++)
{
int digit = Now % 10; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2)
{
cursor -= 2;
}
if ((i != 4) || (digit != 0))
BrightDigit(digits[digit], cursor);
else
BrightDigit(0, cursor);
if (i == COLOR_CHANGE)
{
if (digit != last_digit)
{
cylon(); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray()
{
if (my_s != 25)
{ //через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int celsius = bme.readTemperature(); //int t = bmp.readTemperature();
BrightDots(0); //разделительные мигающие точки выключены
if (celsius < 0)
{
BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //1й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //4й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //3й блок
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //2й блок
}
else
{
BrightDigit(0, (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //1й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //4й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //3й блок
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //2й блок
}
};
// Измеряем давление
void PressureToArray()
{
if (my_s != 30)
{ //через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int Pressure = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray()
{
if (my_s != 35)
{ //через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int humidity = bme.readHumidity(); //int h = dht.readHumidity();
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
void setup()
{
if (!ConnectWiFi(AP_SSID, AP_PASS))
{
Serial.println("Reset ESP8266 ...");
ESP.reset();
}
Serial.begin(9600);
LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
LEDS.setBrightness(3); // Задаём яркость
bme.begin(); //bmp.begin(); //датчик температуры
}
void loop()
{
cur_ms = millis();
t_cur = cur_ms / 1000;
// Каждые 24 часа считываем время в интернете
if (cur_ms < ms2 || (cur_ms - ms2) > Next_ms)
{
err_count++;
// Делаем три попытки синхронизации с интернетом
NtpNoConn = false;
if (GetNTP())
{
ms2 = cur_ms;
err_count = 0;
t_correct = ntp_time - t_cur;
NtpNoConn = true;
Next_ms = 86400000;
}
else
{
Next_ms = 60000;
} //соединяемся через минуту
}
// Каждые секунду выдаем время
if (cur_ms < ms1 || (cur_ms - ms1) > 1000)
{
ms1 = cur_ms;
ntp_time = t_cur + t_correct;
/* Serial.print("Time: ");
Serial.print(my_h);
Serial.print(":");
Serial.print(my_m);
Serial.print(":");
Serial.println(my_s);
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 133.322);
Serial.println(" mm.pt");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println(); */
}
// Если нет соединения с интернетом, перезагружаемся
if (err_count > 10)
{
Serial.println("NTP connect false");
Serial.println("Reset ESP8266 ...");
ESP.reset();
}
BrightnessCheck(); // Проверяем датчик освещения
TimeToArray(); // часы
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // если будет влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true)
delay(5000); //время показа температуры
if (PressureShow == true)
delay(5000); //время показа давления
if (HumidityShow == true)
delay(5000); //время показа влажности
}
есть подозрение, что вай-фай и ФастЛед плохо уживаются вместе. Соберите этот же код на ЕСП, но с выключенным Вайфаем - и посмотрите, сохранятся ли глюки с цветом пикселей.
Если окажется, что я прав - можно попробовать на время запуска конструкции FastLed.show() выключать WiFi
Убрал wifi, но косяки остались. Вернув значение delay в 10 в cylon мерцание стало практически незаметным(оно длиться в пределах движения "змейки" по первому сегменту, а дальше все нормально). Да и разные оттенки через рассеиватель, наверное, будет не заметны. Один раз разные оттенки проскочили в таком виде
#define FASTLED_ESP8266_RAW_PIN_ORDER
#define FASTLED_ALLOW_INTERRUPTS 0
#include <Adafruit_BME280.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 2 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2 // Задаём количество разделительных точек
#define COLOR_CHANGE 1 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN D6 // подключение ленты
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //количество светодиодов в ленте
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
unsigned long cur_ms = 0;
unsigned long t_cur = 0;
unsigned long ms1 = 0;
uint16_t my_s = 0;
uint16_t my_m = 0;
uint16_t my_h = 0;
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
0b11000000, // Digit - 15
};
bool Dot = true;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::MediumSpringGreen; // Используемый цвет
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
//CRGB::Salmon,
CRGB::Red,
CRGB::Orchid,
CRGB::DarkOrchid};
//новые координаты точек
void BrightDots(boolean Dot_On)
{
for (uint8_t i = 0; i < DOTS_NUM; i++)
{
leds[(LEDS_IN_SEGMENT * 14) + i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit(uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor++;
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
if (my_s % 2 == 0)
{
Dot = false;
}
else
{
Dot = true;
};
return (my_h * 100 + my_m);
};
//Меняем эффекты
void fadeall()
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon()
{
static uint8_t hue = 0;
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++)
{
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
fadeall();
FastLED.show();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS)-1; i >= 0; i--)
{
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
fadeall();
FastLED.show();
// Ждём немного и повторяем цикл
delay(10);
}
}
// Преобразуем время в массив для отображание
void TimeToArray()
{
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++)
{
int digit = Now % 10; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2)
{
cursor -= 2;
}
if ((i != 4) || (digit != 0))
BrightDigit(digits[digit], cursor);
else
BrightDigit(0, cursor);
if (i == COLOR_CHANGE)
{
if (digit != last_digit)
{
cylon(); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray()
{
if (my_s != 25)
{ //через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int celsius = bme.readTemperature(); //int t = bmp.readTemperature();
BrightDots(0); //разделительные мигающие точки выключены
if (celsius < 0)
{
BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //1й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //4й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //3й блок
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //2й блок
}
else
{
BrightDigit(0, (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //1й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //4й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //3й блок
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //2й блок
}
};
// Измеряем давление
void PressureToArray()
{
if (my_s != 30)
{ //через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int Pressure = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray()
{
if (my_s != 35)
{ //через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int humidity = bme.readHumidity(); //int h = dht.readHumidity();
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
void setup()
{
Serial.begin(9600);
LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
LEDS.setBrightness(5); // Задаём яркость
bme.begin(); //bmp.begin(); //датчик температуры
}
void loop()
{
cur_ms = millis();
t_cur = cur_ms / 1000;
// Каждые секунду выдаем время
if (cur_ms < ms1 || (cur_ms - ms1) > 1000)
{
ms1 = cur_ms;
my_s++;
if (my_s > 59)
{
my_s = 0;
my_m++;
}
if (my_m > 59)
{
my_m = 0;
}
Serial.print("Time: ");
Serial.print(my_h);
Serial.print(":");
Serial.print(my_m);
Serial.print(":");
Serial.println(my_s);
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 133.322);
Serial.println(" mm.pt");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
TimeToArray(); // часы
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // если будет влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true)
delay(5000); //время показа температуры
if (PressureShow == true)
delay(5000); //время показа давления
if (HumidityShow == true)
delay(5000); //время показа влажности
}
Всем доброго времени. Уведомления одолели, заглянул а тут такое)))))))) b707 надеюсь вы принимаете на свой счет все благодарности которые почему то пишут мне. Большое вам спасибо за помощь в этом проекте. Который так не плохо начал развиваться. Уже делают с ESP и WiFi. Может стоит к концу года собрать все это вместе и сделать мега проект в котором будет собрано это все ну и во избежание конфликтов часть закомментированно. Кто что захочет, тот то и включит. Вот комерсам -то будет радости.((((((
В общем 01:20 на часах. Сижу ломаю голову над своими домашними часами. Надоел один глюк который никак не уходит. При слишком ярком освещении, индикация тоже становится яркой и...... часы зависают. Первый блок как то меняется в зависимости от того что там появляется время, Р или температура. А вот оставшиеся 3 блока зависли на последних значениях которые показывали. Одно время помогала перезагрузка. Теперь и она слабо помогает. При повторном включении загорается первый блок индикации и работает. В остальных блоках чернота. Спустя минут 5-10 остальные блоки оживают, до очередной засветки. Есть идея (которую уже озвучивали здесь), что все таки всей ленте не хватает питания, хотя блок на 5В 5А. Завтра попробую ко второму концу припаять питание. При чем на работе таких глюков ниразу не было. А может сказывается разница количества светодиодов 86 и 114. Может дуня не тянет. БП стоят одинаковые.
По BME280. Температуру он показывает слегка не корректно. Стоят часы и метеорологический психометр 1986 г.в. (в те времена ещё делали качественные вещи). На часах +25, на психометре +22,3. Разница 2.5 градуса. Завтра Сделаю тест на влажность, сравню с ВМЕ.
P.S. Продолжение. В ночном режиме часы светятся довольно ярко и как бы для спальни не подходят. Начал ковырять снова. Модуль фоторезистора с 3 пинами работает только в цифре и поэтому сигнал только вкл/выкл. Заменил на сенсорный модуль для arduino 4pin DIY Kit там есть контакт А0, теперь значения реально меняются в зависимости от освещения: тусклее, ярче или вообще минимум. Но, проблема яркости на минимуме осталась. Ярко. Посмотрел код ShevaLoL , у него в коде строка 121 идет
С чем чёрт не шутит, поставил его строку себе. И о чудо, яркость упала в минимум, еле видно. НО... значения инвертировались. Минимум при ярком освещении, в темноте можно освещать двор. Не подходит. Игрался со значениями
менял их местами, менял полярность фотоэлемента (а вдруг))))). Подскажите, что ещё можно изменить, чтобы фоторезистор отрабатывал правильно и диоды ночью горели в минимуме?
Подскажите, что ещё можно изменить, чтобы фоторезистор отрабатывал правильно и диоды ночью горели в минимуме?
если нужно полностью инвертировать. то это очень просто - последнюю строчку настройки яркости запишите как
LEDS.setBrightness(255-new_bright_f);
Но не понятно, почему вам потребовалась инверсия.... Похоже, что-то тут не так.
Не получается ((( Инверсия. В темноте ярко, на свету тускло, но опять не в минимум. Ничего не понимаю. А всё началось с того что яркость в темноте довольно высокая и решил разобраться почему при минимальном значении яркости min=0 светит как будто на 100
#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 4 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2 // Задаём количество разделительных точек
#define COLOR_CHANGE 3 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
#define BRI_PIN A0 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230 // максимальная яркость (0 - 255)
#define min_bright 0 // минимальная яркость (0 - 255)
#define bright_constant 1010 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
//BMP280 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //114 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //114 количество светодиодов в ленте
//#define DOT1 (LEDS_IN_SEGMENT * 14) // координаты мигающих точек
//#define DOT2 (LEDS_IN_SEGMENT * 14 + 1) // координаты мигающих точек
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
};
bool Dot = true;
bool DST = false;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
//CRGB::Salmon,
CRGB::Red,
CRGB::Orchid,
CRGB::DarkOrchid
};
void setup() {
Serial.begin(9600);
//Wire.begin();//Для BMP
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
bme.begin(); //bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit (uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor ++;
}
}
}
//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
int brightness = 0; // уставливаем начально значение яркости YJDJT0
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(BRI_PIN), 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 = new_bright_f * coef - new_bright * (1 - coef); // 300*0.9-300*(1-0.9)
LEDS.setBrightness(new_bright_f); // установить новую яркость
//LEDS.setBrightness(255-new_bright_f); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущегO времени и его хранение
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
if (second % 2 == 0)
{
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minute);
};
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времениd
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
//cursor -= 2;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 25) { //через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int t = bme.readTemperature(); //int t = bmp.readTemperature();
int celsius = t;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блокn
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символаo
};
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int p = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
// Pressure /= 10;
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 )); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM )); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) { //через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int h = bme.readHumidity(); //int h = dht.readHumidity();
int humidity = h;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(100);//время реакции на нажатие
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(100);//время реакции на нажатие
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);
}
}
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
void loop()
{
BrightnessCheck(); // Проверяем датчик освещения
DSTcheck(); // Проверяем цветовые режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000); //время показа температуры
if (PressureShow == true) delay (5000);//время показа давления
if (HumidityShow == true) delay (5000);//время показа влажности
/*/
int brightness = analogRead(BRI_PIN);
// Получение тестовых значений
// Выодим на монитор полученное значение
Serial.print("brightness = "); // Название значения для наглядного представления
Serial.println(brightness); // Выводим значение и используем вызов println, те переноса строки
delay(1000);
*/
/*/
//вывод информации в сом порт
// Раскоментировать если нужно посмотреть в сом порте, подтормаживает вся система если это открыто
Serial.print("Tемпература = ");
Serial.print(bme.readTemperature()); //Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bme.readPressure() / 133.322); //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
Serial.println();
delay(8000);
Serial.println (" *Arduino.ru.* "); //
*/
}
Вот если делать как я написал выше в уравнении поставить + то подсветка гаснет идеально до минимума который выставлен, но инверсия. А если добавить ваше предложение, то либо инверсия в неполный минимум со знаком +, либо нормально в неполный минимум со знаком -
OdinochkA - в программировании чудеса редки. ищите ошибки. Если Ваш сенсор осыещенности выдает БОЛЬШИЕ значения при более ярком свете, а не наоборот - инверсии тут взяться просто неоткуда.
Надо провести "отладку" кода и найти, где возникает ошибка. Я бы на Вашем месте действовал так - сначала подключил бы датчик освещения к отдельной ардуине, загрузил простенький код, который выводит значения освещения в Сериал - и посмотрел, какие цифры выдает датчик в темноте, в сумерках и на ярком свету.
Потом подставил бы полученные цифры в формулу из скетча, вручную посчитал значения настроек яркости для разных случаев - и подставил бы, к примеру, цифру яркости часов для сумерек в строчку
LEDS.setBrightness(new_bright_f);
чтобы убедится. что яркость свечения часов такая как надо. Потом так же с цифрой для ркого света и тд
22:01:23.084 -> brightness = 373---------->> лампа выключена, но светло
22:01:24.103 -> brightness = 385
22:01:25.088 -> brightness = 382
22:01:26.107 -> brightness = 387
22:01:27.091 -> brightness = 416
22:01:28.110 -> brightness = 427
22:01:29.093 -> brightness = 753---------->> фоторезистор в темноте
22:01:30.111 -> brightness = 753
22:01:31.095 -> brightness = 754
22:01:32.111 -> brightness = 754
22:01:33.096 -> brightness = 756
22:01:34.082 -> brightness = 758
/*
Управление яркостью в зависимости от освещенности.
*/
// Определение директивы для PWM пина №6, на который заведен светодиод
#define LED_PIN 6
// Определение директивы для аналогового пина №0(A0), на котором находится фоторезистор
#define LDR_PIN A0
// Значения с аналогового выхода A0. Подбираются эксперементально и зависят от степени освещенности,
// типа фоторезистора и резистора R2, учавствующего в делителе напряжения.
int MAX_BRIGHTNESS = 400; // Значение при вашей максимальной освещенности
int MIN_BRIGHTNESS = 200; // Значение при вашей минимальной освещенности.
void setup()
{
// Инициируем последовательное соединение и задает скорость передачи данных в бит/c
Serial.begin(9600);
// Инициализируем ШИМ пин №6 как выход
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
// Получаем значение с аналогового входа A0
int brightness = analogRead(LDR_PIN);
// Получение тестовых значений
// Выодим на монитор полученное значение
Serial.print("brightness = "); // Название значения для наглядного представления
Serial.println(brightness); // Выводим значение и используем вызов println, те переноса строки
delay(1000);
// Выставляем границы в соответствии с границами значений освещенности, полученными эксперементально ранее.
// Функция constrain проверяет значение(brightness) и если надо задает новое,
//так чтобы оно была в области допустимых значений, заданной параметрами(MIN_BRIGHTNESS, MAX_BRIGHTNESS)
brightness = constrain(brightness,MIN_BRIGHTNESS,MAX_BRIGHTNESS);
// Распределяем полученное значение от 255 до 0, те при минимальной освещенности наш
//светодиод будет светится ярче и наоборот, при максимальной будет выключаться.
int ldr_value = map(brightness, MIN_BRIGHTNESS, MAX_BRIGHTNESS, 255, 0);
// и выводим его на используемый нами ШИМ выход
analogWrite(LED_PIN, ldr_value);
}
#define max_bright 255 // максимальная яркость (0 - 255)
#define min_bright 5 // минимальная яркость (0 - 255)
#define bright_constant 510 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
И судя по опытам весь затык был в константе. При увеличении выше этого значения, по крайней мере у меня, начинались скачки светимости при достижении крайних точек. ПОследний код
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////OdinochkA)))
*/
#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 4 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2 // Задаём количество разделительных точек
#define COLOR_CHANGE 3 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
#define BRI_PIN A0 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 255 // максимальная яркость (0 - 255)
#define min_bright 5 // минимальная яркость (0 - 255)
#define bright_constant 510 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
//BMP280 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //114 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //114 количество светодиодов в ленте
//#define DOT1 (LEDS_IN_SEGMENT * 14) // координаты мигающих точек
//#define DOT2 (LEDS_IN_SEGMENT * 14 + 1) // координаты мигающих точек
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
};
bool Dot = true;
bool DST = false;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
//CRGB::Salmon,
CRGB::Red,
CRGB::Orchid,
CRGB::DarkOrchid
};
void setup() {
Serial.begin(9600);
//Wire.begin();//Для BMP
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
bme.begin(); //bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit (uint8_t digit, uint8_t cursor)
{
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
{
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
{
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor ++;
}
}
}
//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(BRI_PIN), 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 = new_bright_f * coef - new_bright * (1 - coef); // 300*0.9-300*(1-0.9)
LEDS.setBrightness(new_bright_f); // установить новую яркость
//LEDS.setBrightness(255-new_bright_f); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущегO времени и его хранение
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
if (second % 2 == 0)
{
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minute);
};
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времениd
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
//cursor -= 2;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 25) { //через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int t = bme.readTemperature(); //int t = bmp.readTemperature();
int celsius = t;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блокn
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символаo
};
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int p = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
// Pressure /= 10;
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 )); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM )); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) { //через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int h = bme.readHumidity(); //int h = dht.readHumidity();
int humidity = h;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(100);//время реакции на нажатие
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(100);//время реакции на нажатие
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);
}
}
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
void loop()
{
BrightnessCheck(); // Проверяем датчик освещения
DSTcheck(); // Проверяем цветовые режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000); //время показа температуры
if (PressureShow == true) delay (5000);//время показа давления
if (HumidityShow == true) delay (5000);//время показа влажности
/*/
//вывод на монитор данных по освещённости
int brightness = analogRead(BRI_PIN);
// Получение тестовых значений
// Выодим на монитор полученное значение
Serial.print("brightness = "); // Название значения для наглядного представления
Serial.println(brightness); // Выводим значение и используем вызов println, те переноса строки
delay(1000);
*/
/*/
//вывод информации в монитор порта
// Раскоментировать если нужно посмотреть в сом порте, подтормаживает вся система если это открыто
Serial.print("Tемпература = ");
Serial.print(bme.readTemperature()); //Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bme.readPressure() / 133.322); //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
Serial.println();
delay(8000);
Serial.println (" *Arduino.ru.* "); //
*/
}
Боюсь, этот код тоже неправильный и проблему вы не решили, только замаскировали.
Код в процедуре автоподстройки яркости - рассчитан на прямую зависимость цифр с датчика от освещения - чем больше света, тем больше цифра. А судя по вашим тестам, на вашем датчике зависимость обратная.
В процедуре map мин и макс надо поменять местами, да и значение константы 510 к вашим данным не подходит совсем
Dj-toha, в этом коде нет плавной настройки, тут только две яркости
На самом деле, у Одиночка проблема не в коде, а похоже в непнимании логики работы автояркости. У него сейчас есть все данные для правильной настройки, их только надо верно использовать
Dj-toha, в этом коде нет плавной настройки, тут только две яркости На самом деле, у Одиночка проблема не в коде, а похоже в непнимании логики работы автояркости. У него сейчас есть все данные для правильной настройки, их только надо верно использовать
Принцип я понимаю. Фоторезистор это как переменный резистор, чем больше света, тем больше сопротивление, и значит тусклее горит лампочка, в нашем случае лента. А то что резистор работает в обратную сторону, я с ним ничего не сделаю. Если только в коде указывать данные, чтобы это учитывать. А вот что я действительно не могу понять в коде (помимо того что я в нём ничего не понимаю) так это строку
Ещё раз извеняюсь код работает но правильно показуют только первые два индикатора.
Хотелка чтоб и давление и температура и влажность была
а где вы его взяли?
Может, тогда стоит воспользоваться советом Одиночки и взять код из сообщения 303 - он проверенный
кодом поделился dj_tocha
извиняюсь за панику не видел кода в 303 посте :)
Часы висят на темной стене, пробел не так заметен.
Пока хочу хотябы один датчик на улицу. Здесь вместо "С" минус, переместил вначало(Это все что я пока умею).
как в ущерб символа "С" показывать отрицательную температуру ? что б на улице часы прикрутить можно было ? код из 303 поста
при использовании датчика BME280 есть возможность использования часов на Улице , как потушить символ"С" и заставить показывать отрицательную температуру (если на улице минусовая температура)?
понимаю что здесь надо задать символ
но как сдвинуть показания температуры на один символ вправо?
и задать условие индикации этого минуса при отрицательных значениях градусов ?
две страницы монолога , класс :(
спс
две страницы монолога , класс :(
за это время давно могли бы разобраться в коде, чтобы сдвинуть цифры. А вопрос про вывод минуса меня просто умиляет :)
Расчитывал на помощь получил ничего:( обидно
и задать условие индикации этого минуса при отрицательных значениях градусов ?
а что, вот такое самому в голову не пришло?
if ( температура < 0) {
// показать минус
}
а что, вот такое самому в голову не пришло?
if ( температура < 0) {
// показать минус
}
Ты чо, это ж Откровения Святого Кернигана, он их не читал еще.
Дед Семён я не для стеба на форум пришёл, а за помощью
помощь - это обучение программированию страждущих в трёх постах? Или выдача готового кода на блюдечке?
Не. Это русский форум, осмысленный, но беспощадный, тут не дают ни знаний, ни готового, а пробуют пробудить мосх вопрошающего к желанию учиться и, самаглавна, думать.
Понятно
а сообщение #364 понятно?
Да в строчке написано условие что если temp меньше 0 то выводим знак минуса ,как прописать координаты светодиодов которые зажигать для этого условия?
И что, скажете вы сами не могли до этого додуматься ПОЛТОРА МЕСЯЦА?
Честно говоря. у меня только два предположения - либо вы непроходимо глупы и лишены элементарной логики, дибо совершенно не хотите думать, а ждете готового решения. В обоих случаях никакого желания помогать вам не возникает, простите.
dgeka - если вы отмотаете ветку назад. вы увидите, что я довольно охотно помогаю с этими часами тем, кто спрашивает. Но при одном условии - если люди пытаются что-то сделать САМИ.
Я не утверждаю что я программист , просьба лишь о том что бы ткнули носом где рыть ,и я не в коем случае не хочу кого-то обидеть
выввод температуры - процедура TempToArray() , строка 190 кода сообщения #303. Какой знак куда выводится - там почти в каждой строчке есть комментарии
СПС буду дальше глумиться над кодом
Здравствуйте. Прошу помощи. Помогите пожалуйста отредактировать код, чтобы он выводил на часы данные по температуре и влажности с датчика DHT22.
Вот код который использую:
Буду благодарен за исправление кода.
Буду благодарен за исправление кода.
не будете, ибо никто за вас код править не будет. На этом форуме помогают тем, кто пытается что-то делать сам.
В ветке достаточно примеров работы на самых разных датчиках - DHT BME BMP - посмотрите внимательно и адаптируйте эти примеры под свой датчик.
ShevaLoL а в чем собственно проблема у вас в коде закоментирован пример для DHT11 поменяйте на 22 появится температура. добавьте чтение и вывод влажности будет влажность.
Буду благодарен за исправление кода.
не будете, ибо никто за вас код править не будет. На этом форуме помогают тем, кто пытается что-то делать сам.
В ветке достаточно примеров работы на самых разных датчиках - DHT BME BMP - посмотрите внимательно и адаптируйте эти примеры под свой датчик.
Ок, спасибо за ответ.
ShevaLoL а в чем собственно проблема у вас в коде закоментирован пример для DHT11 поменяйте на 22 появится температура. добавьте чтение и вывод влажности будет влажность.
Ок, щас буду пробовать ковырять код.
Запустил часы на esp8266, но появились некоторые косяки. При переключении на показал температуры/давления/влажности светодиоды через один меняют свой оттенок. Это может произойти как во всех 3 вариантах либо вообще не появиться. Также при запуске анимации смены цвета несколько светодиодов 1го сегмента начинают мерцать. Есть ли такое на ардуино или это "фишки" esp?
есть подозрение, что вай-фай и ФастЛед плохо уживаются вместе. Соберите этот же код на ЕСП, но с выключенным Вайфаем - и посмотрите, сохранятся ли глюки с цветом пикселей.
Если окажется, что я прав - можно попробовать на время запуска конструкции FastLed.show() выключать WiFi
Insert #define FASTLED_ALLOW_INTERRUPTS 0 before the #include <FastLED.h>
Поковырялся, разобрался, получилось)))) Показывает влажность и температуру с датчика DHT22.
Вот рабочий код:
Спасибо большое b707, dj-toxa за наводки. А OdinochkA за твои труды (взял твой код для переделки).
Убрал wifi, но косяки остались. Вернув значение delay в 10 в cylon мерцание стало практически незаметным(оно длиться в пределах движения "змейки" по первому сегменту, а дальше все нормально). Да и разные оттенки через рассеиватель, наверное, будет не заметны. Один раз разные оттенки проскочили в таком виде
Всем доброго времени. Уведомления одолели, заглянул а тут такое)))))))) b707 надеюсь вы принимаете на свой счет все благодарности которые почему то пишут мне. Большое вам спасибо за помощь в этом проекте. Который так не плохо начал развиваться. Уже делают с ESP и WiFi. Может стоит к концу года собрать все это вместе и сделать мега проект в котором будет собрано это все ну и во избежание конфликтов часть закомментированно. Кто что захочет, тот то и включит. Вот комерсам -то будет радости.((((((
В общем 01:20 на часах. Сижу ломаю голову над своими домашними часами. Надоел один глюк который никак не уходит. При слишком ярком освещении, индикация тоже становится яркой и...... часы зависают. Первый блок как то меняется в зависимости от того что там появляется время, Р или температура. А вот оставшиеся 3 блока зависли на последних значениях которые показывали. Одно время помогала перезагрузка. Теперь и она слабо помогает. При повторном включении загорается первый блок индикации и работает. В остальных блоках чернота. Спустя минут 5-10 остальные блоки оживают, до очередной засветки. Есть идея (которую уже озвучивали здесь), что все таки всей ленте не хватает питания, хотя блок на 5В 5А. Завтра попробую ко второму концу припаять питание. При чем на работе таких глюков ниразу не было. А может сказывается разница количества светодиодов 86 и 114. Может дуня не тянет. БП стоят одинаковые.
По BME280. Температуру он показывает слегка не корректно. Стоят часы и метеорологический психометр 1986 г.в. (в те времена ещё делали качественные вещи). На часах +25, на психометре +22,3. Разница 2.5 градуса. Завтра Сделаю тест на влажность, сравню с ВМЕ.
P.S. Продолжение. В ночном режиме часы светятся довольно ярко и как бы для спальни не подходят. Начал ковырять снова. Модуль фоторезистора с 3 пинами работает только в цифре и поэтому сигнал только вкл/выкл. Заменил на сенсорный модуль для arduino 4pin DIY Kit там есть контакт А0, теперь значения реально меняются в зависимости от освещения: тусклее, ярче или вообще минимум. Но, проблема яркости на минимуме осталась. Ярко. Посмотрел код ShevaLoL , у него в коде строка 121 идет
в моём же случае
С чем чёрт не шутит, поставил его строку себе. И о чудо, яркость упала в минимум, еле видно. НО... значения инвертировались. Минимум при ярком освещении, в темноте можно освещать двор. Не подходит. Игрался со значениями
менял их местами, менял полярность фотоэлемента (а вдруг))))). Подскажите, что ещё можно изменить, чтобы фоторезистор отрабатывал правильно и диоды ночью горели в минимуме?
Подскажите, что ещё можно изменить, чтобы фоторезистор отрабатывал правильно и диоды ночью горели в минимуме?
если нужно полностью инвертировать. то это очень просто - последнюю строчку настройки яркости запишите как
Но не понятно, почему вам потребовалась инверсия.... Похоже, что-то тут не так.
Подскажите, что ещё можно изменить, чтобы фоторезистор отрабатывал правильно и диоды ночью горели в минимуме?
если нужно полностью инвертировать. то это очень просто - последнюю строчку настройки яркости запишите как
Но не понятно, почему вам потребовалась инверсия.... Похоже, что-то тут не так.
Не получается ((( Инверсия. В темноте ярко, на свету тускло, но опять не в минимум. Ничего не понимаю. А всё началось с того что яркость в темноте довольно высокая и решил разобраться почему при минимальном значении яркости min=0 светит как будто на 100
Вот если делать как я написал выше в уравнении поставить + то подсветка гаснет идеально до минимума который выставлен, но инверсия. А если добавить ваше предложение, то либо инверсия в неполный минимум со знаком +, либо нормально в неполный минимум со знаком -
OdinochkA - в программировании чудеса редки. ищите ошибки. Если Ваш сенсор осыещенности выдает БОЛЬШИЕ значения при более ярком свете, а не наоборот - инверсии тут взяться просто неоткуда.
Надо провести "отладку" кода и найти, где возникает ошибка. Я бы на Вашем месте действовал так - сначала подключил бы датчик освещения к отдельной ардуине, загрузил простенький код, который выводит значения освещения в Сериал - и посмотрел, какие цифры выдает датчик в темноте, в сумерках и на ярком свету.
Потом подставил бы полученные цифры в формулу из скетча, вручную посчитал значения настроек яркости для разных случаев - и подставил бы, к примеру, цифру яркости часов для сумерек в строчку
чтобы убедится. что яркость свечения часов такая как надо. Потом так же с цифрой для ркого света и тд
вот такая проверка
Вроде правильно при засвете мало при затемнении большее значение , аж интересно :)
Фотодатчик модулем ?
Да. На али брал с 4мя пинами
У мну такойже работает адекватно скетч из 303 поста.
Всё. Вроде работает.. Поставил так:
И судя по опытам весь затык был в константе. При увеличении выше этого значения, по крайней мере у меня, начинались скачки светимости при достижении крайних точек. ПОследний код
Боюсь, этот код тоже неправильный и проблему вы не решили, только замаскировали.
Код в процедуре автоподстройки яркости - рассчитан на прямую зависимость цифр с датчика от освещения - чем больше света, тем больше цифра. А судя по вашим тестам, на вашем датчике зависимость обратная.
В процедуре map мин и макс надо поменять местами, да и значение константы 510 к вашим данным не подходит совсем
глянь вот в этом скетче, одна из старых разновидностей нашего =) тут на аналоге яркость вроде считывается а не на цифре
Dj-toha, в этом коде нет плавной настройки, тут только две яркости
На самом деле, у Одиночка проблема не в коде, а похоже в непнимании логики работы автояркости. У него сейчас есть все данные для правильной настройки, их только надо верно использовать
Принцип я понимаю. Фоторезистор это как переменный резистор, чем больше света, тем больше сопротивление, и значит тусклее горит лампочка, в нашем случае лента. А то что резистор работает в обратную сторону, я с ним ничего не сделаю. Если только в коде указывать данные, чтобы это учитывать. А вот что я действительно не могу понять в коде (помимо того что я в нём ничего не понимаю) так это строку
new_bright_f = new_bright_f * coef - new_bright * (1 - coef);
как для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент?? Не тут ли ошибка?
МЕстами поменял в МАРе, но картинку увижу только вечером.
Если резистор работает в обратную сторону - он может стоять не в том плече.