автоматизация (таймер)

Snecky
Offline
Зарегистрирован: 24.01.2012

 Доброе время суток. 

Помогите разобратся с таймером. Задача  заключается в том чтобы ардуино давала импульс на тригер (не знаю так или нет, сам не электронщик-сори) ну дапустим каждые 12 часов, т.е. включал и выключал свет каждые 12 часов

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

delay (720000); не?

Snecky
Offline
Зарегистрирован: 24.01.2012

я тоже думал об delay ! получается  delay (43200000); // 12 часов пауза! но верное ли решение ? я не профи и поэтому спрашиваю !

 

medossa
Offline
Зарегистрирован: 10.07.2012

 можно условие создать с millis()

unsigned long val = 3600000; #переменная для перевода миллисекунд в часы
unsigned long hour = millis()/val;
if (hour == 12)
 {
  сделать что-то
 }

 и добавить счётчик

step962
Offline
Зарегистрирован: 23.05.2011

medossa пишет:

 можно условие создать с millis()

unsigned long val = 3600000; #переменная для перевода миллисекунд в часы
unsigned long hour = millis()/val;
if (hour == 12)
 {
  сделать что-то
 }

 и добавить счётчик

Приведенный алгоритм имеет два недостатка:

- в связи с особенностями целочисленного деления устройство будет непрерывно "делать что-то" в течение целого часа - пока частное от деления millis()/val не примет значение 13.

- это безобразие произойдет только по прошествии первых 12 часов (многократно до истечения 13-го часа - см. выше). Дальше условие if(hour == 12) перестанет возвращать значение "истина" и обработка больше никогда не повторится - только перезапуск микроконтроллера поможет. 

Snecky
Offline
Зарегистрирован: 24.01.2012

step962 

А  что вы можете посоветовать ? юзать delay ?

medossa
Offline
Зарегистрирован: 10.07.2012

step962 пишет:

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

зациклить можно же.

ну и как вариант использовать библиотеку MsTimer

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Можно использовать TimerOne - в прерывании прибавлять по секунде, когда пройдет 12*60*60, то формировать импульс и сбрасывать переменную. Тогда loop() будет свободен - можно еще че-нить делать ;)

Кстати, глянул MsTimer - тоже прикольная штука. Юзает TIMER2, похоже, что PWM, связанный с ним, будет продолжать работать, но с частотой 1 кГц и не на весь диапазон.

step962
Offline
Зарегистрирован: 23.05.2011

 Ну что тут можно посоветовать? Переписать. Например, так:

// в начале скетча - объявление/инициализация констант и переменных
// константа для перевода миллисекунд в часы
#define MSEK_PER_HOUR = 3600000
unsigned long hour;
unsigned long timemark=millis();

// в loop:
hour = (millis()-timemark)/MSEK_PER_HOUR; // количество полных часов с момента последнего срабатывания
if (hour == 12)
 {
  сделать что-то
  timemark=millis();
 }
else {
  // тут тоже можно делать всяко-разно в ожидании момента срабатывания "будильника"
} 

 

Snecky
Offline
Зарегистрирован: 24.01.2012

 step962

 простите нуба но не могли бы вы полностью пример привести на примере блинка ? а то не могу все воедино собрать =(

leshak
Offline
Зарегистрирован: 29.09.2011

Ну "нубство" это проходящие достоинство. Нужно только пытатся, смотреть примеры что идут в документации, эксперементировать.


// в начале скетча - объявление/инициализация констант и переменных
// константа для перевода миллисекунд в часы
#define MSEK_PER_HOUR 3600000
unsigned long hour;
unsigned long timemark=millis();

#define LED 13

void setup(){
  pinMode(LED,OUTPUT);
  
}

void loop(){
  hour = (millis()-timemark)/MSEK_PER_HOUR; // количество полных часов с момента последнего срабатывания
  if (hour == 12)
   {
    digitalWrite(LED,!digitalRead(LED)); //сделать что-то
    timemark=millis();
   }
  else {
    // тут тоже можно делать всяко-разно в ожидании момента срабатывания "будильника"
  } 
}

 

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

А вот если вы "питаетесь от батарейки", то это конечно уже "расточительство" крутить холостой цикл в течении такого времени.

Тут желательно "засыпать" и просыпатся по таймеру. Примерно вот так:

http://donalmorrissey.blogspot.com/2011/11/sleeping-arduino-part-4-wake-...

 Правда "заснуть" на 12-ть часов не получится таким образом. Макимум на 4.1 секунды. Но все равно "хлеб". Так будет намного экономней: просыпатся  на пару микросекунд раз в 4-ре секунды. Проверять что "12-ть часов еще не прошло" и "засыпать обратно", чем "все время молотить электричество".

Правда "для нуба" эта статья конечно "тяжело". Но... читать документацию... статьи... только так перестать нубом можно. А "выжимать" из контроллера максимум не зная его архитектуры - не получится.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Вот, скажем, со "слипом" можно так (не стал, правда, заморачиваться с отключением питания перефирии)

#include <TimerOne.h>
#include <avr\sleep.h>
#define SECPER12HOUR 3 //(12*60*60)

volatile long n_sec=0;

void setup() 
{
  pinMode(13, OUTPUT);    
  sleep_enable();
  Timer1.initialize(1000000); // set a timer of length 1000000 microseconds (or 1 sec - or 1Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
}
 
void loop()
{
  // Main code loop
  // TODO: Put your regular (non-ISR) logic here
  sleep_mode();
}
 
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timerIsr()
{
  n_sec++;
  if (n_sec>=(long)SECPER12HOUR)
  {  
  // Toggle LED
    digitalWrite( 13, digitalRead( 13 ) ^ 1 );
    n_sec=0;
  }
}

 Константа намеренно сделана =3, чтобы не ждать 12 часов при проверке - переключается каждые 3 секунды :)

