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

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

sadman41 пишет:

Если резистор работает в обратную сторону - он может стоять не в том плече.

Ну, дык, куды китаясь прицепил. Вверх не полез, но если на модуле только делитель, то поменять местами питание, и усё.

P/S Виноват, не глянул, не прокатило.))))

P/P/S Возьмите обычный делитель и подключите к аналоговому пину как надо. ИМХО.

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

OdinochkA пишет:

то что резистор работает в обратную сторону, я с ним ничего не сделаю. Если только в коде указывать данные, чтобы это учитывать.

не надо с резистором ничего делать, все отлично настраивается программно

Цитата:
А вот что я действительно не могу понять в коде (помимо того что я в нём ничего не понимаю) так это строку 

new_bright_f = new_bright_f * coef - new_bright * (1 - coef); 

как для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент?? Не тут ли ошибка?

нет тут никакой ошибки. Разве что вы опять зачем то вставили в формулу "минус". Мы ведь вроде уже обсуждали, тут нужен "пдюс",  правильная формула -

new_bright_f = new_bright_f * coef + new_bright * (1 - coef);

А что до того, "что для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент??" - так это очень просто. Значение new_bright_f, стоящее в правой стороне формулы - это прежнее значение яркости, а в левой (в результате) - это то значение, которое мы вычисляем. И смысл этой формулы очень прост - берем 90% прежней яркости. прибавляем 10% нового значения - и так на каждом круге loop. Таким образом при смене освещения у нас яркость диодов не "прыгает", а меняется плавно.

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

В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)

ShevaLoL
Offline
Зарегистрирован: 21.09.2019

Здравствуйте! Решил себе поставить резистор на автояркость - не работает. Прикупил себе gy-30, но не понимаю к каким выводам его припаять, и нужно ли менять код? Подскажите пожалуйста.

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

ShevaLoL пишет:

Прикупил себе gy-30, но не понимаю к каким выводам его припаять, и нужно ли менять код? Подскажите пожалуйста.

На яндексе забанили чтоли? https://lesson.iarduino.ru/page/podklyuchaem-bh1750-datchik-osveschennosti-gy-30-gy-302-k-arduino/

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

b707 пишет:
И смысл этой формулы очень прост - берем 90% прежней яркости. прибавляем 10% нового значения - и так на каждом круге loop. Таким образом при смене освещения у нас яркость диодов не "прыгает", а меняется плавно.

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

В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)

Спасибо вам в который раз. Поправил всё. Часики работают. В ночи подсветка еле еле,и не засвечивает комнату.. Днём ярко

/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на 
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////Arduino.ru)))
*/

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

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

int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

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

//BMP280 PINS                   //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4

// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)  //114 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)       //114 количество светодиодов в ленте
//#define DOT1  (LEDS_IN_SEGMENT * 14)              // координаты мигающих точек
//#define DOT2  (LEDS_IN_SEGMENT * 14  + 1)         // координаты мигающих точек
 
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  0b00011110,     // Digit C         11
  0b01111100,     // Digit P         12
  0b01111000,     // Digit % знак % из двух частей 13
  0b01000111,     // Digit % знак % из двух частей 14
};

bool Dot = true;
bool DST = false; 
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;

long ledColor = CRGB::DarkGreen; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[NUM_COLORS] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  //CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid,
  CRGB::DarkOrchid
};

void setup() {
  Serial.begin(9600);
  //Wire.begin();//Для BMP
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);

  bme.begin(); //bmp.begin(); //датчик температуры
   
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
  //leds[DOT2] = (Dot_On) ? ledColor : 0;
}

void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}

//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);     // new_bright_f = new_bright_f * coef - new_bright * (1 - coef);   //  300*0.9-300*(1-0.9)
        // LEDS.setBrightness(new_bright_f);      // установить новую яркость
      LEDS.setBrightness(255-new_bright_f);       // установить новую яркость
    }
  }
};

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();       // Получаем данные текущегO времени и его хранение
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;

  if (second % 2 == 0)
  {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minute);
};

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

void TimeToArray() {
  int Now = GetTime();                                // Получаем время
  BrightDots(Dot);

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10;                             // Получаем последнюю цифру в времениd
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
     cursor -= DOTS_NUM;
      //cursor -= 2;
    }
    BrightDigit(digits[digit], cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
//        cylon ();                                    // цикличное изменение цветов
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};

// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 25) {     //через какое время показывать температуруi
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = bme.readTemperature();  //int t = bmp.readTemperature();
  int celsius = t;
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака Градус (С) 3 блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  1й блок вывода первого символаo
};

// Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) {//через какое время показывать давление
    PressureShow = false;
    return;
  }
  PressureShow = true;
  int p = bme.readPressure() / 133.322;  //int p = bmp.readPressure() / 133.322;c
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  начало знака Давления (Р) 1й блокh
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значенияk
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //21  2й блок вывода первой цифры значения
};

 //Вывод влажности
 //Переделано на BME280  //Пример на DHT11
 void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 35) {           //через какое время показывать влажность
    HumidityShow = false;
    return;  
  }
  HumidityShow = true;
  int h = bme.readHumidity();  //int h = dht.readHumidity();
  int humidity = h;
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символаA
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  1й блок вывода первого символа
};

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

// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(100);//время реакции на нажатие
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW) {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else {
        Now.Hour += 1;
      };
    }
    else
    {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };
    RTC.write(Now);
  }
}

//Меняем эффекты
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}

// массив отвечает за цикличное изменение цветов
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
  //Serial.print("x");

  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
}

void loop()
{ 
  BrightnessCheck(); // Проверяем датчик освещения
  DSTcheck();        // Проверяем цветовые режимы
  TimeAdjust();      // Проверяем время если сменилось на 1 цифру
  TimeToArray();     // Проверяем часы если сменилось на 1 цифру
  TempToArray();     // температура
  PressureToArray(); // давление
  HumidityToArray(); // влажность
  FastLED.show();    // Задаём массив светодиодов
  if (TempShow == true) delay (5000);    //время показа температуры
  if (PressureShow == true) delay (5000);//время показа давления
  if (HumidityShow == true) delay (5000);//время показа влажности

/*/ 
 //вывод на монитор данных по освещённости
 int brightness = analogRead(BRI_PIN);
  // Получение тестовых значений
  // Выодим на монитор полученное значение
  Serial.print("brightness = "); // Название значения для наглядного представления
  Serial.println(brightness);    // Выводим значение и используем вызов println, те переноса строки
  delay(1000);
  */
  
 /*/ 
  //вывод информации в монитор порта
  // Раскоментировать если нужно посмотреть в сом порте,  подтормаживает вся система если это открыто 
    Serial.print("Tемпература = ");
    Serial.print(bme.readTemperature());  //Serial.print(bmp.readTemperature());
    Serial.println("*C");
    
    Serial.print ("Давление = ");
    Serial.print (bme.readPressure() / 133.322);  //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
    Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"

    Serial.print ("Влажность = ");
    Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); // 
    Serial.println ("%\t"); // 
    Serial.println();
    delay(8000);

    Serial.println (" *Arduino.ru.* "); // 
 */ 
}

 

Sircha
Offline
Зарегистрирован: 21.09.2019

Вот еще как возможный вариант смены цветов

https://www.youtube.com/watch?v=6mAk30DfoFE 

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

Sircha пишет:

Вот еще как возможный вариант смены цветов

https://www.youtube.com/watch?v=6mAk30DfoFE 

Я уже предлагал такой вариант с меню и настройкой всего и вся под себя. довольно интересные часики. интересно на чем реализована вся логика на этих часиках, там деталей минимум (любимая нами 3231, неизвестный MCU типо нашей меги или STM, пассивный бузер, пара сенсорных кнопок и горсть 5050 да SMD мелочёвки). а функционал не плохой, настроек много как цвета так и времени с яруостью, даже какая то активация голосом есть, будильник имеется. вот что нибудь подобное и хочется иметь в наших народных часах. 

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

https://yadi.sk/i/_lnZ-zN-ONJ6nw тут по подробнее

dgeka
Offline
Зарегистрирован: 05.07.2016


не смог я пока осилить скетч из 303 поста в плане отрицательных температур, на просторах интернета нашел скетч на даласовском датчике покорчевал под свои потребности теперь минус светят (при отрицательных температурах) ,но меня смущает то что лента не используется в полной мере и светится только один цвет забитый при заливке скетча . Так вот просьба помочь допитлить  чтоб как в 303 посте смену цвета можно было устанавливать  0,1,2,3 . Сам до такого не дорос прошу хелпануть  :)

