Большие настенные часы на Arduino

Yussuf
Offline
Зарегистрирован: 23.02.2021

Лучше б уже ничего не писал...

начинающий
Offline
Зарегистрирован: 13.12.2020

b612 пишет:

Yussuf пишет:
Они сейчас горят постоянно.
у нас уже тоже всё горит 

Так что? готового и окончательно "рабочего" решения нет?

Если есть, подскажите пожалуйста ссылку на версию для состава: ds3231, ds18b20, bme280, ws2811 ?

b612
Offline
Зарегистрирован: 12.03.2017

начинающий пишет:
ws2811 ?
для 11-ых здесь вроде и не было.
и вообще здесь тема не для рабочих решений, а для тех, кто учится и переделывает под себя.
Крутые рабочие но не переделываемые есть у меня.

Yussuf
Offline
Зарегистрирован: 23.02.2021

После твоего предыдущего ответа у тех, кто учится, пропадает желание вообще что нибудь спрашивать в этом форуме

начинающий
Offline
Зарегистрирован: 13.12.2020

.

Yussuf
Offline
Зарегистрирован: 23.02.2021

К b612

начинающий
Offline
Зарегистрирован: 13.12.2020

да, знакомый персонаж, на радиокоте не он случайно свои часы широко рекламирует?

Yussuf
Offline
Зарегистрирован: 23.02.2021

Хз

b707
Offline
Зарегистрирован: 26.05.2017

Yussuf пишет:
После твоего предыдущего ответа у тех, кто учится, пропадает желание вообще что нибудь спрашивать в этом форуме
а что не так?
Не заметил, чтоб вы что-то спрашивали?
Готовые коды тут не дают, начинайте переделывать сами,

b707
Offline
Зарегистрирован: 26.05.2017

Yussuf пишет:
После твоего предыдущего ответа у тех, кто учится, пропадает желание вообще что нибудь спрашивать в этом форуме
а что не так?
Не заметил, чтоб вы что-то спрашивали?
Готовые коды тут не дают, начинайте переделывать сами,

Yussuf
Offline
Зарегистрирован: 23.02.2021

Та проехали, не хотел ни в коем случае кого нибудь обидеть

начинающий
Offline
Зарегистрирован: 13.12.2020

.

b707
Offline
Зарегистрирован: 26.05.2017

В ветке есть несколько вариантов кода.

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
а что не так?
да я после его двух "можно задать вопрос ?"
сказал что мы тут уже кипятком ссым чтобы наконец уже задавал ))
что нам уже давно и сильно хочется ответить )

b612
Offline
Зарегистрирован: 12.03.2017

Кто-нибудь взялся-бы плату нарисовать под блок "мозгов"
Хорошую универсальную. Чтобы у китайцев можно было заказать изготовление.
Я бы для того человека написал прошивку как ему надо.

b707
Offline
Зарегистрирован: 26.05.2017

Это некоммерческий продукт, никто лог ошибок не вел и гарантий не даст. Что-то можно подчерпнуть из внимательного чтения ветки, но в целом на свой страх и риск

начинающий
Offline
Зарегистрирован: 13.12.2020

b612 пишет:

Кто-нибудь взялся-бы плату нарисовать под блок "мозгов"
Хорошую универсальную. Чтобы у китайцев можно было заказать изготовление.
Я бы для того человека написал прошивку как ему надо.

Dip trace Вам в помощь, на заводах им рисуют схемы, из схем прога создает плату, а можно сразу в редакторе плат рисовать плату.

b707
Offline
Зарегистрирован: 26.05.2017

B612 - обращайтесь, нарисую. Не бесплатно, конечно:)

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:
B612 - обращайтесь, нарисую. Не бесплатно, конечно:)

могу предложить в качестве оплаты полный комплект корпуса со стеклом, плёнкой и подставкой

b707
Offline
Зарегистрирован: 26.05.2017

начинающий. что это вы все свои мессаги почистили? Стыдно стало? :)

начинающий
Offline
Зарегистрирован: 13.12.2020

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

b707
Offline
Зарегистрирован: 26.05.2017

начинающий пишет:

стоит только попоросить о помощи то все сразу "ссут кипятком" от желания помочь и подсказать направление на путь истинный.