Snecky
Offline
Зарегистрирован: 24.01.2012

Как я понял из приведенного кода step962 и leshak скетч отсчитывает 12 часов, выполняет задачу и уходит на очередной круг отсчета ?
Объясню задачу так : стоит террариум с лампой и вентилятором , задача в том чтобы лампа включалась на 8 часов и выключалась на 14 + каждые 2 часа включался вентилятор на 10 мин.
МК питается от БП и должен давать импульс (1 сек) на симистор который в свое время откроет ток на лампу на 8 часов, через 8 часов еще один импульс который закроет ток на 14 часов.
И параллельно этому всему делу каждые 2 часа МК будет включать мини вентилятор (3v) на 10 мин. Вот такая хитрая и для меня сложная задача. :(

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ну тогда так (неоптимально, конечно, решение "в лоб", но легче разобраться новичку)

#include <TimerOne.h>
#include <avr\sleep.h>
#define TimeLampOn (8*60*60) // 8 утра
#define TimeLampOff (16*60*60) // 4 дня (через 8 часов)
#define PeriodVent (2*60*60)
#define TimeVent (10*60)

#define LampOn 9
#define LampOff 10
#define Vent 11

volatile long n_sec=0;

void setup() 
{
  pinMode(LampOn, OUTPUT);    
  pinMode(LampOff, OUTPUT);    
  pinMode(Vent, OUTPUT);    
  sleep_enable();
  Timer1.initialize(1000000); // set a timer of length 1000000 microseconds (or 1 sec - or 1Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
}
 
void loop()
{
  // Main code loop
  // TODO: Put your regular (non-ISR) logic here
  sleep_mode();
}
 
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timerIsr()
{
  n_sec++;
  if (n_sec>=(long)(24*60*60)) // сброс в 0:00
  {  
    n_sec=0;
  }
// Лампа. Включение и выключение разными выходами  
if (n_sec==TimeLampOn)
  {
    digitalWrite(LampOn, HIGH);
  }
  else if (n_sec==(TimeLampOn+1)) //выключение импульса через секунду
  {
    digitalWrite(LampOn, LOW);
  }
  else if (n_sec==TimeLampOff)
  {
    digitalWrite(LampOff, HIGH);
  }
  else if (n_sec==(TimeLampOff+1)) //выключение импульса через секунду
  {
    digitalWrite(LampOff, LOW);
  }
// вентиллятор  
if (n_sec%PeriodVent==0)
  {
    digitalWrite(Vent, HIGH);
  }
  else if (n_sec%PeriodVent==TimeVent)
  {
    digitalWrite(Vent, LOW);
  }
  
}

 

Snecky
Offline
Зарегистрирован: 24.01.2012

Т.е. отcчет времени пойдет при включении МК или при сбросе ?
И вот > #define TimeLampOff (16*60*60) // 4 дня (через 8 часов) не совсем понял про 4 дня !
 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Да. Нужно сбросить в 0:00

4 дня :) только дошло :) Имел в виду 4 часа дня (4:00pm) или 16:00

Snecky
Offline
Зарегистрирован: 24.01.2012

AlexFisher  

вы меня  запутали совсем :)  при старте в МК стоит время 0:00 (24:00) и включится лампа в 8:00? я правильльно понял ?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ну вот видите, совсем и не запутал :) Все правильно :)

Snecky
Offline
Зарегистрирован: 24.01.2012

я новерно уже запарил, но то ли у меня инет с другой планеты, то ли .......хм!  не могу найти библиотеки 

<TimerOne.h>
<avr\sleep.h>

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