#include <DS3231RTC.h> // для работы с модулем часов реального времени
#include <Time.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с модулем часов реального времени
#include <Wire.h> // для работы с модулем часов реального времени
#include "FastLED.h" // для работы с диодной ленты
#include <OneWire.h> // для работы с датчиком температуры
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 //DeviceAddress Thermometer1 = { 0x28, 0xEE, 0x28, 0x9F, 0x27, 0x16, 0x01, 0x6F };  // адрес 1го датчика DS18B20(у каждого датчика свой адрес) 
DeviceAddress Thermometer2 ={ 0x28, 0x23, 0x8C, 0x22, 0x16, 0x13, 0x01, 0x10 };  // адрес 2го датчика DS18B20 
#define NUM_LEDS 29 // количество диодов (полосок диодной ленты)
#define COLOR_ORDER BRG  // порядок цветов в ленте
#define DATA_PIN 13  // пин вывода данных на диодную ленту
#define DS3232_I2C_ADDRESS 0x68
int val;
int c;
int dat;

//===================================================================================================
CRGB leds[NUM_LEDS]; // массив для задания цифр, 10 цифр по 7 сегметов
byte digits[10][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
//================================================================================================                     
 
int col;//переменная цвета
//=================================

bool Dot = true;  ////объявление переменной состояния точки (разделение часы : минуты

int last_digit = 0;//long ledColor = CRGB::DarkOrchid; // Color used (in hex)

long ledColor = CRGB::Blue;// объявление переменной цвета диодной ленты
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};
//===================================================================================================
//int TP;
int TU;//объявление переменных для температуры 
//===================================================================================================
void setup(){ 
  sensors.begin();
  //sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);
 Serial.begin(9600); 
  Wire.begin(); 
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // установка яркости ленты
  pinMode(4, INPUT_PULLUP); // пин кнопки корректировки минут
  pinMode(5, INPUT_PULLUP); // пин кнопки корректировки часов
  pinMode(3,INPUT);//пин кнопки ручного управления яркостью дисплея
} 
//===================================================================================================
int GetSecond(){ //функция запроса текущей секунды, результат в переменной "second"
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int second =Now.Second;
//  Serial.print(second);Serial.println("S");
  return (second);
  };
 //===================================================================================================
 int GetHour(){ //функция запроса текущего часа, результат в переменной "hour"
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int hour =Now.Hour;
//  Serial.print(second);Serial.println("S");
  return (hour);
  };

  //=================================================================================================== 
int GetTime(){ //функция запроса текущего времени, результат в виде целого числа, то есть 10:25 будет 1025
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int hour=Now.Hour;
  int minutes=Now.Minute;
  int second =Now.Second;
  if (second % 2==0) {Dot = false;}
    else {Dot = true;};
    if(minutes%2==0)
    {dat=0;}
    else{dat=1;}
    //Serial.print(minutes);
  return (hour*100+minutes);
  };
  
//===================================================================================================
int GetDate(){ //функция запроса текущей даты, результат в виде целого числа, то есть 25 января (01.25) будет 0125
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int month=Now.Month;
  int day=Now.Day;
  {Dot = false;};
  return (day*100+month);
  
}


//===================================================================================================
int GetYear(){ //функция запроса текущего года
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object 
  int year=Now.Year;
  {Dot = false;}
  return (year+1970);
  };