"помощь" - это когда делаете ВЫ, а мы помогаем. Что-то я не заметил у вас желания хоть что-то сделать самостоятельно. Коды в ветке лежат свободно, берите, используйте. Вместо этого  Вы рыщете по форумам в поисках готового скетча конкретно под свою уникальную конфигурацию. Ну что ж, удачи. Повезет - найдете, а нет - имейте в виду, ни на одном форуме писать код конкретно под Вас никто не будет, лучше беритесь сами.

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

начинающий
Offline
Зарегистрирован: 13.12.2020

b707 пишет:

начинающий пишет:

стоит только попоросить о помощи то все сразу "ссут кипятком" от желания помочь и подсказать направление на путь истинный.

"помощь" - это когда делаете ВЫ, а мы помогаем. Что-то я не заметил у вас желания хоть что-то сделать самостоятельно. Коды в ветке лежат свободно, берите, используйте. Вместо этого  Вы рыщете по форумам в поисках готового скетча конкретно под свою уникальную конфигурацию. Ну что ж, удачи. Повезет - найдете, а нет - имейте в виду, ни на одном форуме писать код конкретно под Вас никто не будет, лучше беритесь сами.

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

ну все ведь и начинается с того что в ветке находится готовый код, с целью его модификации, тут же возникает вопрос, по какой схеме соединений написан данный код, что бы точнее можно было вносить правки под свои хотелки. И тут начинается замкнутый круг у кого есть схема, нет скетча, у кого есть скетч, зажимают от жадности схему, а Вы говорите самому дорабатывать, НО НА ОСНОВЕ ЧЕГО??? для самостоятельной доработки или переработки должна быть какая то минимальная база, ведь в любом из представленных кодов прописаны порты для подключения внешней переферии. Так что по Вашему я, внося правки под собственные нужды должен как телепат угадывать по какой схеме был написан исправляемый код, что бы подключить оборудование, модули и датчики к тем же пинам, во избежании выхода из строя чего либо из-за переполюсовки питания например, да на эту тему рассуждать можно бесконечно, все равно, мы с Вами на разных языках разговариваем. Вам всегда будет казаться, что я хочу чтобы мне на халяву сочинили прошивку под мою обвеску, а я просто пытаюсь найти "пару", т.е. скетч и схему по которой он написан, чтобы самому разобраться что к чему, что на что влияет, как описаны точки подключения и т.д., и затем на основе распознанных взаимосвязей построить свою прошивку под имеющуюся в наличии комплектацию. Короче чтобы понять что куда писать, что на что влияет, как прописываются в прошивке подключаемые к ардуине выводы подключаемого модуля, как осуществляется считывание с него данных..... .Понятно? Даже для этого чтобы разобраться и внести адекватные изменения нужно видеть схему по которой написан скетч, что бы было очевидно почему автор сделал так а не иначе.

b707
Offline
Зарегистрирован: 26.05.2017

Вы думаете, что мы тут "зажимаем от жадности схему"... А вам не приходит в голову, что схемы может просто не быть?  Для данного проекта схем, как правило, никто не рисовал, в ней просто нет необходимости. Многие модули, такие как BME/BMP280 или часы 3231 подключаются всегда только к определенным пинам (каким - описано в даташите на датчик). Остальное легко ищется в скетче. Вы сами пишете, что в коде уже описаны пины, к которым подключены сенсоры и лента. Так чего ж Вам еще?

Добавка - вижу, на прошлой странице вам еще полтора месяца назад выложили пару схем. Что опять не так? Теперь чего не хватает?

OdinochkA
Offline
Зарегистрирован: 05.07.2015

Всем доброго времени. B707 рад вас читать, мастер, вижу что в добром здравии и продолжаете напутствовать подаванов)).
Начинающий, видишь ли, я начал с обычных часов которые у кого то увидел. В пинах минимум. Лента, часовой модуль. Ленту вешаешь на любой удобный тебе, часы идут по даташиту на i2c без вариантов. Дальше больше. Кнопки управления часы, минуты, цвет какие хочешь такие и ставь и пиши их в коде. Тот код, что я собрал с огромной помощью здешних гуру, имеет очень много комментариев, в том числе и по пинам.
Смотри пост 113, самый первый код с кучей ошибок, НО
Строка 10 пин ленты, 70,71,72 кнопок, 91 датчик освещенности.
Без обид, но кто ищет тот найдëт. Спалить, как пишешь, подключив не туда, ну тогда может это вообще не твоë? Плюс и минус это только питание. Метки везде стоят. А вот по сигнальным, их не надо замыкать с питающим, если только это не указано в схеме которая, конечно выглядит как тихий ужос но она есть.
Так что если хочешь повторить, попробуй посмотреть код, только внимательно. Там много меток.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