А чего искать? я же ссылку дал в посте #7 - на статью, в статье прямая ссылка.

avr\sleep.h - стандартная (если у Вас линукс, напишите avr/sleep.h)

seregareal2
Offline
Зарегистрирован: 09.11.2015

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

Его задача - Включаться каждый день в 7 утра и в 9 вечера, (один день в в воскресение что бы не включался!), сделать 5 полных оборотов за одну минуту в 7 утра, отключиться, и сделать это же самое в 9 вечера 

seregareal2
Offline
Зарегистрирован: 09.11.2015
Вот с этим с этим кодом шаговик делает только пол оборота туда и обратно без каких либо задержек во времени



#include <Stepper_28BYJ.h>
// изменить количество шагов для вашего мотора
#define STEPS 4078

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper_28BYJ stepper(STEPS, 2, 3, 4, 5);




#include <TimerOne.h>
#include <avr/sleep.h>
#define SECPER12HOUR 3 //(12*60*60)

volatile long n_sec=0;

void setup() 
{
  
  
   // установим скорость вращения 5 об/мин
  stepper.setSpeed(5);
  
  
  
}
 
void loop()
{
  
  pinMode(STEPS, HIGH);    
  sleep_enable();
  Timer1.initialize(7000000); // 7 Секунд
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
   stepper.step(4000); // Делаем 4000 шагов в одну строну
  
  
  // Main code loop
  // TODO: Put your regular (non-ISR) logic here
  pinMode(STEPS, LOW ); 
  sleep_mode();
  Timer1.initialize(7000000); // 7 Секунд
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
   stepper.step(-4000);// Делаем 4000 шагов в другую строну
  
  
}
 
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timerIsr()
{
 
}
Cr1stalrus31
Offline
Зарегистрирован: 09.11.2019

Помогите пожалуйста дополнить код просто в этом не разбираюсь. У меня готовый код на часы (сегментные часы из светодиодной ленты)
мне нужно дополнить таймер чтоб получились Учебные часы  во время урока идет время , а после урока /перемена показывался таймер по окончание перемены после чего начинается урок снова включались часы. 
10;30 начинался таймер 10 мин ,   12:10 начинался таймер  30 мин ,  14:10 начинался таймер 10 мин  , 15:50 начинался таймер 10 мин  , 17:30  начинался таймер 10 мин, а выходные дни 10;30 начинался таймер 10 мин ,   12:10 начинался таймер  10 мин ,  13:50 начинался таймер 10 мин  , 15:30 начинался таймер 10 мин  , 17:10  начинался таймер 10 мин,

 

#include <DS3232RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include "FastLED.h"
#include "DHT.h"
#define DHT_PIN 5             // пин подключения датчика DHT 11 
#define DHTTYPE DHT11         // DHT 11 
#define NUM_LEDS 114          // 4*7*4 +2  количество светодиодов в ленте
#define COLOR_ORDER BRG       // определение порядка цветов для ленты
#define DATA_PIN 6            // пин подключения ленты
#define DST_PIN 2             // пин кнопки перевода на летнее время и обратно
#define MIN_PIN 3             // пин кнопки настройки минут
#define HUR_PIN 4             // пин кнопки настройки часов
#define BRI_PIN A3            // фоторезистор
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 100        // максимальная яркость (0 - 255)
#define min_bright 1         // минимальная яркость (0 - 255)
#define bright_constant 1023   // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

DHT dht(DHT_PIN, DHTTYPE);

CRGB leds[NUM_LEDS]; // Define LEDs strip
                     // 0,0,0,0
                     // 1,1,1,1
                     // 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
byte digits[13][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},   // Digit 0
                       {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},   // Digit 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},   // Digit 2
                       {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},   // Digit 3
                       {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},   // Digit 4
                       {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},   // Digit 5
                       {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},   // Digit 6
                       {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},   // Digit 7
                       {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},   // Digit 8
                       {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},   // Digit 9 | 2D Array for numbers on 7 segment,
                       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},   // ° char
                       {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},   // C char
                       {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}};  // % char

bool Dot = true;  //Dot state
bool DST = false; //DST state
bool TempShow = false;
bool HumidityShow = false;
bool led_state = true;  // флаг состояния ленты
int last_digit = 0;
// int led Color = 0x0000FF; / / используемый цвет (в шестнадцатеричном формате)
long ledColor = CRGB::DarkOrchid; // Color used (in hex)
// Случайные цвета, которые я подобрал
long ColorTable[16] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::BlueViolet,
  CRGB::Crimson,
  CRGB::DarkMagenta,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Magenta,
  CRGB::MidnightBlue,
  CRGB::MediumVioletRed,
  CRGB::Navy,
  CRGB::Indigo,
  CRGB::OrangeRed,
  CRGB::Purple,
  CRGB::RoyalBlue,
  CRGB::Tomato
};
void setup() {
  Serial.begin(9600);
  LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(5); // Set initial brightness
  pinMode(DST_PIN, INPUT_PULLUP); // Define DST adjust button pin
  pinMode(MIN_PIN, INPUT_PULLUP); // Define Minutes adjust button pin
  pinMode(HUR_PIN, INPUT_PULLUP); // Define Hours adjust button pin
  TempShow = false;
  HumidityShow = false;
  dht.begin();
}

