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

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

KES пишет:

b707 пишет:

 

Не нраится(((

тогда переходи на Луг. Микросхем в SOP все больше и больше, Дип все меньше. Да и после того, как перешел на SOP, микрухи в ДИП кажутся огромными и уродливыми

KES
Offline
Зарегистрирован: 18.10.2018

sadman41

Извиняю))) за 700руб. не нада ...

KES
Offline
Зарегистрирован: 18.10.2018

b707 пишет:

тогда переходи на Луг. Микросхем в SOP все больше и больше, Дип все меньше. Да и после того, как перешел на SOP, микрухи в ДИП кажутся огромными и уродливыми

Я дип тоже иногда поверхностно паяю (без свеления) ноги ей раздвигаю)))

Лут у мня под SOP не получается пока.

Что ни кто носом не ткнёт-то? 

я про панельку...

leo_boy
Offline
Зарегистрирован: 25.04.2015

Поищи у этого продавца
10 шт. 28 Pin dip-sip ИС адаптер припоя Тип узкий
https://s.click.aliexpress.com/e/lZutJ9A

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Да ему пинхидер нужен.

Так на али и искать: "pin header" (без кавычек, раздельно).

KES
Offline
Зарегистрирован: 18.10.2018
sva_khv
Offline
Зарегистрирован: 19.12.2016

Чтоб не плодить темы спрошу сдесь.

Попались часы такие же большие. Индикаторы управляются  двумя 16 разрядными сдвиговыми регистрами STP16CP05.

Выкинул родной микроконтроллер и подключил к ним нанку. Настроил показ времени. Роботает.

Решил сделать регулировку яркости. Попробовал подавать ШИМ на вход G (разрешение работы выходных силовых транзиторов)

Яркость то уменьшилась. Но из-за помех показывает мусор. Попытка делать паузу в ШИМ при записи в регистры удачи не принесла.

Пока все собрано на макетке с длинными проводами. Есть ли смысл делать короткие провода, экранировать и т.д.?

Или не стоит вообще в этот вход с ШИМом лезть, а ставить полевик по питающему напряжению и туда подвать ШИМ?

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

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