//===================================================================================================
void BrightnessCheck(){ // функция настройки яркости в соответствии с освещенностью
  const byte sensorPin = 12; // пин датчика освещенности
  const byte brightnessLow = 250; // низкий уровень яркости
  const byte brightnessHigh = 250; // высокий уровень яркости
 int last=0;
 int yar;
 int current=0;
 int pos=0;
  last=digitalRead(sensorPin);
 if(last!=0)
  {
    delay(150);
    current=digitalRead(sensorPin);
  }
  if(last!=0&&current!=0)
  delay(150);
  pos=digitalRead(sensorPin);
 if (last==1&&current==1&&pos==1)
 {yar=1;}//считывание показаний с датчика освещения с проверкой предыдущего состояния
 else
 {yar=0;}// светло
 

int buttonC = digitalRead(3);//пин с кнопки ручного переключения яркости

if(buttonC==HIGH&&c==0)
{
  c=1;
   }
   if(buttonC==LOW&&c==1)
{
  val=1; 
}
if(buttonC==HIGH&&val==1)
{c=0;}
if(buttonC==LOW&&c==0)
 {
  val=0; 
}
if (yar==0)
{val=0;c=0;}
if(val==1) 
{LEDS.setBrightness(250);}//режим яркости ночной
else
{if (yar == 0)
  {LEDS.setBrightness(brightnessHigh);}//режим яркости дневной
  if (GetHour()>=18&&(yar == 1))
  {LEDS.setBrightness(brightnessLow);}//режим яркости вечерний
  if (GetHour()>=0&&GetHour()<=6&&(yar == 1))
  {LEDS.setBrightness(250);}//режим яркости ночной
  //Serial.println(current);
   }
}
//===================================================================================================  
CRGB convertT (int Now){ //функция преобразования любого числа в массив для отображения на ленте, результат - массив leds
  int cursor = 29;
  
  if (Dot){leds[14]=0x000000;}
    else {leds[14]=0x000000;
    };
  for(int i=1;i<=4;i++){
    int digit = Now %10; // get last digit in time
    if (i==1){
      //Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor -=14;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
          if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==2){
      //Serial.print("Digit 3 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==3){
      //Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =22;
      for(int k=0; k<=6;k++){ 
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=0x000000;}
         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]=0x000000;}
          if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    Now /= 10;
  };
};
//====================================================================
CRGB convert (int Now){ //функция преобразования любого числа в массив для отображения на ленте, результат - массив leds
  int cursor = 29;
  
  if (Dot){leds[14]=ledColor;}
    else {leds[14]=0x000000;
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
//      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor =22;
      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==2){
//      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor -=14;
      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==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 ++;
        };
      }
    Now /= 10;
  };
};
//===================================================================================================
void temperatur()//функция запроса температуры с датчика и её преобразование
{
sensors.requestTemperatures();
  //int tempCP = sensors.getTempC(Thermometer1);
  //TP=tempCP;
  
int tempCU = sensors.getTempC(Thermometer2);
TU=tempCU;
  //Serial.println(T);
}
//===================================================================================================
void TimeAdjust(){ //функция корректировки времени через кнопки
  int buttonH = digitalRead(5);
  int buttonM = digitalRead(4);
  if (buttonH == LOW || buttonM == LOW){
    delay(200);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
         
          
    RTC.write(Now); 
    }
  }
//===================================================================================================
void displayClock() // функция вывода времени
{
  int Now = GetTime();//  Serial.print("Time is: ");Serial.println(Now);
  convert(Now);// Get leds array with required configuration
  FastLED.show();// Display leds array
}
//===================================================================================================
void displayYear() // функция вывода года
{
  int Now = GetYear();
  //Serial.print("Year is: ");Serial.println(Now);
convert(Now);// Get leds array with required configuration
    FastLED.show();// Display leds array
}
//===================================================================================================

//===================================================================================================
void displayTemp2() // функция вывода температуры
{ temperatur();
int Now=TU;
if(TU<0)
{Now=TU*(-1);}
   //Serial.println("Temp is: ");
   //Serial.println(TU);
  convertT(Now);
leds[22]=leds[23]=leds[24]=leds[25]=ledColor;
if(TU<0)
{leds[0]=ledColor;}
if(TU<=9&&TU>-10)
{leds[8]=leds[9]=leds[10]=leds[11]=leds[12]=leds[13]=ledColor;}

  
  FastLED.show();// Display leds array
}
//===================================================================================================
void loop()  // главный цикл
{
  
  BrightnessCheck(); // вызов функции установки яркости
  TimeAdjust(); // вызов функции корректировки времени
 // smenaColor();
  if (GetSecond() <= 6 || (GetSecond()>12 &&GetSecond()<=26) || (GetSecond()>32 &&GetSecond()<=46)) 
  {displayClock();} //вызов функции отображения времени
     // else  if (GetSecond()>6 && GetSecond()<=9 || (GetSecond()>46 &&GetSecond()<=49))
     // {displayTemp1();}//вызов функции отображения температуры в помещении
      else  if (GetSecond()>9 && GetSecond()<=12 || (GetSecond()>49 &&GetSecond()<=52))
      {displayTemp2();}//вызов функции отображения температуры на улице
      //else  if (GetSecond()>26 && GetSecond()<=31 && dat>0 )
      //{displayDate();}//вызов функции отображения даты
      //else if (GetSecond()>29 && GetSecond()<=32 && dat>0)
      // {displayYear();}//вызов функции отображения года
      else {displayClock();}; //вызов функции отображения времени
  
}
 //==========================================THE=END=================================================== 



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