начинающий пишет:

ну все ведь и начинается с того что в ветке находится готовый код, с целью его модификации,

Кто Вам сказал эту глупость?

Код не "находится", код - пишется.

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

Далее пишется алгоритм. Подробный алгоритм работы устройства - по-русски.

Дальше составляется примерная схема. С предварительным вариантом распиновки.

Далее, исходя из удобства монтажа, корректируется распиновка. При этом изменения вносятся как в схему, так и в алгоритм.

Ну а дальше алгоритм переводится с русского на Си или Си++.

Собственно - все, код написан.

Цитата:

...зажимают от жадности схему...

Не следует о других судить по себе. 

как правило, на этом форуме завсегдатаи никогда схему не "зажимают". Исключение составляют некоторые новички, всерьез полагающие, что составленная ими (как правило, безграмотная) схема (или скетч) имеют какую-то ценность.

Цитата:

... самому дорабатывать, НО НА ОСНОВЕ ЧЕГО??? для самостоятельной доработки или переработки должна быть какая то минимальная база...

База - это собственное ТЗ и собственноручно написанный алгоритм. Больше ничего не нужно.

Цитата:
Так что по Вашему я, внося правки под собственные нужды должен как телепат угадывать по какой схеме ...

Ну, оно никому кроме Вас не нужно. Поэтому хотите - угадывайте, а не хотите - пишите свое, с нуля. Никто ведь не заставляет пользоваться именно тем, что выложено в теме. Это выложено исключительно из добрых чувств. И никто Вам объяснять что к чему, а тем более дорабатывать под Ваши хотелки не обязан.

Хотите воспользоваться тем, что есть на форуме - не забывайте сказать спасибо. А высказывать здесь претензии - дурной тон.

b707
Offline
Зарегистрирован: 26.05.2017

начинающий пишет:

для самостоятельной доработки или переработки должна быть какая то минимальная база,

это очень верно подмечено. Тем, у кого есть "минимальная база" знаний - приведенного в ветке кода вполне достаточно. А если у вас базы нет, то понятно. что вы смотрите на код как на новые ворота. Повышайте свой уровенб, нарабатывайте базу - и многие вопросы отпадут сами. Другого пути нет, никто знания за Вас вам в голову не вложит.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

может кому пригодится

/* часы ds3231,ws2812,bme280,яркость, кнопки установки час. мин.
   влезает в atmega 168pa. вывод давления, влажности,температуры с точкой 1/10. цвет цифр температуры зависит от температуры(
   МЕНЬШЕ равно 00 СИНИЙ, ВЫШЕ 00 КРАСНЫЙ) , точки РАЗДЕЛЕНЫ мигают поочередно или одновременно.
  A4  SDA
  A5  SCL
*/

#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>

#define DATA_PIN 7            //  подключение ленты    PIN --> R100 --> Din
#define M_PIN A3              // установка часов       GND --> КНОПКА --> PIN
#define H_PIN A2              // установка минут       GND --> КНОПКА --> PIN
#define D_PIN A1              // смена цвета           GND --> КНОПКА --> PIN
#define BRI_PIN A6            // фоторезистор          GND --> RES --> BRI_PIN --> R10K --> +5V

#define LEDS_IN_SEGMENT 1     // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2            // Задаём количество разделительных точек
#define COLOR_CHANGE 1        // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16         // цветовая гамма
#define COLOR_ORDER GRB       // По умолчанию цвет стоит зелёный при выключенных режимах
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 255        // максимальная яркость (0 - 255) если автоматическая подстройка яркости выключена, то яркость будет равна указаной 
#define min_bright 30         // минимальная яркость (0 - 255)
#define bright_constant 1000  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.2              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость

#define DDOT 1                 // РЕЖИМ ТОЧЕК 1- мигают поочередно, 0 - мигают одновременно

int sec;
int bri ;

int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

