да хз какое сечение) на входе провода с комплекта толстые, остальное провода с магнитофона, но все же думаю на источник
Если в комплекте такие, как и у меня, то там толстая изоляция, а провод - г-но.
Симптом (погорели которые вначале) показателен, наводит на мысли о сильном падении напряжения в цепи, что может привести к непонятным глюкам на последующих, дальних участках. Рекомендовал бы бросить питание к каждому отрезку отдельно.
На 30 светодиодов двойное питание? А смысл. Теперь блок питания нормальный. И так потянет. Это первый блок на 1а гнал, вот и погорели. У меня на 3а стоит и 114 диодов(тьфу-тьфу-тьфу) и работает уже 3ю неделю
На 30 светодиодов двойное питание? А смысл. Теперь блок питания нормальный. И так потянет. Это первый блок на 1а гнал, вот и погорели. У меня на 3а стоит и 114 диодов(тьфу-тьфу-тьфу) и работает уже 3ю неделю
Так зажгите их белым и померьте напряжение в начале и конце ленты. Повторяю, 30 светодиодов, это 1,8А в максимуме. Це, ИМХО.
И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
3 цвета хавают по 20 милиампер белый все 60, так что если стоит смена цвета то поставь только красынй синий и зеленый, что б не было оттенков да бы не было перегревов, а то малоли часы как у меня загнуться, сейчас ппц как обидно, жду новую ленту( а дуину и все ост вывел на заднюю часть корпуса (через фанеру)дабы ленту схема и не видела, температура была норм но все же завышает этот датчик на 2 град, не знаю можно ли как то откалибровать
вывод температуры с RTC это было временное решение, пока не было нормального датчика температуры, хотя у меня до сих пор первые часы работают так и нормально показывают температуру. единственное что пришлось внести небольшую корректировку на пару градусов, так как слегка завышали. ведь температуру они меряют не воздуха, а самой микросхмемы. а она греется чуть больше комнатной температуры.
Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =)
Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =)
Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри. Датчики освещения и температуры вынесены наружу и обособлены от внешнего воздействия. Но не знание кода вносит свои коррективы. ПОэтому датчик температуры висит в одной стороне, а измерения приходят с другой стороны. (( Даже на рабочем варианте (в смысле на работе), стоит BMP180 и вынесен он за корпус где на него не попадает свет и пыль. Но пока что он просто для декора ((( В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе
Продолжаю взрывать мозг попыткой собрать код под BMP180. Собрал кучу примеров и скетчей и пытаюсь из кусков собрать рабочее. Вроде накидал и скетч скомпилировался. НО меня смущает строка int t = RTC.temperature(); вроде как она говорит что значение t брать из часов, но мне то надо чтобы из ВМР бралось. В библиотеке ADAFRUIT_BMP085 я не понял где посмотреть. Да и примера кардинально отличаются от нашего способа вывода данных.
Вопрос: я правильно пытаюсь сделать или всё это вообще никуда не годится?
P.S.извиняюсь за кучу коментариев в коде, вставлял вырезал перебирал подбирал сравнивал
// Преобразуем Temp в массив для отображение
/*/
void TempToArray() {
///* tmElements_t tm;
RTC.read(tm);
if (tm.Second != 27) {
TempShow = false;
return;
}
TempShow = true;
int t = RTC.temperature();
int celsius = (t / 4.0);
//инициализация датчика DHT11
// 1 DHT dht;
// dht.begin(); // запускаем датчик DHT11
//Serial.println("DHTxx test!"); // пишем один раз
//delay(2000);
// Задержка 2 секунды между измерениями
//2 float h = dht.readHumidity();
//Считываем влажность
//3 float t = dht.readTemperature();
// Считываем температуру
int celsius = dht.temperature;
*/
/*/{
TempShow = false;
return;
}
*/
// Функция вывода температуры
void TempToArray(){
bmp.begin();
float readTemperature(void);
int t = RTC.temperature();
int celsius = (t / 4.0);
/*/ bmp.getTemperature();
if(bmp.getTempCByIndex(0)<0){
int celsius = (bmp.getTempCByIndex(0)*(-1));
// Serial.println(celsius);
*/
{
BrightDots(0);
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
int digit = celsius % 10;// int digit = celsius % 10; int digit = t % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));
};
};
Продолжаю взрывать мозг попыткой собрать код под BMP180.
не нужно сразу пытаться получить готовый рабочий код, тем более собирая его из разных источников и пытаясь всё это объеденить. для этого есть монитор порта и Serial.print выведи необходимое, для начала туда. а потом уже будешь думать как полученное вывести на часах.
Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри.
не согласен с чем? что можно сказать, приклеил RTC к ленте? =) конструкция продуманна??? всё основное внутри....что именно лента и дуня =) эм.. освещение и термо вынесены наружу, при том что датчик с одной стороны, а измерения с другой, BMP180 вынесен за корпус где на него не попадает свет и пыль (так и внутри часов с ним будет так же всё в порядке) и это по вашему продуманная конструкция?
OdinochkA пишет:
В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе
в моём же случае температура есть нечто среднее между реальностью и рабочей температурой микросхемы, которая как правило составляет +2 гадуса при комнатной температуре. да лабараторная точность мне нужна и кроме того я уже писал, что температура с RTC-ки была добавлена в первые версии скетча, когда не было еще просто в наличии ни каких других датчиков температуры, а часы уже были собраны и люди пытающиеся повторить данный проект, очень просили добавить температуру, которую на тот момент было просто не от куда брать, кроме как с RTC
Для чего так много из одного в другое, и как можно обойтись без первых двух строк Чтобы от них не зависела третья строка с выводом данных на матрицу? Вроде собрал код но отсылка на RTC все сбивает. Без двух строк не хочет работать третья и последующие на которую идёт digit. Я так понимаю, что достаточно изменить переменную привязки t к RTC и этого будет достаточно.
int t = RTC.temperature(); - чтение данных с температурного датчика. Это значение не в градусах, а в четвертях градуса, поэтому чтобы перевести его в градусы. нужна вторая строчка - поделить на 4:
int celsius = (t / 4.0);
Ну а дальше начинается разбиение градусов на цифры, Например, если у вас 24 градуса, строка
int digit = celsius % 10;.
даст остаток от деления на 10 - то есть цифру 4. Потом вы повторите этот трюк и получите цифру 2. Точно так же в процедуре работы со временем у вас из часов и минут делаются 4 цифры для вывода на экран.
Спасибо за разъяснения. Не уверен, что через N-ое время смогу вспомнить об этом, но сейчас я понял что к чему.
В общем всеми правдами и не правдами. Я собрал свою солянку. Нашел ещё несколько интересных проектов и кое что поменял у себя. Изменение яркости теперь плавное. Проверял на закрытие пальцем поэтому точных данных нет, надо дождаться сумрака. Но на данный момент моргаликов при закрытии открытии нету.
Самое главное, температура теперь берётся из BMP180 и она точная))) Может в последствии перейду на DHT11 ( а то для работы сильно жирно BMP датчик ставить).
Скетч загружен, время идёт, температура показывается, цвета меняются кнопками. Я доволен. Если вруг ещё чего нибудь прикрутится буду только рад. Спасибо всем помогавшим и критиковавшим (bwn, dj-toxa, b707, GennOk) Вы двигали мой прогресс.
Фото рабочих часов на предыдущих страницах. Вечером добью домашние и сделаю фото.
//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 3 // Задаём сколько у нас светодиодов в сегменте.
#define COLOR_CHANGE 3 // ( 0 - NEVER, 1 - once a minute, 2 - every 10 min, 3 - hourly, 4 - every 10 hrs)
#define NUM_COLORS 16
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150
//#define BRI_PIN 3 // Вывод сенсора
#define BRI_PIN A6 // фоторезистор А3
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230 // максимальная яркость (0 - 255)
#define min_bright 1 // минимальная яркость (0 - 255)
#define bright_constant 1000 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BMP085 bmp;
//SFE_BMP180 bmp;
//BMP180 PINS
//SCL -> SCL or A5
//SDA -> SDA or A4
//DS3231 PINS
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)
#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 *0
0b00011110, // Digit C
0b01111100, // Digit P
};
bool Dot = true;
bool DST = false; // DCT false
bool TempShow = 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);
bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
void BrightDots (boolean Dot_On) {
leds[DOT1] = (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()
{
const byte sensorPin = 6;
//const byte brightnessLow = 50;
//const byte brightnessHigh = 255;
int sensorValue = analogRead(sensorPin);
Serial.print("Освещение: ");
Serial.println(sensorValue);
sensorValue = map(sensorValue, 255, 0, 10, 254);
LEDS.setBrightness(sensorValue);
// if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
// else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// НОвый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(6), 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()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
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; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
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;
};
};
// Функция вывода температуры
/*/
//Пример на DHT11
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 17) {
TempShow = false;
return; }
TempShow = true;
int t = dht.readTemperature();
int celsius = t * 100;
//далее разбивка на светодиоды, можно взять ниже
*/
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
//bmp.begin();
RTC.read(tm);
if (tm.Second != 27) {
TempShow = false;
return;
}
TempShow = true;
int t = bmp.readTemperature();
int celsius = t;
BrightDots(0);
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));
};
/*/
//Функция вывода влажности
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 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;
};
};
*/
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(500);
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
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);
}
}
//Меняем эффекты
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();
//HumidityToArray(); //если будет влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000);
Serial.print("T=");
Serial.print(bmp.readTemperature());
Serial.println("*C");
//Serial.println();
//delay(5000);
}
Снимаю свой вопрос. ))) В сом порту я привел их к мм рт.ст., а тут забыл перевести. Они показывали в Паскалях)) вот и шла каша.
Новый код с выводом Давления
//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 3 // Задаём сколько у нас светодиодов в сегменте.
#define COLOR_CHANGE 3 // ( 0 - NEVER, 1 - once a minute, 2 - every 10 min, 3 - hourly, 4 - every 10 hrs)
#define NUM_COLORS 16
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150
//#define BRI_PIN 3 // Вывод сенсора
#define BRI_PIN A3 // PIN фоторезистора
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230 // максимальная яркость (0 - 255)
#define min_bright 1 // минимальная яркость (0 - 255)
#define bright_constant 1000 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BMP085 bmp;
//SFE_BMP180 bmp;
//BMP180 PINS
//SCL -> SCL or A5
//SDA -> SDA or A4
//DS3231 PINS
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //86 количество светодиодов в ленте
#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; // DCT false
bool TempShow = true;
bool PressureShow = 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);
bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
void BrightDots (boolean Dot_On) {
leds[DOT1] = (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()
{
const byte sensorPin = 6;
//const byte brightnessLow = 50;
//const byte brightnessHigh = 255;
int sensorValue = analogRead(sensorPin);
Serial.print("Освещение: ");
Serial.println(sensorValue);
sensorValue = map(sensorValue, 255, 0, 10, 254);
LEDS.setBrightness(sensorValue);
// if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
// else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// Новый метод изменения яркости
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()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
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; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
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;
};
};
// Функция вывода температуры
/*/
//Пример на DHT11
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 17) {
TempShow = false;
return; }
TempShow = true;
int t = dht.readTemperature();
int celsius = t * 100;
//далее разбивка на светодиоды, можно взять ниже
*/
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
//bmp.begin();
RTC.read(tm);
if (tm.Second != 27) {
TempShow = false;
return;
}
TempShow = true;
int t = bmp.readTemperature();
int celsius = t;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2)); //21 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2)); //0 1й блок вывода первого символа
};
// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
//bmp.begin();
RTC.read(tm);
if (tm.Second != 32) {
PressureShow = false;
return;
}
PressureShow = true;
int p = bmp.readPressure() / 133.322;
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2)); //0 начало знака Давления (Р) 1й блок
// 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й блок вывода второй цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2 )); //21 2й блок вывода первой цифры значения
};
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
/*/
//Функция вывода влажности
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 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;
};
};
*/
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(500);
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
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);
}
}
//Меняем эффекты
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);
Serial.print("T=");
Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Pressure = ");
Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
//Serial.println();
//delay(5000);
}
Итак: Основа часов, подоконник ПВХ, подложка с вырезанными цифрами - строительный утеплитель пеноплекс, светорассеиватель - лист ватмана, оргстекло, алюминиевый уголок 40*10 для рамки. Размеры всей конструкции 666*250*40. Комплектация: Ардуино Nano, DS3231, BMP180, фоторезистор модуль, лента WS2812b, кнопки, разъём питания, кучка проводов (витая пара и мгтф), резистор 220 Ом, ну и конечно куда без горячих соплей.
Подоконник выбрал из-за пустот, лёгкости и простоты обработки. Внутренние перегородки со стороны размещения электроники вырезал полотном ножовки по металлу, что-то просто выкусил. За эстетизм не гнал, всё равно всё будет закрыто. В данным момент часы лежат на балконе, проходят обкатку низкими температурами. BMP долго остывает, за час температура снизилась с 26 до 8*С. Фоторезистор не совсем удачно разместил, идет засветка от самих цифр и не реагирует на окружающее освещение. Пришлось засунуть в темную трубочку (позже приклею к корпусу).
Симпатично. ИМХО, усилил бы питание на ленты, больше сотни диодов и заход сопельками с одного конца. Взять в стройтоварах 0,75квадрата многожильный и продублировать на каждый разряд, места навалом.
появилась проблемка, код перписали под любое количество диодов на сегмент, а как быть с точками, у меня лента ws2811 всего используется 29 кусков ленты (по три диода каждый), 28 из которых сегменты, а один разделительные точки. чет не пойму как быть где рыть
Так и пусть весь сегмент моргает, а серединный диод заклеить изолентой или просто выпаять. У наших точек есть координаты: 2 точки две координаты. У вас получится одна координата
Так и пусть весь сегмент моргает, а серединный диод заклеить изолентой или просто выпаять. У наших точек есть координаты: 2 точки две координаты. У вас получится одна координата
так так и нужно, но новый скетч заточен под 2812 и две средних точки, вычисяются как я понял из
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)
#define DOT1 (LEDS_IN_SEGMENT * 14)
#define DOT2 (LEDS_IN_SEGMENT * 14 + 1)
но у меня то точка получается как бы одна, а по такому скетчу у меня моргает две (которая разделительная и следующая, средняя на третьей цифре) =(
Т.е. разделительный сегмент моргает? Тогда может просто убрать координаты второй точки? И почистить код от упоминаний Dot2
ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =)
ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =)
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
Непонятно
чуши нет с лентой 2811 не свтречались что ли? там один пиксель, это три диода 5050 упраляемые одной микросхемой. в 2812 она встроена в каждый диод а тут несколько иначе, грядка из трёх диодов управляется одной общей микрухой. если рассматривать с логики 2812 то у меня на точках одна точка.
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
Непонятно
загугли лента ws2811 там один пиксель в скетче это грядка из трёх диодов на одной микросхеме
Не проверял. Если будут ошибки - пишите, исправлю вечером
проверил, вроде пашет, сначало все люто тупило пока не закоментил последние строчки Serial.print. после этого вроде всё ожило но какието-то подтормаживания на нажатия кнопок всё равно присутствуют. срабатывают не сразу по нажатию, а примерно с задержкой в секунду.
срабатывают не сразу по нажатию, а примерно с задержкой в секунду.
скинул delay(500); на кнопках до 100 стало нормуль. а то часы ладно их не долго ждать по пол секунды, а вот минут если надо 40-50 выставить ждять запаришься =)
Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))
#include <DHT.h>
#include <DHT_U.h>
//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 3 // Задаём сколько у нас светодиодов в сегменте.
#define COLOR_CHANGE 3 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
//#define BRIGHTNESS 150
//#define BRI_PIN 3 // Вывод сенсора
#define BRI_PIN A6 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230 // максимальная яркость (0 - 255)
#define min_bright 1 // минимальная яркость (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;
DHT dht(8, DHT11); // к какому порту подключаем DHT11 для влажности PIN_8
Adafruit_BMP085 bmp; // BMP180 для давления и температуры
//SFE_BMP180 bmp;
//BMP180 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
//DS3231 PINS
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //86 количество светодиодов в ленте
#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);
bmp.begin(); //датчик температуры
dht.begin(); //датчик влажности
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
void BrightDots (boolean Dot_On) {//координаты мигающих точек
leds[DOT1] = (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()
{
const byte sensorPin = 6;
//const byte brightnessLow = 50;
//const byte brightnessHigh = 255;
int sensorValue = analogRead(sensorPin);
Serial.print("Освещение: ");
Serial.println(sensorValue);
sensorValue = map(sensorValue, 255, 0, 10, 254);
LEDS.setBrightness(sensorValue);
// if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
// else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// Новый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
// Serial.print("Освещение: "); // вывод инфы в сом порт
// Serial.println(sensorValue); // вывод инфы в сом порт
new_bright = map(analogRead(6), 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()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
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; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
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;
//bmp.begin();
RTC.read(tm);
if (tm.Second != 25) {//через какое время показывать температуру
TempShow = false;
return;
}
TempShow = true;
// delay(3000);
int t = bmp.readTemperature();
int celsius = t;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2)); //21 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2)); //0 1й блок вывода первого символа
};
// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
//bmp.begin();
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
// delay(3000);
int p = bmp.readPressure() / 133.322;
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2)); //0 начало знака Давления (Р) 1й блок
// 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й блок вывода второй цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2 )); //21 2й блок вывода первой цифры значения
};
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// ^^^^^^^ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ^^^^^
// \/\/\/\/\/\/ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ\/\/\/\/
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
//Вывод влажности
//Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) {//через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
// delay(3000);
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 - 2)); //21 2й блок вывода второго символа
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2)); //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);//время показа влажности
//вывод информации в сом порт
Serial.print("Tемпература = ");
Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
//Serial.println();
//delay(8000);
// Serial.print (" *** ");
Serial.println (" *** "); //
}
Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))
Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.
Берете баночку, насыпаете на дно соль поваренную (не йодированную), капаете чуть воды, чтобы смочило кучку, но без каши. Подвешиваете в эту баночку свой датчик и закрываете пленкой-стретчем. Баланс устанавливается достаточно долго, пару-тройку часов. Если покажет стабильно 72-76%, значит почти идеальный в верхнем пределе.
Для остальных пределов, нужна хим.лаборатория с разными х.ч.солями.
P/S А с процентами хорошо придумали, не додумался.))))
Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.
Ну что было ((. Да и используется он только для одного значения. BME280 пока в дороге. ПРидет, тогда заменю всё одним датчиком. Спасибо за способ проверки. На выходных попробую поэкспериментировать
Всем здрасьте, отремонтировал часы, ув но хз почему я не проверял напряжения со старым бп на конце было 2в, так же очень блинный провод от бп, сейчас все ок при белом свете на конце 4.9, убрал все цвета кроме синего, зеленого и розового.
и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.
и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.
int celsius = ((t-2) / 4.0) * 100;
написали из переменной celcius вычесть два - а вы откуда вычитаете? и еще непонятно, зачем вы скобку (t/4.0) на 100 умножаете, у Одиночка такого не было.
это просто ад) просто ппц, от чего могут выходить из строя 2812б? нормальный бп просадок 9 миливольт, вроде все ок по питанию, в одном диоде сгорел синий цвет, и 2 сигмента вообще не пашут, просто горят микроконтроллеры, ппц)
работали на 75% в прошивке, сейчас снизил до 55% посмотрим сдохнут или нет. и самое интересное работали на столе 3 дня и все ок, повесил на стену утром 2 сектора в минус, что то на стене не так, перевесил в другое место протестирую ппц они задрали, вторая лента в доноры ушла
а я уже не раз писал про то что на ws2812 в последние годы очень много брака, по этому киты начали клепать ws2813. лучше делать на ws2811 она как по мне надежнее и живучее скорее всего из за того чип отельно от диодов и не перегревается, плюс меньше монтажа. попробуй закажи у другого кита ws2812 может попадется партия получше.
наваял съём темпера с DALLAS DS18B20 всё работает, но иногда кнопки стали подтупливать, скорее всего из за того что постоянно опрашивается далас. не могу допетрить как сделать опрос даласа только перед выводом на табло. мож кто подмогнёт?
/*
Подключение к Arduino nano:
Часы DS3231: SCL -> A5
SDA -> A4
Датчик освещения -> A3
Кнопки: Смена часов -> D2
Смена минут -> D3
Смена цвета -> D4
Датчик температуры -> D10
Лента WS2811(WS2812)-> D13
*/
//---------------------------------------------------------------------------------------------------
#include <DS3232RTC.h> // для работы с модулем часов реального времени
#include <Time.h> // для работы с модулем часов реального времени
#include <Wire.h> // для работы с модулем часов реального времени
#include <FastLED.h> // для работы с диодной ленты
#include <OneWire.h> // для работы с датчиком температуры
#include <DallasTemperature.h> // библиотека температурного сенсора DS18B20
#define LEDS_IN_SEGMENT 1 // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 1 // задаём сколько у нас разделительных точек
#define COLOR_CHANGE 0 // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define NUM_COLORS 16 // количество цветов
#define COLOR_ORDER BGR // по умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // пин ленты
#define BRI_PIN A3 // пин фоторезистора
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 250 // максимальная яркость (0 - 255)
#define min_bright 80 // минимальная яркость (0 - 255)
#define bright_constant 1000 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define ONE_WIRE_BUS 10 // пин температурного датчика DS18B20
OneWire oneWire(ONE_WIRE_BUS); // настройка oneWire для связи с любыми устройствами OneWire
DallasTemperature sensors(&oneWire); // подключаем DS18B20 к oneWire
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
//---------------------------------------------------------------------------------------------------
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
//---------------------------------------------------------------------------------------------------
CRGB leds[NUM_LEDS]; // задаём значение светодиодов
uint8_t digits[] = {
0b00111111, // цифра 0
0b00100001, // цифра 1
0b01110110, // цифра 2
0b01110011, // цифра 3
0b01101001, // цифра 4
0b01011011, // цифра 5
0b01011111, // цифра 6
0b00110001, // цифра 7
0b01111111, // цифра 8
0b01111011, // цифра 9
0b01111000, // символ * градус 10
0b00011110, // символ C 11
0b01111100, // символ P 12
0b01111000, // символ % знак % из двух частей 13
0b01000111, // символ % знак % из двух частей 14
};
//---------------------------------------------------------------------------------------------------
bool Dot = true;
bool TempShow = true;
int last_digit = 0;
//---------------------------------------------------------------------------------------------------
long ledColor = CRGB::Aqua; // используемый цвет
long ColorTable[NUM_COLORS] = {
CRGB::Red,
CRGB::Orange,
CRGB::Yellow,
CRGB::Blue,
CRGB::Green,
CRGB::Purple,
CRGB::Pink,
CRGB::White,
CRGB::Violet,
CRGB::SkyBlue,
CRGB::LightBlue,
CRGB::Green,
CRGB::Lime,
CRGB::Blue,
CRGB::Red,
CRGB::Cyan
};
//---------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
Wire.begin();
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//---------------------------------------------------------------------------------------------------
//LEDS.setBrightness(75); // задаём яркость
pinMode(4, INPUT_PULLUP); // кнопка смены цветов
pinMode(3, INPUT_PULLUP); // кнопка смены минут
pinMode(2, INPUT_PULLUP); // кнопка смены часов
sensors.begin();
sensors.requestTemperatures(); // отправляем команду для получения показаний температуры
}
//---------------------------------------------------------------------------------------------------
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (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); // установить новую яркость
}
}
};
//---------------------------------------------------получаем время--------------------------------------------------------------
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
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; // получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
//----------------------------------------------Функция вывода температуры----------------------------------------------------------
void TempToArray(){ // вывод температуры с DALLAS DS18B20
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {
TempShow = false;
return;
}
TempShow = true;
sensors.requestTemperatures(); // отправляем команду для получения показаний температуры
int celsius = sensors.getTempCByIndex(0);
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // начало знака Цельсия (С) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // начало знака Градус (*) 3й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода первого символа
};
//----------------------------------------------------------------------------------------------------
/*
void TempToArray() { //Вывод температуры с DHT11
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 17) {
TempShow = false;
return; }
TempShow = true;
int t = dht.readTemperature();
int celsius = t * 100;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // начало знака Цельсия (С) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // начало знака Градус (*) 3й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода первого символа
};
//-----------------------------------------------------------------------------------------------------------
void TempToArray(){ //Вывод температуры с RTC3231
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {
TempShow = false;
return;
}
TempShow = true;
int t = RTC.temperature();
int celsius = (t / 4.0);
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // начало знака Цельсия (С) 4й блок
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // начало знака Градус (*) 3й блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // 1й блок вывода первого символа
};
*/
//------------------------------------------смена цвета кнопкой DST пин D4---------------------------------------------------------
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(200);
};
//-----------------------------------массив управляет кнопками с часами и минутами--------------------------------------------------
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(200);
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(); // температура
FastLED.show(); // задаём массив светодиодов
if (TempShow == true) delay (2000); // время отображения температуры (3000 = 3 сек)
}
да хз какое сечение) на входе провода с комплекта толстые, остальное провода с магнитофона, но все же думаю на источник
Если в комплекте такие, как и у меня, то там толстая изоляция, а провод - г-но.
Симптом (погорели которые вначале) показателен, наводит на мысли о сильном падении напряжения в цепи, что может привести к непонятным глюкам на последующих, дальних участках. Рекомендовал бы бросить питание к каждому отрезку отдельно.
На 30 светодиодов двойное питание? А смысл. Теперь блок питания нормальный. И так потянет. Это первый блок на 1а гнал, вот и погорели. У меня на 3а стоит и 114 диодов(тьфу-тьфу-тьфу) и работает уже 3ю неделю
Так зажгите их белым и померьте напряжение в начале и конце ленты. Повторяю, 30 светодиодов, это 1,8А в максимуме. Це, ИМХО.
И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
3 цвета хавают по 20 милиампер белый все 60, так что если стоит смена цвета то поставь только красынй синий и зеленый, что б не было оттенков да бы не было перегревов, а то малоли часы как у меня загнуться, сейчас ппц как обидно, жду новую ленту( а дуину и все ост вывел на заднюю часть корпуса (через фанеру)дабы ленту схема и не видела, температура была норм но все же завышает этот датчик на 2 град, не знаю можно ли как то откалибровать
но все же завышает этот датчик на 2 град, не знаю можно ли как то откалибровать
если просто завышает при любых температурах - из переменной celcius (строка 161 скетча #129) просто вычтите 2
вывод температуры с RTC это было временное решение, пока не было нормального датчика температуры, хотя у меня до сих пор первые часы работают так и нормально показывают температуру. единственное что пришлось внести небольшую корректировку на пару градусов, так как слегка завышали. ведь температуру они меряют не воздуха, а самой микросхмемы. а она греется чуть больше комнатной температуры.
не знаю можно ли как то откалибровать
и да все верно написали из переменной
int
celsius = (t / 4.0);
нужно просто вычесть погрешностьЛента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =)
Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.
просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =)
Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри. Датчики освещения и температуры вынесены наружу и обособлены от внешнего воздействия. Но не знание кода вносит свои коррективы. ПОэтому датчик температуры висит в одной стороне, а измерения приходят с другой стороны. (( Даже на рабочем варианте (в смысле на работе), стоит BMP180 и вынесен он за корпус где на него не попадает свет и пыль. Но пока что он просто для декора ((( В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе
Продолжаю взрывать мозг попыткой собрать код под BMP180. Собрал кучу примеров и скетчей и пытаюсь из кусков собрать рабочее. Вроде накидал и скетч скомпилировался. НО меня смущает строка int t = RTC.temperature(); вроде как она говорит что значение t брать из часов, но мне то надо чтобы из ВМР бралось. В библиотеке ADAFRUIT_BMP085 я не понял где посмотреть. Да и примера кардинально отличаются от нашего способа вывода данных.
Вопрос: я правильно пытаюсь сделать или всё это вообще никуда не годится?
P.S.извиняюсь за кучу коментариев в коде, вставлял вырезал перебирал подбирал сравнивал
Продолжаю взрывать мозг попыткой собрать код под BMP180.
не нужно сразу пытаться получить готовый рабочий код, тем более собирая его из разных источников и пытаясь всё это объеденить. для этого есть монитор порта и Serial.print выведи необходимое, для начала туда. а потом уже будешь думать как полученное вывести на часах.
Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри.
не согласен с чем? что можно сказать, приклеил RTC к ленте? =) конструкция продуманна??? всё основное внутри....что именно лента и дуня =) эм.. освещение и термо вынесены наружу, при том что датчик с одной стороны, а измерения с другой, BMP180 вынесен за корпус где на него не попадает свет и пыль (так и внутри часов с ним будет так же всё в порядке) и это по вашему продуманная конструкция?
В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе
в моём же случае температура есть нечто среднее между реальностью и рабочей температурой микросхемы, которая как правило составляет +2 гадуса при комнатной температуре. да лабараторная точность мне нужна и кроме того я уже писал, что температура с RTC-ки была добавлена в первые версии скетча, когда не было еще просто в наличии ни каких других датчиков температуры, а часы уже были собраны и люди пытающиеся повторить данный проект, очень просили добавить температуру, которую на тот момент было просто не от куда брать, кроме как с RTC
Прошу помочь объяснить мне назначение в коде
значений
int t = RTC.temperature();
int celsius = (t / 4.0);
и int digit = celsius % 10;.
Для чего так много из одного в другое, и как можно обойтись без первых двух строк Чтобы от них не зависела третья строка с выводом данных на матрицу? Вроде собрал код но отсылка на RTC все сбивает. Без двух строк не хочет работать третья и последующие на которую идёт digit. Я так понимаю, что достаточно изменить переменную привязки t к RTC и этого будет достаточно.
Прошу помочь объяснить мне назначение в коде
Все просто
int t = RTC.temperature(); - чтение данных с температурного датчика. Это значение не в градусах, а в четвертях градуса, поэтому чтобы перевести его в градусы. нужна вторая строчка - поделить на 4:
int celsius = (t / 4.0);
Ну а дальше начинается разбиение градусов на цифры, Например, если у вас 24 градуса, строка
int digit = celsius % 10;.
даст остаток от деления на 10 - то есть цифру 4. Потом вы повторите этот трюк и получите цифру 2. Точно так же в процедуре работы со временем у вас из часов и минут делаются 4 цифры для вывода на экран.
Спасибо за разъяснения. Не уверен, что через N-ое время смогу вспомнить об этом, но сейчас я понял что к чему.
В общем всеми правдами и не правдами. Я собрал свою солянку. Нашел ещё несколько интересных проектов и кое что поменял у себя. Изменение яркости теперь плавное. Проверял на закрытие пальцем поэтому точных данных нет, надо дождаться сумрака. Но на данный момент моргаликов при закрытии открытии нету.
Самое главное, температура теперь берётся из BMP180 и она точная))) Может в последствии перейду на DHT11 ( а то для работы сильно жирно BMP датчик ставить).
Скетч загружен, время идёт, температура показывается, цвета меняются кнопками. Я доволен. Если вруг ещё чего нибудь прикрутится буду только рад. Спасибо всем помогавшим и критиковавшим (bwn, dj-toxa, b707, GennOk) Вы двигали мой прогресс.
Фото рабочих часов на предыдущих страницах. Вечером добью домашние и сделаю фото.
Поздравляю!
Всегда рад помочь.
DHT11 - это полное Г. не надо его ставить
Молодец. Для наружки, достаточно удобно, типа АМ2301 и брешет не очень сильно. DHT11, присоединяюсь к предыдущему оратору.
можно даллас 18b20 поставить, обычный дома, а в герметичном исполнении на улицу
для внутри дома недорог AM2320 c i2c на борту. Врёт, канеш, но не сильно. У мня в сортире/ванной около 3 лет трудица.
Ошибка 404
Снимаю свой вопрос. ))) В сом порту я привел их к мм рт.ст., а тут забыл перевести. Они показывали в Паскалях)) вот и шла каша.
Новый код с выводом Давления
Итак: Основа часов, подоконник ПВХ, подложка с вырезанными цифрами - строительный утеплитель пеноплекс, светорассеиватель - лист ватмана, оргстекло, алюминиевый уголок 40*10 для рамки. Размеры всей конструкции 666*250*40. Комплектация: Ардуино Nano, DS3231, BMP180, фоторезистор модуль, лента WS2812b, кнопки, разъём питания, кучка проводов (витая пара и мгтф), резистор 220 Ом, ну и конечно куда без горячих соплей.
Подоконник выбрал из-за пустот, лёгкости и простоты обработки. Внутренние перегородки со стороны размещения электроники вырезал полотном ножовки по металлу, что-то просто выкусил. За эстетизм не гнал, всё равно всё будет закрыто. В данным момент часы лежат на балконе, проходят обкатку низкими температурами. BMP долго остывает, за час температура снизилась с 26 до 8*С. Фоторезистор не совсем удачно разместил, идет засветка от самих цифр и не реагирует на окружающее освещение. Пришлось засунуть в темную трубочку (позже приклею к корпусу).
Симпатично. ИМХО, усилил бы питание на ленты, больше сотни диодов и заход сопельками с одного конца. Взять в стройтоварах 0,75квадрата многожильный и продублировать на каждый разряд, места навалом.
мде
Поздравляю!
Всегда рад помочь.
появилась проблемка, код перписали под любое количество диодов на сегмент, а как быть с точками, у меня лента ws2811 всего используется 29 кусков ленты (по три диода каждый), 28 из которых сегменты, а один разделительные точки. чет не пойму как быть где рыть
Так и пусть весь сегмент моргает, а серединный диод заклеить изолентой или просто выпаять. У наших точек есть координаты: 2 точки две координаты. У вас получится одна координата
так так и нужно, но новый скетч заточен под 2812 и две средних точки, вычисяются как я понял из
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)
#define DOT1 (LEDS_IN_SEGMENT * 14)
#define DOT2 (LEDS_IN_SEGMENT * 14 + 1)
но у меня то точка получается как бы одна, а по такому скетчу у меня моргает две (которая разделительная и следующая, средняя на третьей цифре) =(
Т.е. разделительный сегмент моргает? Тогда может просто убрать координаты второй точки? И почистить код от упоминаний Dot2
ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =)
ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =)
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
Непонятно
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
Непонятно
чуши нет с лентой 2811 не свтречались что ли? там один пиксель, это три диода 5050 упраляемые одной микросхемой. в 2812 она встроена в каждый диод а тут несколько иначе, грядка из трёх диодов управляется одной общей микрухой. если рассматривать с логики 2812 то у меня на точках одна точка.
Непонятно
ну если не понятно то 2812 29 штук и разделительная точка одна
как под такой расклад скетч поправить?
dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.
Непонятно
загугли лента ws2811 там один пиксель в скетче это грядка из трёх диодов на одной микросхеме
пусть будет 29 штук 2812 одна точка по середине(15я). как поправить? мигает одна
dj-toxa - можно было пять ответов и не писать :) я с первого раза обычно понимаю :)
вот держите, поправил на скорую руку код Одиночки из сообщения #172. Число точек - параметр DOTS_NUM Больше ничего менять не надо
Не проверял. Если будут ошибки - пишите, исправлю вечером
dj-toxa - можно было пять ответов и не писать :) я с первого раза обычно понимаю :)
вот держите, поправил на скорую руку код Одиночки из сообщения #172. Число точек - параметр DOTS_NUM Больше ничего менять не надо
Не проверял. Если будут ошибки - пишите, исправлю вечером
шпасибки в понидёрник попробую, часы на работе =) понимающий вы наш человек =)
Не проверял. Если будут ошибки - пишите, исправлю вечером
проверил, вроде пашет, сначало все люто тупило пока не закоментил последние строчки Serial.print. после этого вроде всё ожило но какието-то подтормаживания на нажатия кнопок всё равно присутствуют. срабатывают не сразу по нажатию, а примерно с задержкой в секунду.
срабатывают не сразу по нажатию, а примерно с задержкой в секунду.
скинул delay(500); на кнопках до 100 стало нормуль. а то часы ладно их не долго ждать по пол секунды, а вот минут если надо 40-50 выставить ждять запаришься =)
Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))
последний мокрый
Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))
Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.
Берете баночку, насыпаете на дно соль поваренную (не йодированную), капаете чуть воды, чтобы смочило кучку, но без каши. Подвешиваете в эту баночку свой датчик и закрываете пленкой-стретчем. Баланс устанавливается достаточно долго, пару-тройку часов. Если покажет стабильно 72-76%, значит почти идеальный в верхнем пределе.
Для остальных пределов, нужна хим.лаборатория с разными х.ч.солями.
P/S А с процентами хорошо придумали, не додумался.))))
Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.
Ну что было ((. Да и используется он только для одного значения. BME280 пока в дороге. ПРидет, тогда заменю всё одним датчиком. Спасибо за способ проверки. На выходных попробую поэкспериментировать
Всем здрасьте, отремонтировал часы, ув но хз почему я не проверял напряжения со старым бп на конце было 2в, так же очень блинный провод от бп, сейчас все ок при белом свете на конце 4.9, убрал все цвета кроме синего, зеленого и розового.
и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.
и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.
написали из переменной celcius вычесть два - а вы откуда вычитаете? и еще непонятно, зачем вы скобку (t/4.0) на 100 умножаете, у Одиночка такого не было.
это просто ад) просто ппц, от чего могут выходить из строя 2812б? нормальный бп просадок 9 миливольт, вроде все ок по питанию, в одном диоде сгорел синий цвет, и 2 сигмента вообще не пашут, просто горят микроконтроллеры, ппц)
Не зажариваете их? Попробуйте питание до 4,6-4,7 снизить, белым светом на полной яркости не баловаться.
работали на 75% в прошивке, сейчас снизил до 55% посмотрим сдохнут или нет. и самое интересное работали на столе 3 дня и все ок, повесил на стену утром 2 сектора в минус, что то на стене не так, перевесил в другое место протестирую ппц они задрали, вторая лента в доноры ушла
соседи там, через стенку, тебя случайно торсионными полями не обрабатывають?
а я уже не раз писал про то что на ws2812 в последние годы очень много брака, по этому киты начали клепать ws2813. лучше делать на ws2811 она как по мне надежнее и живучее скорее всего из за того чип отельно от диодов и не перегревается, плюс меньше монтажа. попробуй закажи у другого кита ws2812 может попадется партия получше.
наваял съём темпера с DALLAS DS18B20 всё работает, но иногда кнопки стали подтупливать, скорее всего из за того что постоянно опрашивается далас. не могу допетрить как сделать опрос даласа только перед выводом на табло. мож кто подмогнёт?