привет, dgeka - если никто не ответит раньше, посмотрю завтра-послезавтра, сейчас очень много работы

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

dgeka, посмотрел код - похоже это снова всплыла та кривоватая версия, что мы тут правили на протяжении последних 4х страниц ветки. Честно говоря, править по новой все то, что я уже менял - мне лень. Процедуры Convert()  ConverTT() -это просто пипец

В общем, напиши, как часто ты хочешь менять цвет - раз в час, раз в 10 часов или раз в 10 минут - вставлю в код только это

dgeka
Offline
Зарегистрирован: 05.07.2016

раз в  10 минут  достаточно, странно я здесь код не видел, я его на драйв ту ру надыбал  :)

 

dgeka
Offline
Зарегистрирован: 05.07.2016

пришел датчик bme280 начались попытки переделать скетч под показ отрицательных  температур вообщем цифру переместить на один символ вперед получилось , потушить первую цифру  тоже, но вот с минусом ,то есть отрицательным числом побороть не могу . понимаю что надо  полученый минус конвертировать в плюс и засветить символ -  но программно сделать не могу , так что хелп  !!!!  :)



[code]
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на 
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////OdinochkA)))
*/

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

#define LEDS_IN_SEGMENT 1     // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 1            // Задаём количество разделительных точек
#define COLOR_CHANGE 1        // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16         // цветовая гамма
#define COLOR_ORDER BGR       // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13           // подключение ленты
#define BRI_PIN A6            // фоторезистор 
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 227        // максимальная яркость (0 - 255)
#define min_bright 0          // минимальная яркость (0 - 255)
#define bright_constant 1010  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

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

//BMP280 PINS                   //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4

// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)  //86 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)  //86 количество светодиодов в ленте
//#define DOT1  (LEDS_IN_SEGMENT * 14)   // координаты мигающих точек
//#define DOT2  (LEDS_IN_SEGMENT * 14  + 1)   // координаты мигающих точек

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  0b01000000,     // Digit C         11
  0b01111100,     // Digit P         12
  0b01111000,     // Digit % знак % из двух частей 13
  0b01000111,     // Digit % знак % из двух частей 14
  0b00000000,     // Digit символ для температуры плюсовой 15
};

bool Dot = true;
bool DST = false; 
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;

long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[NUM_COLORS] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  //CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid,
  CRGB::DarkOrchid
};

void setup() {
  Serial.begin(9600);
  //Wire.begin();//Для BMP
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);

  bme.begin(); //bmp.begin(); //датчик температуры
   
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
  //leds[DOT2] = (Dot_On) ? ledColor : 0;
}

void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}

//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
  //    Serial.print("Освещение: ");         // вывод инфы в сом порт
  //    Serial.println(sensorValue);         // вывод инфы в сом порт
      new_bright = map(analogRead(6), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef - new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155O
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;

  if (second % 2 == 0)
  {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minute);
};

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

void TimeToArray() {
  int Now = GetTime();                                // Получаем время
  BrightDots(Dot);

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10;                             // Получаем последнюю цифру в времениd
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
     cursor -= DOTS_NUM;
      //cursor -= 2;
    }
    BrightDigit(digits[digit], cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
//        cylon ();                                    // цикличное изменение цветов
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};

// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 25) {//через какое время показывать температуруi
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = bme.readTemperature();  //int t = bmp.readTemperature();
  int celsius = t;
  //=====================================================================
    //=============== мои изменениядля для минусовых температур
{if(t<0)
 BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn
if(t<0)
{leds[0]=ledColor;}
if(t<=9&&t>-10)
 BrightDigit(digits[0], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));    // светим ноль если температура от 0 до 9 (*) 4й блокn
 }
    //===================================================
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn
  int digit = celsius % 10; //вывод десятка градусов
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака Градус (С) 3 блок
    celsius /= 10;   //вывод единиц градусов
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символа
  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим  первую цифру
 // BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //28 1й блок вывода первого символаo

};
//=====================================================================
//=====================================================================
// Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) {//через какое время показывать давление
    PressureShow = false;
    return;
  }
  PressureShow = true;
  int p = bme.readPressure() / 133.322;  //int p = bmp.readPressure() / 133.322;c
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  начало знака Давления (Р) 1й блокh
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значенияk
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //21  2й блок вывода первой цифры значения
};

 //Вывод влажности
 //Переделано на BME280  //Пример на DHT11
 void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 35) {//через какое время показывать влажность
    HumidityShow = false;
    return;  
  }
  HumidityShow = true;
  int h = bme.readHumidity();  //int h = dht.readHumidity();
  int humidity = h;
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символаA
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  1й блок вывода первого символа
};

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

// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(100);//время реакции на нажатие
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW) {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else {
        Now.Hour += 1;
      };
    }
    else
    {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };
    RTC.write(Now);
  }
}

//Меняем эффекты
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}

// массив отвечает за цикличное изменение цветов
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
  //Serial.print("x");

  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
}

void loop()
{ 
  BrightnessCheck(); // Проверяем датчик освещения
  DSTcheck();        // Проверяем цветовые режимы
  TimeAdjust();      // Проверяем время если сменилось на 1 цифру
  TimeToArray();     // Проверяем часы если сменилось на 1 цифру
  TempToArray();     // температура
  PressureToArray(); // давление
  HumidityToArray(); // если будет влажность
  FastLED.show();    // Задаём массив светодиодов
  if (TempShow == true) delay (5000); //время показа температуры
  if (PressureShow == true) delay (5000);//время показа давления
  if (HumidityShow == true) delay (5000);//время показа влажности
 
 /*/ 
  
  //вывод информации в сом порт
  // Раскоментировать если нужно посмотреть в сом порте, маленько подтормаживает вся система если это открыто 
    Serial.print("Tемпература = ");
    Serial.print(bme.readTemperature());  //Serial.print(bmp.readTemperature());
    Serial.println("*C");
    
    Serial.print ("Давление = ");
    Serial.print (bme.readPressure() / 133.322);  //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
    Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"

    Serial.print ("Влажность = ");
    Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); // 
    Serial.println ("%\t"); // 
    Serial.println();
    delay(8000);

    Serial.println (" *OdinochkA* "); // 
    */
}
[/code]

 

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

dgeka пишет:

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

 

покажите, в каком месте кода вы двигали цифры?

dgeka
Offline
Зарегистрирован: 05.07.2016

вот кусочек

BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  3 блок
    celsius /= 10;
  digit = celsius % 10;
  //int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символа
 // celsius /= 10;
 // digit = celsius % 10;
  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим  первую цифру
 // BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //28 1й блок вывода первого символаo

};

 

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

ну так в чем проблема? - если температура отрицательная, вместо того чтоб просто гасить первую цифру, выводите в нее знак "минус"

dgeka
Offline
Зарегистрирован: 05.07.2016

добавил условие но он при этом выдает при положительных температурах как надо 08 * ,а при отрицательных пишет -0 *. вообщем не светит единицы градусов ниже нет возможности опустить температуру

    //=============== мои изменениядля минусовых температур
    //===========================================================
{if(t<0)
 BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn

if(t<=9&&t>-10)
 BrightDigit(digits[0], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));    // светим ноль если температура от 0 до 9 (*) 4й блокn
 }
    //===================================================
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  начало знака Цельсия (*) 4й блокn
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  единицы градуса 3 блок
    celsius /= 10;
  digit = celsius % 10;
  //int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок десятки градусов
 // celsius /= 10;
 // digit = celsius % 10;
 if(t<0)
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//светим   знак минус
  if(t>0)
  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим  первую цифру
 // BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //28 1й блок вывода первого символа

};
//===========================================================
//===========================================================

 

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

строчки с первой по восьмую просто выкинуть. они не нужны.

вместо них поставить

celcius = abs(t);

далее логика очень простая:

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

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

Все

dgeka
Offline
Зарегистрирован: 05.07.2016

вот что получилось 

  celsius = abs(t);                                     //преобразование отрицательного числа в положительное
    //===================================================
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // знак Цельсия (*) 4й блок
   if(t<0)
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//светим   знак минус если ниже 0
  if(t>=0)                                                              //добавил условие что-бы при  0 не показывало 000* градусов цельсия
  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим  первую цифру
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // 3 блок единицы градуса 
    celsius /= 10;
  digit = celsius % 10;
  //int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок десятки градусов
};
//===========================================================

теперь заработало !!!огромное спасибищее ВАМ !!!b707 за тыканье мордочкой в нужное место и помощь