Adafruit_BME280 bme;            // BME280 давление, влажность, температура   I2C

// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)  //количество светодиодов в ленте
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
  0b01011000,     // Digit с  маленькая  "С" вверху 15
};

//bool DST = false;
int last_digit = 0;
long ledColor;

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::Green,
  CRGB::Orchid,
  CRGB::DarkOrchid
};

void setup()

{
  ledColor = CRGB::Blue; // Используемый цвет
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  bme.begin(0x76); //датчик температуры
  pinMode(D_PIN, INPUT_PULLUP);      // Кнопка смены цветов            GND --> КНОПКА --> PIN
  pinMode(H_PIN, INPUT_PULLUP);      // Кнопка установка часов         GND --> КНОПКА --> PIN
  pinMode(M_PIN, INPUT_PULLUP);      // Кнопка установки минут         GND --> КНОПКА --> PIN
  pinMode(BRI_PIN, INPUT_PULLUP);    // фоторезистор    GND --> фоторез --> PIN --> R10K --> +5V
  //  A4  SDA
  //  A5  SCL
}

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 == 1)        // если включена адаптивная яркость
  {
    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)
      bri = 255 - new_bright_f;
    }
  }
  else
  {
    bri = max_bright;     // если выключена адаптивная яркость
  }
}
int GetTime()         //  Получаем время
{
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  return (hour * 100 + minute);
}
void TimeToArray()    // Преобразуем время в массив для отображание
{
  int Now = GetTime();                                // Получаем время

  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;
    }
    BrightDigit(digits[digit], cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  }
}

// =======================
//Функция вывода метеоданных

void TempToArray()          //Измеряем и выводим температуру
{ int celsius =  (bme.readTemperature() * 10);

  leds[14] = CRGB::Black;

  if (celsius >= 0)              // если + красные цифры
  {
    ledColor = CRGB::Red;
    leds[15] = CRGB::Red;
  }
  else if (celsius <= -1)        // если -  синие цифры
  {
    ledColor = CRGB::Blue;
    leds[15] = CRGB::Blue;
  }

  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));                       //  маленький знака Цельсия (с) 4й блокn

  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й блок вывода второго символа

  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));       //  1й блок вывода первого символаo
}

void PressureToArray()       // Измеряем и выводим давление
{
  int p = bme.readPressure() / 133.322;  //int p = bmp.readPressure() / 133.322;c
  int Pressure = p;

  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));        //  начало знака Давления (Р) 1й блокh

  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7  ));              //  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14 ));             //  3й блок вывода второй цифры значенияk
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //  2й блок вывода первой цифры значения
}

void HumidityToArray()         //Измеряем и выводим влажности
{
  int h = bme.readHumidity();
  int humidity = h;

  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));                 //  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14 ));               //  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок вывода второго символаA
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок вывода первого символа
}
//========================

void DSTcheck()                //смена цвета ленты кнопкой DST Pin
{
  int buttonDST = digitalRead(D_PIN);
  if (buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  };
  delay(100);//время реакции на нажатие
}

