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

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

Taras9696 пишет:

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

Если в комплекте такие, как и у меня, то там толстая изоляция, а провод - г-но.

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

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

На 30 светодиодов двойное питание? А смысл. Теперь блок питания нормальный. И так потянет. Это первый блок на 1а гнал, вот и погорели. У меня на 3а стоит и 114 диодов(тьфу-тьфу-тьфу) и работает уже 3ю неделю

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

OdinochkA пишет:
На 30 светодиодов двойное питание? А смысл. Теперь блок питания нормальный. И так потянет. Это первый блок на 1а гнал, вот и погорели. У меня на 3а стоит и 114 диодов(тьфу-тьфу-тьфу) и работает уже 3ю неделю

Так зажгите их белым и померьте напряжение в начале и конце ленты. Повторяю, 30 светодиодов, это 1,8А в максимуме. Це, ИМХО.

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

И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.

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

OdinochkA пишет:

И снова всем доброго времени. Собрал я вчера наконец-то домашние часы, доделал части корпуса. Поставил, всё красиво. И тут через некоторое показывает температуру +35!!!! В комнате не поднималась температура выше 22*С и тут на тебе. Начал выяснять. Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.

3 цвета хавают по 20 милиампер белый все 60, так что если стоит смена цвета то поставь только красынй синий и зеленый, что б не было оттенков да бы не было перегревов, а то малоли часы как у меня загнуться, сейчас ппц как обидно, жду новую ленту( а дуину и все ост вывел на заднюю часть корпуса (через фанеру)дабы ленту схема и не видела, температура была норм но все же завышает этот датчик на 2 град, не знаю можно ли как то откалибровать

b707
Онлайн
Зарегистрирован: 26.05.2017

Taras9696 пишет:

но все же завышает этот датчик на 2 град, не знаю можно ли как то откалибровать

если просто завышает при любых температурах - из переменной celcius (строка 161 скетча #129) просто вычтите 2

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

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

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

Taras9696 пишет:

не знаю можно ли как то откалибровать

и да все верно написали из переменной int celsius = (t / 4.0); нужно просто вычесть погрешность

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

OdinochkA пишет:

Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.

просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =) 

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

dj-toxa пишет:

OdinochkA пишет:

Лента стояла на каком-то светлом режиме, середина нагрелась. Под лентой был модуль времени. И это его нагрело. В общем ещё раз убедился, что для температуры должен быть специализированный датчик.

просто не рациональное размещение RTC, при таком же не удачном расположении любого, хоть специализированного датчика, у вас так же показали бы черти чё. конструкцию нужно продумывать =) 

Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри. Датчики освещения и температуры вынесены наружу и обособлены от внешнего воздействия. Но не знание кода вносит свои коррективы. ПОэтому датчик температуры висит в одной стороне, а измерения приходят с другой стороны. (( Даже на рабочем варианте (в смысле на работе), стоит BMP180 и вынесен он за корпус где на него не попадает свет и пыль. Но пока что он просто для декора ((( В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе

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

Продолжаю взрывать мозг попыткой собрать код под BMP180. Собрал кучу примеров и скетчей и пытаюсь из кусков собрать рабочее. Вроде накидал и скетч скомпилировался. НО меня смущает строка  int t = RTC.temperature(); вроде как она говорит что значение t брать из часов, но мне то надо чтобы из ВМР бралось. В библиотеке ADAFRUIT_BMP085 я не понял где посмотреть. Да и примера кардинально отличаются от нашего способа вывода данных.

Вопрос: я правильно пытаюсь сделать или всё это вообще никуда не годится?

P.S.извиняюсь за кучу коментариев в коде, вставлял вырезал перебирал подбирал сравнивал

 

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

/*/
void TempToArray() {
 ///* tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 27) {
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = RTC.temperature();
  int celsius = (t / 4.0);
//инициализация датчика DHT11
// 1   DHT dht;
 // dht.begin();   // запускаем датчик DHT11
//Serial.println("DHTxx test!"); // пишем один раз
//delay(2000); 
  // Задержка 2 секунды между измерениями  
//2 float h = dht.readHumidity(); 
 //Считываем влажность 
//3 float t = dht.readTemperature(); 
 // Считываем температуру 
 int celsius = dht.temperature;
 */
 /*/{    
    TempShow = false;
    return;
  }
 */
// Функция вывода температуры
void TempToArray(){
    bmp.begin();
float readTemperature(void);

  int t = RTC.temperature();
  int celsius = (t / 4.0);
  
   /*/ bmp.getTemperature();
    if(bmp.getTempCByIndex(0)<0){
    int celsius = (bmp.getTempCByIndex(0)*(-1));
//  Serial.println(celsius);
  */
 {
  BrightDots(0);
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  int digit = celsius % 10;//  int digit = celsius % 10;    int digit = t % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));
};
};

 

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

OdinochkA пишет:

Продолжаю взрывать мозг попыткой собрать код под BMP180.

не нужно сразу пытаться получить готовый рабочий код, тем более собирая его из разных источников и пытаясь всё это объеденить. для этого есть монитор порта и Serial.print выведи необходимое, для начала туда. а потом уже будешь думать как полученное вывести на часах.

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

OdinochkA пишет:

Критику принял, но не согласен. Конструкция продумана. Всё основное спрятано внутри. 

не согласен с чем? что можно сказать, приклеил RTC к ленте? =) конструкция продуманна??? всё основное внутри....что именно лента и дуня =) эм.. освещение и термо вынесены наружу, при том что датчик с одной стороны, а измерения с другой, BMP180 вынесен за корпус где на него не попадает свет и пыль (так и внутри часов с ним будет так же всё в порядке) и это по вашему продуманная конструкция?  

OdinochkA пишет:

В вашем же случае, ваша температура есть нечто среднее между реальностью и погрешностью нагрева микросхемы. И вы считаете, что у меня не продумана конструкция. Да согласен, что я не в лаборатории где нужна абсолютная точность. НО если есть специализированные датчики, то для чего городить огород из погрешностей +/- пытаясь получить данные нагрева микрухи, а не окружающего воздуха. А если выносить датчик на улицу, то например нагрев на солнце + нагрев микрухи RTC будет показывать погоду на марсе

в моём же случае температура есть нечто среднее между реальностью и рабочей температурой микросхемы, которая как правило составляет +2 гадуса при комнатной температуре. да лабараторная точность мне нужна и кроме того я уже писал, что температура с RTC-ки была добавлена в первые версии скетча, когда не было еще просто в наличии ни каких других датчиков температуры, а часы уже были собраны и люди пытающиеся повторить данный проект, очень просили добавить температуру, которую на тот момент было просто не от куда брать, кроме как с RTC

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

Прошу помочь объяснить мне назначение в коде

void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 27) {
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = RTC.temperature();
  int celsius = (t / 4.0);
  BrightDots(0);
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));
};