// Получить время в одном числе, если часы будут одной цифрой, то время будет отображаться 155 вместо 0155
int GetTime() {
  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;
  };
  return (hour * 100 + minutes);
};

// Проверьте датчик освещенности и установите яркость соответственно
void BrightnessCheck() {
  if (auto_bright) {
    if (millis() - bright_timer > 1000) {     // каждые 100 мс
      bright_timer = millis();
      int bright = analogRead(BRI_PIN);        
      int bright_r;
      bright_r = bright%10 > 5 ? ((bright/10)*10)+10 : (bright/10)*10;
      new_bright = map(bright_r, 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 += 1;
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  } 
};

// / / Преобразование времени в массив, необходимый для отображения
void TimeToArray() {
  int Now = GetTime();  //  Получить текущее время

  int cursor = 114; // номер последнего светодиода

  // Serial.print("Time is: ");Serial.println(Now);
  if (DST) {  // if DST is true then add one hour
    Now += 100;
    // Serial.print("DST is ON, time set to : ");Serial.println(Now);
  };
  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; // get last digit in time
    if (i == 1) {
      //  Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;

      for (int k = 0; k <= 27; k++) {
        // Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();
      if (digit != last_digit)
      {
        cylon();
        ledColor =  ColorTable[random(16)];
      }
      last_digit = digit;

    }
    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[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 = 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();
    }
    Now /= 10;
  };
};
// / / Преобразование температуры в массив, необходимый для отображения
void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 17) {
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = dht.readTemperature();
  int celsius = t * 100;
  //   Serial.print("Temp is: ");Serial.println(celsius);

  int cursor = 114; // last led number

  leds[57] = 0x000000;
  leds[56] = 0x000000;

  for (int i = 1; i <= 4; i++) {
    int digit = celsius % 10; // get last digit in time
    if (i == 1) {
      // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;

      for (int k = 0; k <= 27; k++) {
        //  Serial.print(digits[11][k]);
        if (digits[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 HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 38) {
    HumidityShow = false;
    return;
  }
  HumidityShow = true;
  int h = dht.readHumidity();
  int humidity_percentage = h * 100;
  //   Serial.print("Humidity is: ");Serial.println(humidity_percentage);

  int cursor = 114; // last led number

  leds[57] = 0x000000;
  leds[56] = 0x000000;

  for (int i = 1; i <= 4; i++) {
    int digit = humidity_percentage % 10; // get last digit in time
    if (i == 1) {
      // Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;

      for (int k = 0; k <= 27; k++) {
        //  Serial.print(digits[11][k]);
        if (digits[12][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[12][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //  Serial.println();
    }
    else if (i == 2) {
      //  Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 58;

      for (int k = 0; k <= 27; k++) {
        //   Serial.print(digits[10][k]);
        if (digits[10][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[10][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //  Serial.println();
    }
    else if (i == 3) {
      //  Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
        //  Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();
    }
    else if (i == 4) {
      //  Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 0;
      for (int k = 0; k <= 27; k++) {
        //   Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      //  Serial.println();
    }
    humidity_percentage /= 10;
  };
};

void DSTcheck() {
  int buttonDST = digitalRead(2);
  // Serial.print("DST is: ");Serial.println(DST);
  if (buttonDST == LOW) {
    if (DST) {
      DST = false;
      // Serial.print("Switching DST to: ");Serial.println(DST);
    }
    else if (!DST) {
      DST = true;
      // Serial.print("Switching DST to: ");Serial.println(DST);
    };
    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);
  }
}
/* coool effect function*/
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}
void cylon () {
  static uint8_t hue = 0;
  // Serial.print("x");
  // First slide the led in one direction
  for (int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
  // Serial.print("x");
  // Now go in the other direction.
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
}

void loop()  // Main loop
{
  BrightnessCheck(); // Проверка яркости
  DSTcheck(); // Check DST
  TimeAdjust(); // Check to se if time is geting modified
  TimeToArray(); // Get leds array with required configuration
  TempToArray();
  HumidityToArray();
  FastLED.show(); // Display leds array
  if (TempShow == true) delay (5000);
  if (HumidityShow == true) delay (5000);
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

дополнить - это к автору скечча.