void TimeAdjust()         // Массив управляет кнопками с часами и минутами
{
  int buttonH = digitalRead(H_PIN);
  int buttonM = digitalRead(M_PIN);
  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 dots()                   // мигаем точками
{
  if (DDOT == 1)              // мигают поочередно
  {
    if (sec % 2 == 0)
    {
      leds[14] = ledColor;
      leds[15] = CRGB::Black;
    }
    else
    {
      leds[14] = CRGB::Black;
      leds[15] = ledColor;
    }
  }

  else if (DDOT == 0)         // мигают одновременно
  {
    if (sec % 2 == 0)
    {
      leds[14] = ledColor;
      leds[15] = ledColor;
    }
    else
    {
      leds[14] = CRGB::Black;
      leds[15] = CRGB::Black;
    }
  }
}

void loop()
{
  tmElements_t ti;
  RTC.read(ti);
  sec = ti.Second;

  BrightnessCheck(); // Проверяем датчик освещения
  LEDS.setBrightness(bri);
  DSTcheck();        //  СМЕНА цвета (ненужная функция, имхо).
  TimeAdjust();      // Проверяем время если сменилось на 1 цифру

  if ((sec >= 10 && sec <= 15) || (sec >= 45 && sec <= 50))    // на каких секундах показывать температуру
  {
    long preledColor = ledColor;  // запомним цвет
    TempToArray();                // выводим температура
    ledColor = preledColor;       // вернем цвет
    FastLED.show();
  }
  else if (sec >= 26 && sec <= 30)                            // на каких секундах показывать влажность
  {
    leds[14] = CRGB::Black;
    leds[15] = CRGB::Black;
    HumidityToArray();          // выводим влажность
    FastLED.show();
  }

  else  if (sec >= 31 && sec <= 35)                           // на каких секундах показывать давление
  {
    leds[14] = CRGB::Black;
    leds[15] = CRGB::Black;
    PressureToArray();           //выводим давление
    FastLED.show();
  }
  else
  {
    dots();
    TimeToArray();     // покажем время
    FastLED.show();
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

может кому пригодится

опять новички своими неумелыми ручонками полезли в отлаженный код?

Код СПЕЦИАЛЬНО был переписан так, чтобы не зависеть от числа светиков в сегменте. И что мы видим здесь? - опять натащили жестко закодированных цифр?

else if (sec >= 26 && sec <= 30)                            // на каких секундах показывать влажность
  {
    leds[14] = CRGB::Black;
    leds[15] = CRGB::Black;
    HumidityToArray();          // выводим влажность
    FastLED.show();
  }

Если вы не умеете писать правильно - нафига свое "творчество" тащить в массы?

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Блин. чет не подумал. Спасибо. Надо же как то учится.в массах может подскажут ошибки.

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

Блин. чет не подумал. Спасибо. Надо же как то учится.в массах может подскажут ошибки.

вы бы лучше внимательно ветку почитали, тут много примеров, как писать правильно

Например, в коде из сообщения #380 есть отдельная функция для зажигания точек

void BrightDots(boolean Dot_On)

можно, например, взять ее в свой код и заменить ею все прямые вызовы зажигания и гашения точек у вас в скетче - он еще и короче станет

Да вообще пройдитесь по ветке - возможно все, что вы хотели добавить в код - тут уже сделано

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

и эту и другие ветки уже не раз перечитал. К сожалению не нашел того, что хочу.( разделить точки и показ  градусов в формате 00.0  и цвет градусов в зависимость от температуры  хотя бы +-).

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

и эту и другие ветки уже не раз перечитал. К сожалению не нашел того, что хочу.( разделить точки и показ  градусов в формате 00.0  и цвет градусов в зависимость от температуры  хотя бы +-).

Ну я же написал., что "возможно, это уже есть".  В ветке уже столько вариантов. что по-моему там есть все.

А нет - добавляйте, но добавйте правильно :)

все перечисленное добавляется в код за 20 минут....

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

Fenicksnet пишет:

и эту и другие ветки уже не раз перечитал. К сожалению не нашел того, что хочу.( разделить точки и показ  градусов в формате 00.0  и цвет градусов в зависимость от температуры  хотя бы +-).

Ну я же написал., что "возможно, это уже есть".  В ветке уже столько вариантов. что по-моему там есть все.

А нет - добавляйте, но добавйте правильно :)

все перечисленное добавляется в код за 20 минут....

 

это легко и просто когда постоянно с этим сталкиваешься. может подскажете как лучше выделить эти точки. Спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

например возьмите упомянутую выше функцию

void BrightDots(boolean Dot_On)

и добавьте в нее еще два свои режима мигания точек.

Пусть при входном параметре 0 точки гаснут, при 1 - горят постоянно, 2 - мигают вместе, 3 - мигают попеременно

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

например возьмите упомянутую выше функцию

void BrightDots(boolean Dot_On)

и добавьте в нее еще два свои режима мигания точек.

Пусть при входном параметре 0 точки гаснут, при 1 - горят постоянно, 2 - мигают вместе, 3 - мигают попеременно

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

int GetTime()

и

void TimeToArray()

. да и как  потом вынести точку на температуру?

для меня это пока слишком сложно.

а если сделать так :

int DOT_X = LEDS_IN_SEGMENT * 14 ;


  else if (sec >= 26 && sec <= 30)                         
  {
    leds[DOT_X ] = CRGB::Black;
    leds[DOT_X + 1] = CRGB::Black;
    HumidityToArray();        
    FastLED.show();
  }

а если точек больше чем 2.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

я дико извеняюсь,  а если так?

/* часы ds3231,ws2812,bme280,яркость, кнопки установки час. мин.
   влезает в atmega 168pa. вывод давления, влажности,температуры с точкой 1/10. цвет цифр температуры зависит от температуры(
   МЕНЬШЕ равно 00 СИНИЙ, ВЫШЕ 00 КРАСНЫЙ) , точки РАЗДЕЛЕНЫ мигают поочередно или одновременно.
  A4  SDA
  A5  SCL
*/

#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>

#define DATA_PIN 7            //  подключение ленты    PIN --> R100 --> Din
#define M_PIN A3              // установка часов       GND --> КНОПКА --> PIN
#define H_PIN A2              // установка минут       GND --> КНОПКА --> PIN
#define D_PIN A1              // смена цвета           GND --> КНОПКА --> PIN
#define BRI_PIN A6            // фоторезистор          GND --> RES --> BRI_PIN --> R10K --> +5V

#define LEDS_IN_SEGMENT 1     // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 9           // Задаём количество разделительных точек
#define COLOR_CHANGE 1        // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16         // цветовая гамма
#define COLOR_ORDER GRB       // По умолчанию цвет стоит зелёный при выключенных режимах
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 255        // максимальная яркость (0 - 255) если автоматическая подстройка яркости выключена, то яркость будет равна указаной 
#define min_bright 30         // минимальная яркость (0 - 255)
#define bright_constant 1000  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.2              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость

#define DDOT 1                 // РЕЖИМ ТОЧЕК 1- если точек 2 (DOTS_NUM = 2) мигают поочередно , 0 - мигают одновременно
int d;
int sec;
int bri ;

int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

Adafruit_BME280 bme;            // BME280 давление, влажность, температура   I2C

// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)  //количество светодиодов в ленте
CRGB leds[NUM_LEDS];
#define DOT_X (LEDS_IN_SEGMENT * 14 )              //  точек


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
  0b01011000,     // Digit с  маленькая  "С" вверху 15
};