значений

int t = RTC.temperature();

int celsius = (t / 4.0);

и int digit = celsius % 10;.

Для чего так много из одного в другое, и как можно обойтись без первых двух строк Чтобы от них не зависела третья строка с выводом данных на матрицу? Вроде собрал код но отсылка на RTC все сбивает. Без двух строк не хочет работать третья и последующие на которую идёт digit. Я так понимаю, что достаточно изменить переменную привязки t к RTC и этого будет достаточно.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

OdinochkA пишет:

Прошу помочь объяснить мне назначение в коде

Все просто

int t = RTC.temperature(); - чтение данных с температурного датчика. Это значение не в градусах, а в четвертях градуса, поэтому чтобы перевести его в градусы. нужна вторая строчка - поделить на 4:

int celsius = (t / 4.0);

Ну а дальше начинается разбиение градусов на цифры, Например, если у вас 24 градуса, строка

int digit = celsius % 10;.

даст остаток от деления на 10 - то есть цифру 4. Потом вы повторите этот трюк и получите цифру 2. Точно так же в процедуре работы со временем у вас из часов и минут делаются 4 цифры для вывода на экран.

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

Спасибо за разъяснения. Не уверен, что через N-ое время смогу вспомнить об этом, но сейчас я понял что к чему.

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

Самое главное, температура теперь берётся из BMP180 и она точная))) Может в последствии перейду на DHT11 ( а то для работы сильно жирно BMP датчик ставить).

Скетч загружен, время идёт, температура показывается, цвета меняются кнопками. Я доволен. Если вруг ещё чего нибудь прикрутится буду только рад. Спасибо всем помогавшим и критиковавшим (bwn, dj-toxa,   b707GennOk) Вы двигали мой прогресс. 

Фото рабочих часов на предыдущих страницах. Вечером добью домашние и сделаю фото.

 