Изначально у меня был скетч в котором все работало, но там было по 4 led в отрезке. На работе решил модернизировать старые ламповые часы Электроника 7. Заменить все потроха на яркую ленту. НО в цифровые блоки влезало только по 3 Led. Я пробовал изменить в скетче общее количчество диодов и изменить массив означающий количество диодов на ленте, но лента вообще молчит. Путем экспериментов выяснил, что лента зависает когда я изменяю общее количество диодов со 114 до нужных 86 (#define NUM_LEDS 114 ). Даже если я оставлю матрицу цифр в неизменной форме часы что то пытаются показать, хотя мигающие диоды (точки разделители) мигают со сдвигом в 14 диодов по ходу ленты. ПОдскажите, в каких местах ошибка

//Подключаем библиотеки
#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

//Подключаем кнопки и саму ленту, + прописываем их
#define NUM_LEDS 114 // 4*7*4+2  Задаём значение сколько у нас светодиодов. надо 3*7*4+2=86
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 13 // Подключение самой ленты
#define DST_PIN 4  // Переключение режимов
#define MIN_PIN 3  // Настройки минут
#define HUR_PIN 2  // Настройки часов

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов (P.S. Можно с этим поиграться!!)
byte digits[12][21] = {/*/{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},  //изменил количество led в блоке с 28 на 21
                       {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},  
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0},   
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1},  
                       {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1},   
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},   
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},   
                       {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}, 
                       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};   
                     */
{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},  // Digit 0
{0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
{1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
{0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
{0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;

//Настраиваем режимы 
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;

//Рандомный цвет 
long ColorTable[16] = {
  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
};


void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(75); // Задаём яркость
  pinMode(DST_PIN, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(MIN_PIN, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(HUR_PIN, INPUT_PULLUP); // Кнопка регулировки часов 
   
} 

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 86; // Задаём значение сколько у нас светодиодов
  if (DST){   // Если DST верное = добовляем один час
  
   
   //Дальше идёт очень скучно 
   Now+=100;
  }; 
  if (Dot){leds[57]=ledColor;
           leds[56]=ledColor;}   
    else  {leds[57]=0x000000;
           leds[56]=0x000000;
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 86;
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =58;
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =28;
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      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 ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 86; // Задаём значение сколько у нас светодиодов
    leds[57]=0x000000;
    leds[56]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =58;
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[10][k]);
        if (digits[10][k]== 1){leds[cursor]=ledColor;}
         else if (digits[10][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==3){
      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==4){
      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(2);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }

//Меняем эффекты 
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()  
{ 
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

если у вас

#define NUM_LEDS 86

 то смотрим далее, !!!ЖИРНЫМ ДЛЯ ВАС!!!

void TimeToArray(){
  int Now = GetTime();  // Получаем время
  int cursor = 86; // Задаём значение сколько у нас светодиодов !!!ТУТ ВСЁ ВЕРНО!!!
  if (DST){   // Если DST верное = добовляем один час

   //Дальше идёт очень скучно !!!НО ВНИМАТЕЛЬНО!!!
   Now+=100;
  };
  if (Dot){leds[57]=ledColor; //!!!ЭТО У НАС ТОЧКИ МИГАЮТ, ГОРЯТ НЕ ГОРЯТ!!!
           leds[56]=ledColor;}  //!!!ЕСЛИ У НАС 86 ДИОДОВ ТО ТОЧКИ ПО СЕРЕДИНЕ, ТО ЕСТЬ НЕ 57-56, А 42-43, МЕНЯЕМ!!!
    else  {leds[57]=0x000000;   //!!!И ТУТ ТОЖЕ МЕНЯЕМ!!!
           leds[56]=0x000000;  
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени
    if (i==1){
      cursor = 86;   //!!!ДАЛЕЕ СМОТРИМ, ЭТО НАЧАЛО ПОСЛЕДНЕЙ ЦИФРЫ, НЕ КОНЕЦ. НАЧАЛО 65. ДЛЯ ОСТАЛЬНЫХ ЦИФР АНАЛОГИЧНО cursor = 44, cursor = 21, cursor = 0 !!
      for(int k=0; k<=27;k++){
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
   
dj-toxa
Offline
Зарегистрирован: 06.04.2016

!!!НЕ ЗАБЫВАЕМ ТО ЖЕ САМОЕ!!! проделать в void TempToArray(){

dj-toxa
Offline
Зарегистрирован: 06.04.2016

а по хорошему если лезет три диода проще было делать на WS2811, на ней три диода это пиксель, управляемые одной микросхемой. меньше цифры #define NUM_LEDS 29 проще разбираться =) 

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

dj-toxa пишет:

если у вас

#define NUM_LEDS 86

 то смотрим далее, !!!ЖИРНЫМ ДЛЯ ВАС!!!

  if (Dot){leds[57]=ledColor; //!!!ЭТО У НАС ТОЧКИ МИГАЮТ, ГОРЯТ НЕ ГОРЯТ!!!
           leds[56]=ledColor;}  //!!!ЕСЛИ У НАС 86 ДИОДОВ ТО ТОЧКИ ПО СЕРЕДИНЕ, ТО ЕСТЬ НЕ 57-56, А 42-43, МЕНЯЕМ!!!

Большое спасибо за помощь. НО какая то фигня получается. Количество светодиодиов если выставить 86, то лента не горит, на сом порту идет постоянный шум, на дуне постоянно горит диод ТХ (хотя раньше он моргал в такт секундам). При 114 начинается представление. Вроде и правильно, но некоторые диоды стоят не на своих местах. Разделительные точки вообще не мигают. Светятся постоянно

 

//Подключаем библиотеки
#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

//Подключаем кнопки и саму ленту, + прописываем их
#define NUM_LEDS 114 // 4*7*4 +2  Задаём значение сколько у нас светодиодов
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 13 // Подключение самой ленты
#define DST_PIN 4  // Переключение режимов
#define MIN_PIN 3  // Настройки минут
#define HUR_PIN 2  // Настройки часов



//Настройки СВЕТОДИОДОВ (НЕ ТРОГАТЬ!!!! и наче не заработает, проверенно мною)
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов (P.S. Можно с этим поиграться!!)
/*/byte digits[12][28] = {{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},  
                       {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},  
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0},   
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1},  
                       {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1},   
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},   
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},   
                       {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}, 
                       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};   
                       //Если вы хотите изменить что-то достаточно к примеру {1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1} ПОМНИТЕ!!!
                       //Если вы хотите изменитьь что-то своё в этом месте не забывайте про фигурную скобку и наче компелятор выдаст ошибку!!!!   
                       //Пример {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},  
                       //ПОМНИ!! {0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; //Именно где вы прописали что-то своё завершаем цикл!
                     
*/
      byte digits[12][21] = {{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 0
                             {0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
                             {1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
                             {1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
                             {1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
                             {1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
                             {1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
                             {0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
                             {1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
                             {1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
                             {1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
                             {0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
    
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;

//Настраиваем режимы 
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;

//Рандомный цвет 
long ColorTable[16] = {
  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
};


void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(75); // Задаём яркость
  pinMode(DST_PIN, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(MIN_PIN, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(HUR_PIN, INPUT_PULLUP); // Кнопка регулировки часов 
   
} 

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 114; // Задаём значение сколько у нас светодиодов
  if (DST){   // Если DST верное = добовляем один час
  
   
   //Дальше идёт очень скучно 
   Now+=100;
  }; 
  if (Dot){leds[42]=ledColor;// координаты мигающих точек
           leds[43]=ledColor;}// координаты мигающих точек   
    else  {leds[42]=0x000000;// координаты мигающих точек
           leds[43]=0x000000;// координаты мигающих точек
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 65; //начало последней цифры, НЕ КОНЕЦ
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =44;//начало третьей цифры
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =21; //начало второй цифры
      for(int k=0; k<=27;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      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 ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 114; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;// координаты мигающих точек
    leds[43]=0x000000;// координаты мигающих точек
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 65; //начало последней цифры, НЕ КОНЕЦ
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =44;//начало третьей цифры
      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 =21; //начало второй цифры
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==4){
      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0; //начало первой цифры
      for(int k=0; k<=27;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(2);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }

//Меняем эффекты 
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()  
{ 
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

OdinochkA пишет:

НО какая то фигня получается

вы уже определитесь если делаете под 86 диодов то на них и сосредоточтесь, а то у вса в #define NUM_LEDS 114, а цифры расписаны на 86, ясен пень что будет чёрти чё показывать, да еще проглядел !!!ТУТ ТОЖЕ МЕНЯЕМ!!!  for (int k = 0; k <= 27; k++)   на   for (int k = 0; k <= 20; k++) {   повторяем это везде далее по скетчу для каждой цифры

      cursor = 65; //начало последней цифры
      for(int k=0; k<=27;k++){  // !!!27 ЭТО ДЛЯ 4 ДИОДОВ НА СЕГМЕНТ, У НАС ДИОДА ТРИ. МЕНЯЕМ НА k <=20 !!!
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){

   

dj-toxa
Offline
Зарегистрирован: 06.04.2016

для точек попробуем это 

void TimeToArray(){
  int Now = GetTime();  // Получаем время
  int cursor = 114; // Задаём значение сколько у нас светодиодов
  if (DST){   // Если DST верное = добовляем один час
    
   //Дальше идёт очень скучно 
   Now+=100;
  }; 
  if (Dot){leds[42]=ledColor;// координаты мигающих точек
           leds[43]=ledColor;}// координаты мигающих точек   
    else  {leds[42]=0x000000;// координаты мигающих точек
           leds[43]=0x000000;// координаты мигающих точек
    };

заменить на это

void TimeToArray() {
  int Now = GetTime(); 
  int cursor = 86;

  if (Dot) {
    leds[42] = ledColor;
    leds[43] = ledColor;
  }
  else {
    leds[42] = 0x000000;
    leds[43] = 0x000000;
  };

 

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

dj-toxa пишет:
вы уже определитесь если делаете под 86 диодов то на них и сосредоточтесь, а то у вса в #define NUM_LEDS 114, а цифры расписаны на 86, ясен пень что будет чёрти чё показывать, да еще проглядел !!!ТУТ ТОЖЕ МЕНЯЕМ!!!  for (int k = 0; k <= 27; k++)   на   for (int k = 0; k <= 20; k++) {   повторяем это везде далее по скетчу для каждой цифры     

Доброго времени. Спасибо ещё раз. Выше я писал, что при выставлении значения NUM_LEDS 86 в эфире сом порта идет постоянный шум. Лента не светится, либо зависает на последнем перед загрузкой изображении. Начинает более менее что-то пытаться изобразить если поставить любое значение больше 86. ПОэтому на том примере я скопировал из залитого скетча. По последним вашим изменениям почти ничего не произошло (( Мигать начал один светодиод который идет по счету 44 и расположен снизу. Верхняя точка(43) горит постоянно. В цифрах таже каша осталась. (((

dj-toxa
Offline
Зарегистрирован: 06.04.2016

скетч со всеми изменениями в студию, что значит в эфире сом порта идет постоянный шум? кроме всего прочего пробуем после прошивки, включать всё автономно, не используя подключения к ПК

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

&quot;шум&quot; com порта

 

#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define NUM_LEDS 87 // 3*7*4+2 если 3 led    4*7*4+2  Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 13 // Подключение самой ленты
#define DST_PIN 4  // Переключение режимов
#define MIN_PIN 3  // Настройки минут
#define HUR_PIN 2  // Настройки часов

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][21] = {
{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 0
{0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
{1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
{0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
{0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;

//Настраиваем режимы 
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;

//Рандомный цвет 
long ColorTable[16] = {
  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
};


void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(75); // Задаём яркость
  pinMode(DST_PIN, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(MIN_PIN, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(HUR_PIN, INPUT_PULLUP); // Кнопка регулировки часов 
} 

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 86; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
   
   //Дальше идёт очень скучно 
//   Now+=100;
//  }; 
  if (Dot){leds[42]=ledColor;
           leds[43]=ledColor;}   
    else  {leds[42]=0x000000;
           leds[43]=0x000000;
    };*/
    
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 86;// Задаём значение сколько у нас светодиодов

  if (Dot) {
    leds[42] = ledColor;  //координаты мигающих точек
    leds[43] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[42] = 0x000000;  //координаты мигающих точек
    leds[43] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 66;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =45;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =22;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=20;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 86; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 66;
      for(int k=0; k<=20;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =45;
      for(int k=0; k<=20;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 =22;
      for(int k=0; k<=20;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<=20;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(2);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }

//Меняем эффекты 
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()  
{ 
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

пробуем так 

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
#define NUM_LEDS 86 //   Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER BGR  // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][21] = {
{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 0
{0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
{1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
{0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
{0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;
long ledColor = CRGB::DarkOrchid; // Используемый цвет
long ledColor = CRGB::MediumVioletRed;
long ColorTable[16] = {
  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
};


void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
  LEDS.setBrightness(150); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов 
} 

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 86; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
   
   //Дальше идёт очень скучно 
//   Now+=100;
//  }; 
  if (Dot){leds[42]=ledColor;
           leds[43]=ledColor;}   
    else  {leds[42]=0x000000;
           leds[43]=0x000000;
    };*/
    
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 86;// Задаём значение сколько у нас светодиодов
 if (DST){  
   Now+=100;
  }; 
  if (Dot) {
    leds[42] = ledColor;  //координаты мигающих точек
    leds[43] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[42] = 0x000000;  //координаты мигающих точек
    leds[43] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon ();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =44;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =21;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=20;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 86; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =44;
      for(int k=0; k<=20;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 =21;
      for(int k=0; k<=20;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<=20;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(4);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   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()  
{ 
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

не знаю глаза болят после работы, долго не могу вглядываться, но бегло вроде всё верно и должно работать. кое где поправил, но в целом всё норм

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

Урааа. Заработало. Спасибо огромнейшее.

Сравнил код, изменений минимум.  Эта строка была раньше, но частично закоментированна. Неужели из-за неё такая каша в цифрах была?

if (DST){   
Now+=100; 
 }; 

Пины кнопок по другому привязаны)

Ещё прикрутил ещё датчик освещения. Вроде работает. Но остался последний момент который хотел бы спросить. Как убрать ежеминутное обновление цвета? Пусть лучше я сам руками буду менять цвет, хотя бы кнопкой которая сейчас DST. Этот режим все равно не нужен, нет у нас перевода часов.

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

#define NUM_LEDS 86 //   Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER BGR  // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][21] = {
{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 0
{0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
{1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
{0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
{0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[16] = {
  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
};

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); // Кнопка регулировки часов   изменилась привязка
} 

// снова датчик света
// Check Light sensor and set brightness accordingly
void BrightnessCheck(){
const byte sensorPin = 6; // пин датчика освещения
const byte brightnessLow = 15; // мимальное значение освещения //75
const byte brightnessHigh = 185; // максимальное значение освещения //100
int sensorValue = digitalRead(sensorPin); // опрос датчика
if (sensorValue == 0) {
Serial.println("Brightness High");
LEDS.setBrightness(brightnessHigh);
}
 else {
Serial.println("Brightness Low");
LEDS.setBrightness(brightnessLow);
}
};

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 86; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
   
   //Дальше идёт очень скучно 
//   Now+=100;
//  }; 
  if (Dot){leds[42]=ledColor;
           leds[43]=ledColor;}   
    else  {leds[42]=0x000000;
           leds[43]=0x000000;
    };
*/
    
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 86;// Задаём значение сколько у нас светодиодов
  
 if (DST){   //добавилось
   Now+=100; //добавилось
  };         //добавилось
  
  if (Dot) {
    leds[42] = ledColor;  //координаты мигающих точек
    leds[43] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[42] = 0x000000;  //координаты мигающих точек
    leds[43] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon ();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =44;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =21;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=20;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 86; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =44;
      for(int k=0; k<=20;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 =21;
      for(int k=0; k<=20;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<=20;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(4);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   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();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

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

Осталось датчик температуры нормальный прикрутить и вообще огонь будет. Как-то не доверяю температурному датчику в DS3231

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

OdinochkA пишет:

Как-то не доверяю температурному датчику в DS3231

Не, датчик там хороший, только меряет не там где надо.))))

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

OdinochkA пишет:

Урааа. Заработало. Спасибо огромнейшее.

а мне кажется весь затуп тут был LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); датчик освещения конечно хорошо, но вешать нужно на аналоговый выход (при условии что датчик имеет аналоговый выход) для плавной регулировки яркости, на цифровом будет либо темно-либо светло (0 или 1) во время перехода часы будут мерцать.

void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; 
  // const byte brightnessLow = 100;
  //const byte brightnessHigh = 170; 
  int sensorValue = analogRead(sensorPin); 
  Serial.print("Ambient is: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 10, 100);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessHigh);}
  // else {LEDS.setBrightness(brightnessLow);}  
  };

 

dj-toxa
Offline
Зарегистрирован: 06.04.2016

OdinochkA пишет:

Осталось датчик температуры нормальный прикрутить и вообще огонь будет. Как-то не доверяю температурному датчику в DS3231

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

dj-toxa
Offline
Зарегистрирован: 06.04.2016

OdinochkA пишет:

Урааа. Заработало. Спасибо огромнейшее.

Сравнил код, изменений минимум.

минимум не минимум, а в коде каждая закарючка важна, где то запятую или скобку пропустил и кирдык =) глаза сотрёшь пока найдёшь =)

dj-toxa
Offline
Зарегистрирован: 06.04.2016

ждем фотоотсчет =) и готовый код для моей копилки скетчей

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

dj-toxa пишет:

датчик освещения конечно хорошо, но вешать нужно на аналоговый выход (при условии что датчик имеет аналоговый выход) для плавной регулировки яркости, на цифровом будет либо темно-либо светло (0 или 1) во время перехода часы будут мерцать.

void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; 
  // const byte brightnessLow = 100;
  //const byte brightnessHigh = 170; 
  int sensorValue = analogRead(sensorPin); 
  Serial.print("Ambient is: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 10, 100);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessHigh);}
  // else {LEDS.setBrightness(brightnessLow);}  
  };

Доброго времени. У меня этот кусок заработал только в таком виде

//Массив управляет яркостью
void BrightnessCheck(){
  const byte sensorPin = 6;    //BRI_PIN
     const byte brightnessLow = 10;
     const byte brightnessHigh = 200; 
  int sensorValue = analogRead(sensorPin); 
  Serial.print("Ambient is: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue,255, 0, 10, 100);
  LEDS.setBrightness(sensorValue);
   if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
   else {LEDS.setBrightness(brightnessHigh);}  //если светло то максимум
  };

Датчик освещения у меня такой  (я надеюсь здесь можно такие ссылки, если нет, то извините я удалю). Он кажется цифровой. Хотя дома есть ещё и такой, и на нём кажется есть аналоговый выход.

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

Понимаю, что уже наглею, но есть ещё просьба. Я наковырял код для BMP180, исправил его под свои нужды, он компилируется и в мониторе выдает температуру. Но вставить в нужное место, чтобы дуня брала инфу с него а не с DS я не могу. Теоретически я представляю, что он заменяет массив температурного опроса и вывода, но ....

BMP180 подключен паралельно с часами DS3231 по I2C (А4 и А5)

Помогите ещё разочек.

Привожу общий скетч с вставленным и закоментированным кодом температуры и целый скетч для BMP с коментариями

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

#include <SFE_BMP180.h>//датчик температуры

#define NUM_LEDS 86 //   Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах BGR
#define DATA_PIN 13

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][21] = {
{0,0,0, 1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 0
{0,0,0, 1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 1
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0},   // Digit 2
{1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 3
{1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 4
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 5
{1,1,1 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 6
{0,0,0 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0 ,1,1,1},   // Digit 7
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1},   // Digit 8
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,1,1,1 ,1,1,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0 ,0,0,0 ,0,0,0},   // Digit *0
{0,0,0 ,0,0,0 ,1,1,1 ,1,1,1 ,1,1,1 ,1,1,1 ,0,0,0}};  // Digit C
             
bool Dot = true;  
//bool DST = false; 
bool TempShow = true;
int last_digit = 0;


//ПРОбуем настроить цвет на кнопку
/*
void LedColor(){
  int buttonL = digitalRead(4);
    if (buttonL == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int LedColor=Now.LedColor;
    if (buttonL == LOW){
        if (Now.LedColor== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }
*/

long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[16] = {
  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
};

void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
  
  pinMode(4, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов 
} 
/*/
// снова датчик света
// Check Light sensor and set brightness accordingly
void BrightnessCheck(){
const byte sensorPin = 6; // пин датчика освещения
const byte brightnessLow = 45; // мимальное значение освещения //75
const byte brightnessHigh = 200; // максимальное значение освещения //100
int sensorValue = digitalRead(sensorPin); // опрос датчика
if (sensorValue == 0) {
Serial.println("Brightness High");
LEDS.setBrightness(brightnessHigh);
}
 else {
Serial.println("Brightness Low");
LEDS.setBrightness(brightnessLow);
}
};
*/

//Массив управляет яркостью
void BrightnessCheck(){
  const byte sensorPin = 6;    //BRI_PIN
     const byte brightnessLow = 10;
     const byte brightnessHigh = 200; 
  int sensorValue = analogRead(sensorPin); 
  Serial.print("Ambient is: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue,255, 0, 10, 100);
  LEDS.setBrightness(sensorValue);
   if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
   else {LEDS.setBrightness(brightnessHigh);}  //если светло то максимум
  };


//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
int cursor = 86; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
//Дальше идёт очень скучно 
Now+=100;
}; 
if (Dot){leds[42]=ledColor;
leds[43]=ledColor;}   
else  {leds[42]=0x000000;
leds[43]=0x000000;
};
*/
    //массив часов
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 86;// Задаём значение сколько у нас светодиодов
  
/* if (DST){   //не используется за ненадобностью
   Now+=100; //не используется за ненадобностью
  };         //не используется за ненадобностью
  */
  
  if (Dot) {
    leds[42] = ledColor;  //координаты мигающих точек
    leds[43] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[42] = 0x000000;  //координаты мигающих точек
    leds[43] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon ();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =44;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =21;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=20;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение


//массив температуры, если что вернуть назад

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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 86; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 

/*/
    //используется датчик BMP180, в нём только температура. в принципе он может и давление
    //но оно всё равно не выводится никуда
    
void loop(){
    double T;//было P
    T = getPressure();//было P
    Serial.println(T, 0); //было P, после запятой это количество знаков после запятой
    delay(30000);// интервал опроса датчика 30с
}
double getPressure(){
    char status;
    double T;//,P,p0,a;
    status = pressure.startTemperature();
    if (status != 0){
        // ожидание замера температуры
        delay(status);
        status = pressure.getTemperature(T);
        if (status != 0){
           // status = pressure.startPressure(3); //не нужно
           // if (status != 0){                  //не нужно
                // ожидание замера давления    //не нужно
                //delay(status);                //не нужно
                //status = pressure.getPressure(P,T);  //не нужно
               // if (status != 0){              //не нужно
                    return(T);//было P
                                  //}        //не нужно
            //}                              //не нужно
        }
    }
}
*/
    
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 65;
      for(int k=0; k<=20;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =44;
      for(int k=0; k<=20;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 =21;
      for(int k=0; k<=20;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<=20;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};
// массив отввечает за DST, надо перенести на него цвета
/*
 void DSTcheck(){
   int buttonDST = digitalRead(4);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   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();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (5000); //было 8000
}
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
void setup(){
    Serial.begin(9600);
    pressure.begin();
}
void loop(){
    double T;//было P
    T = getPressure();//было P
    Serial.println(T, 0); //было P, после запятой это количество знаков после запятой
    delay(30000);// интервал опроса датчика 30с
}
double getPressure(){
    char status;
    double T;//,P,p0,a;
    status = pressure.startTemperature();
    if (status != 0){
        // ожидание замера температуры
        delay(status);
        status = pressure.getTemperature(T);
        if (status != 0){
           // status = pressure.startPressure(3);
           // if (status != 0){
                // ожидание замера давления
                //delay(status);
                //status = pressure.getPressure(P,T);
               // if (status != 0){
                    return(T);//было P
                                  //}
            //}
        }
    }
}

Здесь ещё много мусора, но я подчищу когда код станет применим.

dj-toxa
Offline
Зарегистрирован: 06.04.2016

OdinochkA пишет:

Здесь ещё много мусора, но я подчищу когда код станет применим.

что бы подчищать, его понимать было бы не плохо =) а зачем ставить атмосферник с термометром, если нужна только температура, закажи рассыпуху даласовских датчиков или dht11 12

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

dj-toxa пишет:

что бы подчищать, его понимать было бы не плохо =) а зачем ставить атмосферник с термометром, если нужна только температура, закажи рассыпуху даласовских датчиков или dht11 12


Ну не моё это кодить. Я на словах могу объяснить, понять, рассказать, а вот код написать это прям за гранью моего понимания и умения. Я и сейчас то куски чисто по аналогии и интуиции подбираю и изменяю. В железе, пожалуйста, разберу соберу переберу. Я же не с пустыми руками пришел за помощью, наброски кода были. Спасибо за то что помогаете.
А на счёт такого датчика, это частично задел на будущее, если захочу на улицу вытащить или второй прикрутить. Да и bmp поточнее меряет чем dht11

Taras9696
Offline
Зарегистрирован: 01.03.2019

Народ спасите, в программировании 0, даже в коде не ариентируюсь, собрал часы на 30 светодиодов 2822, 1 диод на сегмент, но не знаю что изменять в прошивке

#define NUM_LEDS 30 // 7*1*4+2 =30
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 6 // Подключение самой ленты
#define DST_PIN 5  // Переключение режимов
#define MIN_PIN 4  // Настройки минут
#define HUR_PIN 2  // Настройки часов
 
изначально смотрел видео но их прошивка даже не компилируеться відает тучу ошибок
 
Сдесь же изменяю назмер матрици byte digits[12][21] 21 на 7 и гг(, просто оставляю в матрице по одному диоду но это ничего не дает, видел вы сдесь очень много всего изменяли но я даже не знаю с чего начать и какие у меня будут значения
 
if (Dot){leds[57]=ledColor; //!!!ЭТО У НАС ТОЧКИ МИГАЮТ, ГОРЯТ НЕ ГОРЯТ!!!
2

         leds[56]=ledColor;}  //!!!ЕСЛИ У НАС 86 ДИОДОВ ТО ТОЧКИ ПО СЕРЕДИНЕ, ТО ЕСТЬ НЕ 57-56, А 42-43, МЕНЯЕМ!!!

точки я так понимаю у меня будут 15 16
 

 
for(int k=0; k<=27;k++){  // !!!27 ЭТО ДЛЯ 4 ДИОДОВ НА СЕГМЕНТ, У НАС ДИОДА ТРИ. МЕНЯЕМ НА k <=20 !!!
Сдесь я не понимаю 4-27 3-20 1-?

 

Taras9696
Offline
Зарегистрирован: 01.03.2019

Итак изменил вроде все о чем писали выше, но код не компилируеться 

sketch_mar01b.ino:27:50: error: too many initializers for 'byte [7] {aka unsigned char [7]}'

 

#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>
 
#define NUM_LEDS 30 // 3*7*4+2 если 3 led    4*7*4+2  Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 6 // Подключение самой ленты
#define DST_PIN 5  // Переключение режимов
#define MIN_PIN 4  // Настройки минут
#define HUR_PIN 2  // Настройки часов
 
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][7] = {
{0, 1 ,1 ,1 ,1 ,1 ,1},   // Digit 0
{0, 1 ,0 ,0 ,0 ,0 ,1},   // Digit 1
{1, 1 ,1 ,0 ,1 ,1 ,0},   // Digit 2
{1, 1 ,1 ,0 ,0 ,1 ,1},   // Digit 3
{1, 1 ,0 ,1 ,0 ,0 ,1},   // Digit 4
{1, 0 ,1 ,1 ,0, 1 ,1},   // Digit 5
{1, 0 ,1 ,1 ,1 ,1 ,1},   // Digit 6
{0, 1 ,1 ,0 ,0 ,0 ,1},   // Digit 7
{1, 1 ,1 ,1 ,1 ,1 ,1},   // Digit 8
{1, 1 ,1 ,1 ,0 ,1 ,1},   // Digit 9 | 2D Array for numbers on 7 segment
{1, 1 ,1 ,1 ,0 ,0 ,0},   // Digit *0
{0, 0, 1 ,1, 1, 1, 0,}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;
 
//Настраиваем режимы 
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
 
//Рандомный цвет 
long ColorTable[16] = {
  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
};
 
 
void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(75); // Задаём яркость
  pinMode(DST_PIN, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(MIN_PIN, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(HUR_PIN, INPUT_PULLUP); // Кнопка регулировки часов 
 
//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 30; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
   
   //Дальше идёт очень скучно 
//   Now+=100;
//  }; 
  if (Dot){leds[15]=ledColor;
           leds[16]=ledColor;}   
    else  {leds[15]=0x000000;
           leds[16]=0x000000;
    };*/
    
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 30;// Задаём значение сколько у нас светодиодов
 
  if (Dot) {
    leds[15] = ledColor;  //координаты мигающих точек
    leds[16] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[15] = 0x000000;  //координаты мигающих точек
    leds[16] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 23;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =16;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =7;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=6;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};
 
// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 30; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 23;
      for(int k=0; k<=6;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =16;
      for(int k=0; k<=6;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 =7;
      for(int k=0; k<=6;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<=6;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};
 
void DSTcheck(){
   int buttonDST = digitalRead(2);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   delay(500);   
   };
  }
 
void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }
 
//Меняем эффекты 
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()  
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

 

Taras9696
Offline
Зарегистрирован: 01.03.2019

Итак все заработало, но не работает кнопка ПИН5, не понимаю что делает второй светодиод секунд, верхний мигает, а нижний просто горит, может что то не так в коде?

И еще вопрос, каждую минуту часы горят новым цветом, как сделать что б кнопка ПИН 5 по нажатию меняла цвет? ибо на моих часах некоторые цвета практически не видно

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

точки в void TimeToArray()  и void TempToArray() должны быть на 14 и 15. отчет ведется с нуля. Чтобы DSTcheck заработал нужно его привязать к указанному пину в строке void DSTcheck(){int buttonDST = digitalRead(5);

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

GennOk пишет:

точки в void TimeToArray()  и void TempToArray() должны быть на 14 и 15

Народ! Чтобы не заниматься этой трахомодией каждый раз, когда кто-то захочет поменять число диодов - нужно выкинуть все прямые указания на число светодиодов и их номера в коде. Например, у вас в начале кода есть константа NUM_LEDS  - так зачем в строчках 111 и 183 вы пишете ее цифрой -

cursor = 86?

Пишите так:

cursor = NUM_LEDS;

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

После этого для переделки часов под другое число диодов будет достаточно поправить 6-7 констант в начале кода, а не искать кучу цифр, разбросанных в программе. Да и код станет  короче, так как 4 совершенно одинаковых куска для каждой цифры можно будет заменить одним.

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

Не, а как же прелесть созидания? ))))

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

bwn пишет:

Не, а как же прелесть созидания? ))))

То есть "ковыряние в дерьме" теперь так называется?

Green
Offline
Зарегистрирован: 01.10.2015

У каждого свои представления. У кого то дерьмо, а у кого то и прелесть. И это нормально.

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

Green пишет:

У каждого свои представления. У кого то дерьмо, а у кого то и прелесть. И это нормально.

Код почти прелесть :), но написан как будто специально так, чтоб переделать его на другой размер мог бы только автор :) - видимо чтоб за каждую новую версию денег брать по новой :)

Green
Offline
Зарегистрирован: 01.10.2015

Я код не смотрел вообще, если честно. Я передаю идею, Вы понимаете?

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

andriano пишет:

bwn пишет:

Не, а как же прелесть созидания? ))))

То есть "ковыряние в дерьме" теперь так называется?

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

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

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

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

GennOk пишет:

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

где вы тут глум увидели? - эти изменения могли бы облегчить сопровождение кода в этой ветке. Разве это не полезная информация?

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

в том то и дело, что с вами я согласен. облегчение кода всегда положительно. насколько я понял, Тарас9696, как в прочем и я, не сильно разбирается в написании кода. И вот как раз такие подсказки, ввиде указания места, что и чем заменить помогают задающему вопрос. Кстати я тоже не знал, что можно так с NUMLEDS (#85 пост) хотя один из первых собрал эти часы. Я тоже не могу написать код, но в общих чертах могу его прочесть, что-то поменять местами, что-то заремировать. Спросить рядом практически не у кого, Ардуинщики редкие люди, вот в инет и лезешь получить помощь.

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

GennOk пишет:

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

Вам не нужны обязательно "ардуинщики". В ардуино используется язык программирования С/С++ - очень широко применяемый в ИТ. Не нашли "ардуинщика" - спросите у любого программиста.

В общем, если соберетесь улучшать код - спрашивайте, помогу.

Taras9696
Offline
Зарегистрирован: 01.03.2019

точки в void TimeToArray()  и void TempToArray() должны быть на 14 и 15. отчет ведется с нуля. Чтобы DSTcheck заработал нужно его привязать к указанному пину в строке void DSTcheck(){int buttonDST = digitalRead(5);

Спасибо, кнопки работают коректно, но смены режимов у вы не работают, ну и черт с ними в принцепи, просто немного напрягает постоянные смены цвета, каждую минуту

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

Taras9696 пишет:

просто немного напрягает постоянные смены цвета, каждую минуту

Смену цвета можно отключить. Если вы выложите свой код правильно - чтоб выглядел как в сообщении #70, а не как у вас в #82 - я вам напишу. какую строчку выкинуть, чтоб цвета не менялись

Taras9696
Offline
Зарегистрирован: 01.03.2019
#include <DS3232RTC.h>
#include <TimeLib.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define NUM_LEDS 30 // 3*7*4+2 если 3 led    4*7*4+2  Задаём значение сколько у нас светодиодов.
#define COLOR_ORDER GRB  // По умолчанию цвет стоит зелёный при выключенных режимах
#define LED_PIN 6 // Подключение самой ленты
#define DST_PIN 5  // Переключение режимов
#define MIN_PIN 4  // Настройки минут
#define HUR_PIN 2  // Настройки часов

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов 
byte digits[12][7] = {
{1,1,1,1,1,1,0},   // Digit 0
{0,0,1,1,0,0,0},   // Digit 1
{0,1,1,0,1,1,1 },   // Digit 2
{0,1,1,1,1,0,1 },   // Digit 3
{1,0,1,1,0,0,1 },   // Digit 4
{1,1,0,1,1,0,1 },   // Digit 5
{1,1,0,1,1,1,1 },   // Digit 6
{0,1,1,1,0,0,0 },   // Digit 7
{1,1,1,1,1,1,1 },   // Digit 8
{1,1,1,1,1,0,1 },   // Digit 9 | 2D Array for numbers on 7 segment
{1,1,1,0,0,0,1},   // Digit *0
{1,1,0,0,1,1,0}};  // Digit C
             
bool Dot = true;  
bool DST = false; 
bool TempShow = true;
int last_digit = 0;

//Настраиваем режимы 
long ledColor = CRGB::DarkOrchid; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;

//Рандомный цвет 
long ColorTable[16] = {
  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
};


void setup(){ 
  Serial.begin(9600); 
  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(75); // Задаём яркость
  pinMode(DST_PIN, INPUT_PULLUP); // Кнопка регулировки режимов
  pinMode(MIN_PIN, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(HUR_PIN, INPUT_PULLUP); // Кнопка регулировки часов 
} 

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 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();  // Получаем время
  int cursor = 30; // Задаём значение сколько у нас светодиодов
//  if (DST){   // Если DST верное = добавляем один час
   
   //Дальше идёт очень скучно 
//   Now+=100;
//  }; 
  if (Dot){leds[14]=ledColor;
           leds[15]=ledColor;}   
    else  {leds[14]=0x000000;
           leds[15]=0x000000;
    };*/
    
 void TimeToArray() {
  int Now = GetTime(); // Получаем время
  int cursor = 30;// Задаём значение сколько у нас светодиодов

  if (Dot) {
    leds[14] = ledColor;  //координаты мигающих точек
    leds[15] = ledColor;  //координаты мигающих точек
  }
  else {
    leds[14] = 0x000000;  //координаты мигающих точек
    leds[15] = 0x000000;  //координаты мигающих точек
  };
  
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // Получаем последнюю цифру в времени 
    if (i==1){
      cursor = 23;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;
      }
    else if (i==2){
      cursor =16;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =7;
      for(int k=0; k<=6;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =0;
      for(int k=0; k<=6;k++){ 
        // Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  }; 
};

// Преобразуем всё это в массив для отображение
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) * 100;
  Serial.print("Temp is: ");Serial.println(celsius);
  int cursor = 30; // Задаём значение сколько у нас светодиодов
    leds[42]=0x000000;
    leds[43]=0x000000;
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // Получаем последнюю цифру во времени 
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 23;
      for(int k=0; k<=6;k++){ 
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =16;
      for(int k=0; k<=6;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 =7;
      for(int k=0; k<=6;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<=6;k++){ 
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  }; 
};

void DSTcheck(){
   int buttonDST = digitalRead(5);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
      }
      else if (!DST){
        DST=true;
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(HUR_PIN);
  int buttonM = digitalRead(MIN_PIN);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now); 
    }
  }

//Меняем эффекты 
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()  
{ 
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру 
  TempToArray();
  FastLED.show(); // Задаём массив светодиодов 
  if (TempShow == true) delay (8000);
}

Вот код, еще обнаружилась такая вешь, кажые 21 минуту часы отключаются на 1 минуту, ардуино пашет, время не сбивается (батарейки нет), бп так же, пробовал 4 разных источников включая ноутбук, это не ошибка кода, если нет то какая цель, охлаждение?)

Digital ClockDigital Clock

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

Чтобы убрать изменение цвета каждую минуту - закомментируйте строку 122. После этого цвет часов будет всегда один и меняться только установкой значения в строке 35.

Возможны и другие варианты - например оставить смену цвета, но исключить те цвета, которые вам не нравятся. Сделать смену цвета пореже - например раз в час...

Насчет отключения каждые 21 минуту ничего сказать не могу

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

Есть предположение что строки 168 и 169 должны выглядеть вот так leds[14]=0x000000;leds[15]=0x000000; Это, как я понимаю, отключает точки во время показа температуры. По поводу отключения, возможно перегрев. Вы питаете диоды отдельно от ардуино? У меня, когда питание идет через USB ардуино, она начинает сильно греться и глючить.