//bool DST = false;
int last_digit = 0;
long ledColor;

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::Green,
  CRGB::Orchid,
  CRGB::DarkOrchid
};

void setup()

{
  ledColor = CRGB::Blue; // Используемый цвет
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  bme.begin(0x76); //датчик температуры
  pinMode(D_PIN, INPUT_PULLUP);      // Кнопка смены цветов            GND --> КНОПКА --> PIN
  pinMode(H_PIN, INPUT_PULLUP);      // Кнопка установка часов         GND --> КНОПКА --> PIN
  pinMode(M_PIN, INPUT_PULLUP);      // Кнопка установки минут         GND --> КНОПКА --> PIN
  pinMode(BRI_PIN, INPUT_PULLUP);    // фоторезистор    GND --> фоторез --> PIN --> R10K --> +5V
  //  A4  SDA
  //  A5  SCL
}

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 == 1)        // если включена адаптивная яркость
  {
    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)
      bri = 255 - new_bright_f;
    }
  }
  else
  {
    bri = max_bright;     // если выключена адаптивная яркость
  }
}
int GetTime()         //  Получаем время
{
  tmElements_t Now;
  RTC.read(Now);
  int hour = Now.Hour;
  int minute = Now.Minute;
  return (hour * 100 + minute);
}
void TimeToArray()    // Преобразуем время в массив для отображание
{
  int Now = GetTime();                                // Получаем время

  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;
    }
    BrightDigit(digits[digit], cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  }
}
//Функция вывода метеоданных

void TempToArray()          //Измеряем и выводим температуру
{ int celsius =  (bme.readTemperature() * 10);

  dot_off();                    // погасим точки

  if (celsius > 0)              // если + красные цифры
  {
    ledColor = CRGB::Red;
    leds[DOT_X ] = CRGB::Red;
  }
  else if (celsius <= 0 )        // если -  синие цифры
  {
    ledColor = CRGB::Blue;
    leds[DOT_X ] = CRGB::Blue;
  }

  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));                       //  маленький знака Цельсия (с) 4й блокn

  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й блок вывода второго символа

  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));       //  1й блок вывода первого символаo
}