//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define LEDS_IN_SEGMENT 3 //   Задаём сколько у нас светодиодов в сегменте.
#define COLOR_CHANGE 3    // ( 0 - NEVER, 1 - once a minute, 2 - every 10 min, 3 - hourly, 4 - every 10 hrs)
#define NUM_COLORS 16
#define COLOR_ORDER BGR   // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150
//#define BRI_PIN 3  // Вывод сенсора
#define BRI_PIN A6            // фоторезистор А3
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230        // максимальная яркость (0 - 255)
#define min_bright 1         // минимальная яркость (0 - 255)
#define bright_constant 1000   // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

Adafruit_BMP085 bmp;
//SFE_BMP180 bmp;

//BMP180 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

//DS3231 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

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

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов
uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit *0
  0b00011110,     // Digit C
  0b01111100,     // Digit P
};

bool Dot = true;
bool DST = false; // DCT false
bool TempShow = true;
int last_digit = 0;

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

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

  bmp.begin(); //датчик температуры

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

void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}
// снова датчик света
//Массив управляет яркостью
/*/
 //Старый метод изменения яркости
 void BrightnessCheck()
{
  const byte sensorPin = 6;
  //const byte brightnessLow = 50;
  //const byte brightnessHigh = 255;
  int sensorValue = analogRead(sensorPin);
  Serial.print("Освещение: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 255, 0, 10, 254);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
  // else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// НОвый метод изменения яркости
void BrightnessCheck() {

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

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

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

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

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

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

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

/*/
 //Пример на DHT11
 void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 17) {
    TempShow = false;
    return;  }
  TempShow = true;
  int t = dht.readTemperature();
  int celsius = t * 100; 
  //далее разбивка на светодиоды, можно взять ниже
 */


// Преобразуем Temp в массив для отображение
void TempToArray() {
  tmElements_t tm;
 //bmp.begin();
  RTC.read(tm);
  if (tm.Second != 27) {
    TempShow = false;
    return;
  }
  TempShow = true;
  int t = bmp.readTemperature();
  int celsius = t;
  BrightDots(0);
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));
};

/*/
//Функция вывода влажности
void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 38) {
    HumidityShow = false;
    return;
  }
  HumidityShow = true;
  int h = dht.readHumidity();
  int humidity_percentage = h * 100;
  //   Serial.print("Humidity is: ");Serial.println(humidity_percentage);

  int cursor = 114; // last led number

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

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

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

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



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

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

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

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

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

void loop()
{ 
  BrightnessCheck(); // Проверяем датчик
  DSTcheck(); // Проверяем режимы
  TimeAdjust(); // Проверяем время если сменилось на 1 цифру
  TimeToArray(); // Проверяем часы если сменилось на 1 цифру
  TempToArray();
  //HumidityToArray(); //если будет влажность
  FastLED.show(); // Задаём массив светодиодов
  if (TempShow == true) delay (5000);
Serial.print("T=");
    Serial.print(bmp.readTemperature());
    Serial.println("*C");
    //Serial.println();
    //delay(5000);
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Поздравляю!

Всегда рад помочь.

DHT11 - это полное Г. не надо его ставить

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

Молодец. Для наружки, достаточно удобно, типа АМ2301 и брешет не очень сильно. DHT11, присоединяюсь к предыдущему оратору.

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

можно даллас 18b20 поставить, обычный дома, а в герметичном исполнении на улицу

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

для внутри дома недорог AM2320 c i2c на борту. Врёт, канеш, но не сильно.  У мня в сортире/ванной около 3 лет трудица. 

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

Ошибка 404

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

Снимаю свой вопрос. ))) В сом порту я привел их к мм рт.ст., а тут забыл перевести. Они показывали в Паскалях)) вот и шла каша.

Новый код с выводом Давления

 

//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define LEDS_IN_SEGMENT 3 //   Задаём сколько у нас светодиодов в сегменте.
#define COLOR_CHANGE 3    // ( 0 - NEVER, 1 - once a minute, 2 - every 10 min, 3 - hourly, 4 - every 10 hrs)
#define NUM_COLORS 16
#define COLOR_ORDER BGR   // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150
//#define BRI_PIN 3  // Вывод сенсора
#define BRI_PIN A3            // PIN фоторезистора
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230        // максимальная яркость (0 - 255)
#define min_bright 1         // минимальная яркость (0 - 255)
#define bright_constant 1000   // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

Adafruit_BMP085 bmp;
//SFE_BMP180 bmp;

//BMP180 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

//DS3231 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

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

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

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

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

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

  bmp.begin(); //датчик температуры

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

void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}
//Массив управляет яркостью
/*/
 //Старый метод изменения яркости
 void BrightnessCheck()
{
  const byte sensorPin = 6;
  //const byte brightnessLow = 50;
  //const byte brightnessHigh = 255;
  int sensorValue = analogRead(sensorPin);
  Serial.print("Освещение: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 255, 0, 10, 254);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
  // else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// Новый метод изменения яркости
void BrightnessCheck() {

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

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

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

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

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

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

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

/*/
 //Пример на DHT11
 void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 17) {
    TempShow = false;
    return;  }
  TempShow = true;
  int t = dht.readTemperature();
  int celsius = t * 100; 
  //далее разбивка на светодиоды, можно взять ниже
 */


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

// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
 // Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
 //bmp.begin();
  RTC.read(tm);
  if (tm.Second != 32) {
    PressureShow = false;
    return;
  }
  PressureShow = true;
  int p = bmp.readPressure() / 133.322;
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));  //0  начало знака Давления (Р) 1й блок
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2 ));  //21  2й блок вывода первой цифры значения
};
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ


/*/
//Функция вывода влажности
void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 38) {
    HumidityShow = false;
    return;
  }
  HumidityShow = true;
  int h = dht.readHumidity();
  int humidity_percentage = h * 100;
  //   Serial.print("Humidity is: ");Serial.println(humidity_percentage);

  int cursor = 114; // last led number

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

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

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

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



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

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

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

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

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

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

 

Итак: Основа часов, подоконник ПВХ, подложка с вырезанными цифрами - строительный утеплитель пеноплекс, светорассеиватель - лист ватмана, оргстекло, алюминиевый уголок 40*10 для рамки. Размеры всей конструкции 666*250*40. Комплектация: Ардуино Nano, DS3231, BMP180, фоторезистор модуль, лента WS2812b, кнопки, разъём питания, кучка проводов (витая пара и мгтф), резистор 220 Ом, ну и конечно куда без горячих соплей.

Подоконник выбрал из-за пустот, лёгкости и простоты обработки. Внутренние перегородки со стороны размещения электроники вырезал полотном ножовки по металлу, что-то просто выкусил. За эстетизм не гнал, всё равно всё будет закрыто. В данным момент часы лежат на балконе, проходят обкатку низкими температурами. BMP долго остывает, за час температура снизилась с 26 до 8*С. Фоторезистор не совсем удачно разместил, идет засветка от самих цифр и не реагирует на окружающее освещение. Пришлось засунуть в темную трубочку (позже приклею к корпусу).

 

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

Симпатично. ИМХО, усилил бы питание на ленты, больше сотни диодов и заход сопельками с одного конца. Взять в стройтоварах 0,75квадрата многожильный и продублировать на каждый разряд, места навалом.

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

мде

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

b707 пишет:

Поздравляю!

Всегда рад помочь.

появилась проблемка, код перписали под любое количество диодов на сегмент, а как быть с точками, у меня лента ws2811 всего используется 29 кусков ленты (по три диода каждый), 28 из которых сегменты, а один разделительные точки. чет не пойму как быть где рыть

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

Так и пусть весь сегмент моргает, а серединный диод заклеить изолентой или просто выпаять. У наших точек есть координаты: 2 точки две координаты. У вас получится одна координата

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

OdinochkA пишет:
Так и пусть весь сегмент моргает, а серединный диод заклеить изолентой или просто выпаять. У наших точек есть координаты: 2 точки две координаты. У вас получится одна координата

так так и нужно, но новый скетч заточен под 2812 и две средних точки, вычисяются как я понял из 

#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2)

#define DOT1  (LEDS_IN_SEGMENT * 14)

#define DOT2  (LEDS_IN_SEGMENT * 14  + 1)

 но у меня то точка получается как бы одна, а по такому скетчу у меня моргает две (которая разделительная и следующая, средняя на третьей цифре) =(

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

Т.е. разделительный сегмент моргает? Тогда может просто убрать координаты второй точки? И почистить код от упоминаний Dot2

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

OdinochkA пишет:
Т.е. разделительный сегмент моргает? Тогда может просто убрать координаты второй точки? И почистить код от упоминаний Dot2

ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =) 

b707
Онлайн
Зарегистрирован: 26.05.2017

dj-toxa пишет:

ну на сколько я понимаю Dot1 и Dot2 это константы с которых ведётся расчет общего колличества диодов, просто ни кто не прикидывал мой вариант с одним диодом вместо двух =) 

dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.

Непонятно

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

b707 пишет:

dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.

Непонятно

 чуши нет с лентой 2811 не свтречались что ли? там один пиксель, это три диода 5050 упраляемые одной микросхемой. в 2812 она встроена в каждый диод а тут несколько иначе, грядка из трёх диодов управляется одной общей микрухой. если рассматривать с логики 2812 то у меня на точках одна точка.

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

b707 пишет:

Непонятно

ну если не понятно то 2812 29 штук и разделительная точка одна

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

как под такой расклад скетч поправить?

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

b707 пишет:

dj-toxa - уточните все-таки, сколько у вас диодов используется под "точки". А то чуть выше пишете, что на точки у вас отдеден сегмент из трех диодов, а теперь пишете, что всего один.

Непонятно

загугли лента ws2811 там один пиксель в скетче это грядка из трёх диодов на одной микросхеме

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

пусть будет 29 штук 2812 одна точка по середине(15я). как поправить? мигает одна

b707
Онлайн
Зарегистрирован: 26.05.2017

dj-toxa - можно было пять ответов и не писать :) я с первого раза обычно понимаю :)

вот держите, поправил на скорую руку код Одиночки из сообщения #172. Число точек  - параметр DOTS_NUM Больше ничего менять не надо

Не проверял. Если будут ошибки - пишите, исправлю вечером

//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define LEDS_IN_SEGMENT 3 //   Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2
#define COLOR_CHANGE 3    // ( 0 - NEVER, 1 - once a minute, 2 - every 10 min, 3 - hourly, 4 - every 10 hrs)
#define NUM_COLORS 16
#define COLOR_ORDER BGR   // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13
//#define BRIGHTNESS 150
//#define BRI_PIN 3  // Вывод сенсора
#define BRI_PIN A3            // PIN фоторезистора
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 230        // максимальная яркость (0 - 255)
#define min_bright 1         // минимальная яркость (0 - 255)
#define bright_constant 1000   // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;

Adafruit_BMP085 bmp;
//SFE_BMP180 bmp;

//BMP180 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

//DS3231 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

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

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

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

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

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

  bmp.begin(); //датчик температуры

  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
void BrightDots (boolean Dot_On) {
  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()
{
  const byte sensorPin = 6;
  //const byte brightnessLow = 50;
  //const byte brightnessHigh = 255;
  int sensorValue = analogRead(sensorPin);
  Serial.print("Освещение: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 255, 0, 10, 254);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
  // else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/
// Новый метод изменения яркости
void BrightnessCheck() {

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

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

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

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

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

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

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

/*/
 //Пример на DHT11
 void TempToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 17) {
    TempShow = false;
    return;  }
  TempShow = true;
  int t = dht.readTemperature();
  int celsius = t * 100; 
  //далее разбивка на светодиоды, можно взять ниже
 */


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

// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
 // Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
 //bmp.begin();
  RTC.read(tm);
  if (tm.Second != 32) {
    PressureShow = false;
    return;
  }
  PressureShow = true;
  int p = bmp.readPressure() / 133.322;
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  //0  начало знака Давления (Р) 1й блок
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM ));  //21  2й блок вывода первой цифры значения
};
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ


/*/
//Функция вывода влажности
void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 38) {
    HumidityShow = false;
    return;
  }
  HumidityShow = true;
  int h = dht.readHumidity();
  int humidity_percentage = h * 100;
  //   Serial.print("Humidity is: ");Serial.println(humidity_percentage);

  int cursor = 114; // last led number

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

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

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

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



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

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

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

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

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

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

 

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

b707 пишет:

dj-toxa - можно было пять ответов и не писать :) я с первого раза обычно понимаю :)

вот держите, поправил на скорую руку код Одиночки из сообщения #172. Число точек  - параметр DOTS_NUM Больше ничего менять не надо

Не проверял. Если будут ошибки - пишите, исправлю вечером

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

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

b707 пишет:

Не проверял. Если будут ошибки - пишите, исправлю вечером

проверил, вроде пашет, сначало все люто тупило пока не закоментил последние строчки Serial.print. после этого вроде всё ожило но какието-то подтормаживания на нажатия кнопок всё равно присутствуют. срабатывают не сразу по нажатию, а примерно с задержкой в секунду.

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

dj-toxa пишет:

 срабатывают не сразу по нажатию, а примерно с задержкой в секунду.

скинул delay(500); на кнопках до 100 стало нормуль. а то часы ладно их не долго ждать по пол секунды, а вот минут если надо 40-50 выставить ждять запаришься =)

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

Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))

 

#include <DHT.h>
#include <DHT_U.h>
//#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

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

DHT dht(8, DHT11);            // к какому порту подключаем DHT11 для влажности PIN_8
Adafruit_BMP085 bmp;          // BMP180 для давления и температуры
//SFE_BMP180 bmp;             

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

//DS3231 PINS 
//SCL -> SCL or A5
//SDA -> SDA or A4

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

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

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

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

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

  bmp.begin(); //датчик температуры
  dht.begin(); //датчик влажности
  
  //LEDS.setBrightness(75); // Задаём яркость
  pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
  pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
void BrightDots (boolean Dot_On) {//координаты мигающих точек
  leds[DOT1] = (Dot_On) ? ledColor : 0;
  leds[DOT2] = (Dot_On) ? ledColor : 0;
}

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

//Массив управляет яркостью
/*/
 //Старый метод изменения яркости
 
 void BrightnessCheck()
{
  const byte sensorPin = 6;
  //const byte brightnessLow = 50;
  //const byte brightnessHigh = 255;
  int sensorValue = analogRead(sensorPin);
  Serial.print("Освещение: ");
  Serial.println(sensorValue);
  sensorValue = map(sensorValue, 255, 0, 10, 254);
  LEDS.setBrightness(sensorValue);
  // if (sensorValue <= 10) {LEDS.setBrightness(brightnessLow);}//если темно то минимум
  // else {LEDS.setBrightness(brightnessHigh);}//если светло то максимум
};
*/