dgeka
Offline
Зарегистрирован: 05.07.2016

вот весь код 

[code]
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на 
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////OdinochkA)))
*/

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

#define LEDS_IN_SEGMENT 1     // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 1            // Задаём количество разделительных точек
#define COLOR_CHANGE 1        // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16         // цветовая гамма
#define COLOR_ORDER BGR       // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13           // подключение ленты
#define BRI_PIN A6            // фоторезистор 
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 227        // максимальная яркость (0 - 255)
#define min_bright 0          // минимальная яркость (0 - 255)
#define bright_constant 1010  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

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

//BMP280 PINS                   //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4

// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM)  //86 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)  //86 количество светодиодов в ленте
//#define DOT1  (LEDS_IN_SEGMENT * 14)   // координаты мигающих точек
//#define DOT2  (LEDS_IN_SEGMENT * 14  + 1)   // координаты мигающих точек

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  0b01000000,     // Digit -         11
  0b01111100,     // Digit P         12
  0b01111000,     // Digit % знак % из двух частей 13
  0b01000111,     // Digit % знак % из двух частей 14
  0b00000000,     // Digit символ для температуры иплюсовой 15
};

bool Dot = true;
bool DST = false; 
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;

long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long ColorTable[NUM_COLORS] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  //CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid,
  CRGB::DarkOrchid
};

void setup() {
  Serial.begin(9600);
  //Wire.begin();//Для BMP
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);

  bme.begin(); //bmp.begin(); //датчик температуры
   
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
  //leds[DOT2] = (Dot_On) ? ledColor : 0;
}

void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}

//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
  //    Serial.print("Освещение: ");         // вывод инфы в сом порт
  //    Serial.println(sensorValue);         // вывод инфы в сом порт
      new_bright = map(analogRead(6), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef - new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};

//  Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155  вместо 0155O
int GetTime()
{
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
  int hour = Now.Hour;
  int minute = Now.Minute;
  int second = Now.Second;

  if (second % 2 == 0)
  {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minute);
};

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

void TimeToArray() {
  int Now = GetTime();                                // Получаем время
  BrightDots(Dot);

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10;                             // Получаем последнюю цифру в времениd
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
     cursor -= DOTS_NUM;
      //cursor -= 2;
    }
    BrightDigit(digits[digit], cursor);
    if ( i == COLOR_CHANGE) {
      if (digit != last_digit)
      {
//        cylon ();                                    // цикличное изменение цветов
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};

// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 25) {//через какое время показывать температуруi
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = bme.readTemperature();  //int t = bmp.readTemperature();
  int celsius = t;
    //=============== мои изменениядля минусовых температур
    //===========================================================

  celsius = abs(t);                                     //преобразование отрицательного числа в положительное
    //===================================================
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // знак Цельсия (*) 4й блок
   if(t<0)
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//светим   знак минус если ниже 0
  if(t>=0)                                                              //добавил условие что-бы при  0 не показывало 000* градусов цельсия
  BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим  первую цифру
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // 3 блок единицы градуса 
    celsius /= 10;
  digit = celsius % 10;
  //int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //  2й блок десятки градусов
};
//===========================================================
//===========================================================
// Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) {//через какое время показывать давление
    PressureShow = false;
    return;
  }
  PressureShow = true;
  int p = bme.readPressure() / 133.322;  //int p = bmp.readPressure() / 133.322;c
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  начало знака Давления (Р) 1й блокh
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значенияk
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //21  2й блок вывода первой цифры значения
};

 //Вывод влажности
 //Переделано на BME280  //Пример на DHT11
 void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 35) {//через какое время показывать влажность
    HumidityShow = false;
    return;  
  }
  HumidityShow = true;
  int h = bme.readHumidity();  //int h = dht.readHumidity();
  int humidity = h;
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  //21  2й блок вывода второго символаA
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  1й блок вывода первого символа
};

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

// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(100);//время реакции на нажатие
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW) {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else {
        Now.Hour += 1;
      };
    }
    else
    {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };
    RTC.write(Now);
  }
}

//Меняем эффекты
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}

// массив отвечает за цикличное изменение цветов
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
  //Serial.print("x");

  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
  // Устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
  // Показываем светодиоды
    FastLED.show();
    fadeall();
  // Ждём немного и повторяем цикл
    delay(10);
  }
}