void PressureToArray()       // Измеряем и выводим давление
{
  int p = bme.readPressure() / 133.322;  //int p = bmp.readPressure() / 133.322;c
  int Pressure = p;

  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));        //  начало знака Давления (Р) 1й блокh

  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7  ));              //  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14 ));             //  3й блок вывода второй цифры значенияk
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //  2й блок вывода первой цифры значения
}

void HumidityToArray()         //Измеряем и выводим влажности
{
  int h = bme.readHumidity();
  int humidity = h;

  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));                 //  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14 ));               //  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок вывода второго символаA
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //  1й блок вывода первого символа
}
//========================
void DSTcheck()                //смена цвета ленты кнопкой DST Pin
{
  int buttonDST = digitalRead(D_PIN);
  if (buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  };
  delay(100);//время реакции на нажатие
}

void TimeAdjust()         // Массив управляет кнопками с часами и минутами
{
  int buttonH = digitalRead(H_PIN);
  int buttonM = digitalRead(M_PIN);
  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 dots()                   // мигаем точками
{
  if (DOTS_NUM == 2)  // если тoчек 2
  {
    if (DDOT == 1)   // мигаем поочереди
    {
      if (sec % 2 == 0)
      {
        leds[DOT_X ] = ledColor;
        leds[DOT_X + 1 ] = CRGB::Black;
      }
      else
      {
        leds[DOT_X ] = CRGB::Black;
        leds[DOT_X + 1] = ledColor;
      }
    }
    else  if (DDOT == 0 )         // мигают одновременно
    {
      if (sec % 2 == 0)
      {
        for (int y = 0; y < DOTS_NUM ; y++)
        {
          leds[DOT_X + y ] = ledColor;
        }
      }
      else
      {
        dot_off();           // погасим точки
      }
    }
  }
  else //if (DOTS_NUM != 2)
  {
    if (sec % 2 == 0)
    {
      for (int y = 0; y < DOTS_NUM ; y++)
      {
        leds[DOT_X + y ] = ledColor;
      }
    }
    else
    {
      dot_off();        // погасим точки
    }
  }
}
void dot_off()  // Функция гасит все точки
{
  for (int y = 0; y < DOTS_NUM ; y++)
  {
    leds[DOT_X + y ] = CRGB::Black;
  }
}
//===========
void loop()
{
  tmElements_t ti;
  RTC.read(ti);
  sec = ti.Second;

  BrightnessCheck();                  // Проверяем датчик освещения
  LEDS.setBrightness(bri);
  DSTcheck();                        //  СМЕНА цвета (ненужная функция, имхо).
  TimeAdjust();                      // Проверяем время если сменилось на 1 цифру

  if ((sec >= 10 && sec <= 15) || (sec >= 45 && sec <= 50))    // на каких секундах показывать температуру
  {
    long preledColor = ledColor;  // запомним цвет
    TempToArray();                // выводим температура
    ledColor = preledColor;       // вернем цвет
    FastLED.show();
  }
  else if (sec >= 26 && sec <= 30)                            // на каких секундах показывать влажность
  {
    dot_off();             // погасим точки
    HumidityToArray();          // выводим влажность
    FastLED.show();
  }

  else  if (sec >= 31 && sec <= 35)                           // на каких секундах показывать давление
  {
    dot_off();             // погасим точки
    PressureToArray();           //выводим давление
    FastLED.show();
  }
  else
  {
    dots();                      // точки
    TimeToArray();               // покажем время
    FastLED.show();
  }
}

 

начинающий
Offline
Зарегистрирован: 13.12.2020

Fenicksnet пишет:

020 #define DOTS_NUM 9           // Задаём количество разделительных точек

Девять разделительных точек, интересно почему так и зачем, схемой не поделитесь что бы интуитивно сделать к ней "привязку" скетча?

а девятка вставлена случайно или умышленно, что бы неучи поломали голову почему "что то пошло не так" ?

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

начинающий пишет:

Fenicksnet пишет:

020 #define DOTS_NUM 9           // Задаём количество разделительных точек

Девять разделительных точек, интересно почему так и зачем, схемой не поделитесь что бы интуитивно сделать к ней "привязку" скетча?

а девятка вставлена случайно или умышленно, что бы неучи поломали голову почему "что то пошло не так" ?

9 точек просто чтоб проверить, 2 точки+ 1 цифрат(7 точек, для удобства). суть разделения точек: 1. выводить температуру с 1 десятой; 2. просто так красивей(имхо). можно было добавить эти гребаные точки на другой пин , но свободных нет. Часы собраны разбирать и перепаивать не хоцца.  Попытка переписать почти весь скетч для подключения ещё 8 кнопок управления освещением через радио канал.   delay немного мешает.

начинающий
Offline
Зарегистрирован: 13.12.2020

ок, все понял, спасибо за ответ.

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

9 точек просто чтоб проверить, 2 точки+ 1 цифрат(7 точек, для удобства). суть разделения точек: 1. выводить температуру с 1 десятой; 2. просто так красивей(имхо). можно было добавить эти гребаные точки на другой пин , но свободных нет. Часы собраны разбирать и перепаивать не хоцца.  Попытка переписать почти весь скетч для подключения ещё 8 кнопок управления освещением через радио канал.   delay немного мешает.

все равно не понял, что вам дают 9 точек.... И как вы вообще можете менять их число, если у вас схема уже спаяна...

Что касается вашего кода выше - он явно лучше того, что вы выкладывали в первый раз, но насколько будет работать - я просто по коду судить не возьмусь.

на самом деле будьте смелее - пробуйте и проверяйте сами, мне кажется у вас получается

b707
Offline
Зарегистрирован: 26.05.2017

начинающий пишет:

схемой не поделитесь что бы интуитивно сделать к ней "привязку" скетча?

начинающий. еще месяц прошел - а вы все схему ищете? :) на форуме Гайвера тоже не покатило, что ли? :)

 