// Новый метод изменения яркости
void BrightnessCheck() {

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

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

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

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

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

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

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

// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
 // Измеряем давление
 void PressureToArray() {
  tmElements_t tm;
 //bmp.begin();
  RTC.read(tm);
  if (tm.Second != 30) {//через какое время показывать давление
    PressureShow = false;
    return;
  }
  PressureShow = true;
//  delay(3000);
  int p = bmp.readPressure() / 133.322;
  int Pressure = p;
  BrightDots(0); //разделительные мигающие точки выключены
  BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));  //0  начало знака Давления (Р) 1й блок
//  Pressure /= 10;
  int digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 ));  //65  4й блок вывода третьей цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));  //44  3й блок вывода второй цифры значения
  Pressure /= 10;
  digit = Pressure % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2 ));  //21  2й блок вывода первой цифры значения
};
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
// ^^^^^^^ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ^^^^^


// \/\/\/\/\/\/ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ\/\/\/\/
//============ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ============
 //Вывод влажности
 //Пример на DHT11
 void HumidityToArray() {
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 35) {//через какое время показывать влажность
    HumidityShow = false;
    return;  
  }
  HumidityShow = true;
//  delay(3000); 
  int h = dht.readHumidity();
  int humidity = h;
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    //65  конец знака процентов (%) 4й блок
  BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   //44  начало знака процентов (%) 3 блок
  int digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));  //21  2й блок вывода второго символа
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 2));  //0  1й блок вывода первого символа
};

// ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ
//^^^^^^^^^^^^^^^^^ЗАКОМЕНТИРОВАТЬ ЕСЛИ НЕ ПОЛУЧИТСЯ^^^^^^^^^^^^^^^^

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

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

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

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

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

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

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

 //   Serial.print (" *** ");
    Serial.println (" *** "); // 
}

последний мокрый

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

OdinochkA пишет:

Всем доброго времени. Доработал ещё маленько проект. Прикрутил DHT11 для определения влажности. Вроде показывает правильно, при наложении сверху мокрой тряпицы изменения растут. Практически полноценная метеостанция )))

Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.
Берете баночку, насыпаете на дно соль поваренную (не йодированную), капаете чуть воды, чтобы смочило кучку, но без каши. Подвешиваете в эту баночку свой датчик и закрываете пленкой-стретчем. Баланс устанавливается достаточно долго, пару-тройку часов. Если покажет стабильно 72-76%, значит почти идеальный в верхнем пределе. 
Для остальных пределов, нужна хим.лаборатория с разными х.ч.солями.

P/S А с процентами хорошо придумали, не додумался.))))

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

bwn пишет:

Зачем такую каку взяли? А правильность проверить просто, правда дома только по верхнему пределу получиться.

Ну что было ((. Да и используется он только для одного значения. BME280 пока в дороге. ПРидет, тогда заменю всё одним датчиком. Спасибо за способ проверки. На выходных попробую поэкспериментировать