void loop()
{ 
  BrightnessCheck(); // Проверяем датчик освещения
  DSTcheck();        // Проверяем цветовые режимы
  TimeAdjust();      // Проверяем время если сменилось на 1 цифру
  TimeToArray();     // Проверяем часы если сменилось на 1 цифру
  TempToArray();     // температура
  PressureToArray(); // давление
  HumidityToArray(); // если будет влажность
  FastLED.show();    // Задаём массив светодиодов
  if (TempShow == true) delay (5000); //время показа температуры
  if (PressureShow == true) delay (5000);//время показа давления
  if (HumidityShow == true) delay (5000);//время показа влажности
 
 /*/ 
  
  //вывод информации в сом порт
  // Раскоментировать если нужно посмотреть в сом порте, маленько подтормаживает вся система если это открыто 
    Serial.print("Tемпература = ");
    Serial.print(bme.readTemperature());  //Serial.print(bmp.readTemperature());
    Serial.println("*C");
    
    Serial.print ("Давление = ");
    Serial.print (bme.readPressure() / 133.322);  //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
    Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"

    Serial.print ("Влажность = ");
    Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); // 
    Serial.println ("%\t"); // 
    Serial.println();
    delay(8000);

    Serial.println (" *OdinochkA* "); // 
    */
}
[/code]

 

dgeka
Offline
Зарегистрирован: 05.07.2016

но  как всегда аппетит приходит во время еды хочется что бы  на последних или первых  секундах была  анимация :) 

нужен хелп 

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

dgeka пишет:

но  как всегда аппетит приходит во время еды хочется что бы 

Это уж точно ))

Плавность смены цифр чтобы ночью глаза не "дёргало"

5 градусников, десятые доли градусов

Пользовательская настройка цветов

коррекция хода

настройки через блютус или вайфай

Бой с настройкой громкости

"тихий час"

несколько будильников

https://youtu.be/7eOAVlV6NaM

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

b612 пишет:

Плавность смены цифр чтобы ночью глаза не "дёргало"

сделайте плавную яркость

Цитата:
5 градусников, десятые доли градусов

+ 30 строк к оду

Цитата:
Пользовательская настройка цветов

и так есть - смотрите в коде внимательно

Цитата:
коррекция хода

настройки через блютус или вайфай

коррекция вещь полезная. Но куда полезнее автосинхронизация по NTP. раз уж вайфай есть. при наличии ЕСП модуля для вайфай - вопрос 50 строк

 

Цитата:
Бой с настройкой громкости

да, это полезно, будем ждать чтобы кто-нибудь добавил

Только в итоге, вы же наверно уже сами понимаете - расширим мы функционал до вашего - размер кода даже 1000 строк не достигнет

 

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

b707 пишет:
расширим мы функционал до вашего - размер кода даже 1000 строк не достигнет

флаг в руки ))

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

b612 пишет:

флаг в руки ))

ну вы же понимаете. что все вышеперечисленное никак не тянет на 5700 строк, на которые ваш код отличается от местного. И гордится тут нечем.

 

dgeka
Offline
Зарегистрирован: 05.07.2016

так как с переходом ?поможет кто то?   из примера fastled  "циклон"  есть а не работает :( ?



309
//Меняем эффекты
310
void fadeall() {
311
  for (int i = 0; i < NUM_LEDS; i++) {
312
    leds[i].nscale8(250);
313
  }
314
}
315
 
316
// массив отвечает за цикличное изменение цветов
317
void cylon () {
318
  static uint8_t hue = 0;
319
  Serial.print("x");
320
  // Сдвигаем один светодиод в любом направлении
321
  for (int i = 0; i < NUM_LEDS; i++) {
322
  // Устанавливаем 1 светодиод на цвет красный
323
    leds[i] = CHSV(hue++, 255, 255);
324
  // Показываем светодиоды
325
    FastLED.show();
326
    fadeall();
327
  // Ждём немного и повторяем цикл
328
    delay(10);
329
  }
330
  //Serial.print("x");
331
 
332
  // Сдвигаем один светодиод в любом направлении
333
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
334
  // Устанавливаем 1 светодиод на цвет красный
335
    leds[i] = CHSV(hue++, 255, 255);
336
  // Показываем светодиоды
337
    FastLED.show();
338
    fadeall();
339
  // Ждём немного и повторяем цикл
340
    delay(10);
341
  }
342
}