начинающий
Offline
Зарегистрирован: 13.12.2020

А вдруг у автора "не типичная" схема, интересно же, вдруг захочется повторить.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Девять точек мне не надо, просто проверял убралась ли жесткая привязка к светикам и корректны ли символы после точек. код вроде работает как и задумывал и  1 и 2.  Вы писали:  "опять новички своими неумелыми ручонками полезли в отлаженный код?  Код СПЕЦИАЛЬНО был переписан так, чтобы не зависеть от числа светиков в сегменте. И что мы видим здесь? - опять натащили жестко закодированных цифр? "

я принял, понял, и попытался исправить.( вроде получилось).

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

 

bwn
Offline
Зарегистрирован: 25.08.2014

начинающий пишет:

А вдруг у автора "не типичная" схема, интересно же, вдруг захочется повторить.

Коллега, возьмите наконец схему и отстаньте от людей:

#define DATA_PIN 7            //  подключение ленты    PIN --> R100 --> Din
#define M_PIN A3              // установка часов       GND --> КНОПКА --> PIN
#define H_PIN A2              // установка минут       GND --> КНОПКА --> PIN
#define D_PIN A1              // смена цвета           GND --> КНОПКА --> PIN
#define BRI_PIN A6            // фоторезистор          GND --> RES --> BRI_PIN --> R10K --> +5V

Часы и балдометр - А4, А5, ардуино на Atmega168/328, если нет подтяжек на модулях, то по 4к7 к +5В.
От розетки, фазный провод, в разрыв выключателя.

начинающий
Offline
Зарегистрирован: 13.12.2020

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

GennOk
Offline
Зарегистрирован: 30.03.2015

b612 пишет:

начинающий пишет:
Ну не все же работают в газпроме, есть места еще и за МКАДом
за мкадом только одно большое МЕСТО.
Мы почти все в нём живём

За МКАДом - Россия!

nachinaushii
Offline
Зарегистрирован: 01.04.2021

здравствуйте, попробовал вашу прошивку   скомпилировать и у меня ошибка  invalid digit "8" in octal constant   . может дело в библиотеках сможете  скинуть  их,и что связаноо с этой прошивкой и схему подключения .спасибо 

nachinaushii
Offline
Зарегистрирован: 01.04.2021

а в прошивке один или два датчика?

b707
Offline
Зарегистрирован: 26.05.2017

nachinaushii пишет:

здравствуйте, попробовал вашу прошивку   скомпилировать и у меня ошибка  invalid digit "8" in octal constant   . может дело в библиотеках сможете  скинуть  их,и что связаноо с этой прошивкой и схему подключения .спасибо 

судя по всему - неправильно скачали код. Прочитайте прикрепленную тему в песочнице