Большие настенные часы на 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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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 пока в дороге. ПРидет, тогда заменю всё одним датчиком. Спасибо за способ проверки. На выходных попробую поэкспериментировать

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

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

и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.

int celsius = ((t-2) / 4.0) * 100;

 

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

Taras9696 пишет:

и вопрос по поводо коректировки температуры, как это провернуть вообще не понял написали от температуры вычесть 2 просто, но ничего не выйшло 0 реакций.

int celsius = ((t-2) / 4.0) * 100;

 

написали из переменной celcius вычесть два - а вы откуда вычитаете? и еще непонятно, зачем вы скобку (t/4.0) на 100 умножаете, у Одиночка такого не было.

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

это просто ад) просто ппц, от чего могут выходить из строя 2812б? нормальный бп просадок 9 миливольт, вроде все ок по питанию, в одном диоде сгорел синий цвет, и 2 сигмента вообще не пашут, просто горят микроконтроллеры, ппц)

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

Не зажариваете их? Попробуйте питание до 4,6-4,7 снизить, белым светом на полной яркости не баловаться.

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

работали на 75% в прошивке, сейчас снизил до 55% посмотрим сдохнут или нет. и самое интересное работали на столе 3 дня и все ок, повесил на стену утром 2 сектора в минус, что то на стене не так, перевесил в другое место протестирую ппц они задрали, вторая лента в доноры ушла

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

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

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

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

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

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

/*
Подключение к Arduino nano:
Часы DS3231:    SCL -> A5
                SDA -> A4
Датчик освещения    -> A3                
Кнопки: Смена часов -> D2 
        Смена минут -> D3
        Смена цвета -> D4
Датчик температуры  -> D10        
Лента WS2811(WS2812)-> D13
*/
//---------------------------------------------------------------------------------------------------
#include <DS3232RTC.h>            // для работы с модулем часов реального времени
#include <Time.h>                 // для работы с модулем часов реального времени
#include <Wire.h>                 // для работы с модулем часов реального времени
#include <FastLED.h>              // для работы с диодной ленты
#include <OneWire.h>              // для работы с датчиком температуры
#include <DallasTemperature.h>    // библиотека температурного сенсора DS18B20

#define LEDS_IN_SEGMENT 1         // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 1                // задаём сколько у нас разделительных точек
#define COLOR_CHANGE 0            // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define NUM_COLORS 16             // количество цветов
#define COLOR_ORDER BGR           // по умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13               // пин ленты 
#define BRI_PIN A3                // пин фоторезистора
#define auto_bright 1             // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 250            // максимальная яркость (0 - 255)
#define min_bright 80             // минимальная яркость (0 - 255)
#define bright_constant 1000      // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.9                  // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define ONE_WIRE_BUS 10           // пин температурного датчика DS18B20 

OneWire oneWire(ONE_WIRE_BUS);    // настройка oneWire для связи с любыми устройствами OneWire
DallasTemperature sensors(&oneWire);  // подключаем DS18B20 к oneWire

int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
//---------------------------------------------------------------------------------------------------
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
//---------------------------------------------------------------------------------------------------
CRGB leds[NUM_LEDS]; // задаём значение светодиодов
uint8_t  digits[] = {
  0b00111111,     // цифра 0
  0b00100001,     // цифра 1
  0b01110110,     // цифра 2
  0b01110011,     // цифра 3
  0b01101001,     // цифра 4
  0b01011011,     // цифра 5
  0b01011111,     // цифра 6
  0b00110001,     // цифра 7
  0b01111111,     // цифра 8
  0b01111011,     // цифра 9
  0b01111000,     // символ * градус 10
  0b00011110,     // символ C        11
  0b01111100,     // символ P        12
  0b01111000,     // символ % знак % из двух частей 13
  0b01000111,     // символ % знак % из двух частей 14
};
//---------------------------------------------------------------------------------------------------
bool Dot = true;
bool TempShow = true;
int last_digit = 0;
//---------------------------------------------------------------------------------------------------
long ledColor = CRGB::Aqua; // используемый цвет
long ColorTable[NUM_COLORS] = {
  CRGB::Red,
  CRGB::Orange,
  CRGB::Yellow,
  CRGB::Blue,
  CRGB::Green,
  CRGB::Purple,
  CRGB::Pink,
  CRGB::White,
  CRGB::Violet,
  CRGB::SkyBlue,
  CRGB::LightBlue,
  CRGB::Green,
  CRGB::Lime,
  CRGB::Blue,
  CRGB::Red,
  CRGB::Cyan
};
//---------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  Wire.begin();
  LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//---------------------------------------------------------------------------------------------------
  //LEDS.setBrightness(75); // задаём яркость
  pinMode(4, INPUT_PULLUP); // кнопка смены цветов
  pinMode(3, INPUT_PULLUP); // кнопка смены минут
  pinMode(2, INPUT_PULLUP); // кнопка смены часов
  sensors.begin();
  sensors.requestTemperatures(); // отправляем команду для получения показаний температуры
}
//---------------------------------------------------------------------------------------------------
void BrightDots (boolean Dot_On) {
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
  leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
  }
}
//---------------------------------------------------------------------------------------------------
void BrightDigit (uint8_t digit, uint8_t cursor)
{
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1)
  {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++)
    {
      leds[cursor] = (digit & mask) ? ledColor : 0;
      cursor ++;
    }
  }
}
//--------------------------------------------массив управления яркостью -------------------------------------------------------
void BrightnessCheck() {
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef - new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};
//---------------------------------------------------получаем время--------------------------------------------------------------
int GetTime()
{
  tmElements_t Now;
  RTC.read(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)
      {
        ledColor =  ColorTable[random(NUM_COLORS)];    // цикличное изменение цветов
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};
//----------------------------------------------Функция вывода температуры----------------------------------------------------------
void TempToArray(){      // вывод температуры с DALLAS DS18B20          
  tmElements_t tm;
  RTC.read(tm); 
  if (tm.Second != 30) {        
  TempShow = false;          
    return;                    
  }
 TempShow = true;             
  sensors.requestTemperatures();                                // отправляем команду для получения показаний температуры
  int celsius = sensors.getTempCByIndex(0);
  BrightDots(0);                                                //разделительные мигающие точки выключены
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // начало знака Цельсия (С) 4й блок
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // начало знака Градус (*) 3й блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  // 2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  // 1й блок вывода первого символа
};
//----------------------------------------------------------------------------------------------------
/*
 void TempToArray() {       //Вывод температуры с DHT11 
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 17) {
    TempShow = false;
    return;  }
  TempShow = true;
  int t = dht.readTemperature();
  int celsius = t * 100; 
  BrightDots(0);  //разделительные мигающие точки выключены
  BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7));    // начало знака Цельсия (С) 4й блок
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // начало знака Градус (*) 3й блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  // 2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  // 1й блок вывода первого символа
};
//-----------------------------------------------------------------------------------------------------------
  void TempToArray(){        //Вывод температуры с RTC3231 
  tmElements_t tm;
  RTC.read(tm);
  if (tm.Second != 30) {
    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));    // начало знака Цельсия (С) 4й блок
  BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14));   // начало знака Градус (*) 3й блок
  int digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));  // 2й блок вывода второго символа
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));  // 1й блок вывода первого символа
};
*/
//------------------------------------------смена цвета кнопкой DST пин D4---------------------------------------------------------
void DSTcheck() {
  int buttonDST = digitalRead(4);
  if (buttonDST == LOW) {
    ledColor =  ColorTable[random(NUM_COLORS)];
  };
  delay(200);
};
//-----------------------------------массив управляет кнопками с часами и минутами--------------------------------------------------
void TimeAdjust() {
  int buttonH = digitalRead(2);
  int buttonM = digitalRead(3);
  if (buttonH == LOW || buttonM == LOW) {
    delay(200);
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    int second = Now.Second;
    if (buttonH == LOW) {
      if (Now.Hour == 23) {
        Now.Hour = 0;
      }
      else {
        Now.Hour += 1;
      };
    }
    else
    {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };
    RTC.write(Now);
  }
}
//--------------------------------------------------меняем эффекты-------------------------------------------------
void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(250);
  }
}
//---------------------------------------массив отвечает за цикличное изменение цветов-----------------------------
void cylon () {
  static uint8_t hue = 0;
  Serial.print("x");
  // сдвигаем один светодиод в любом направлении
  for (int i = 0; i < NUM_LEDS; i++) {
    // устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // показываем светодиоды
    FastLED.show();
    fadeall();
    // ждём немного и повторяем цикл
    delay(10);
  }
  Serial.print("x");
  // Сдвигаем один светодиод в любом направлении
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
    // устанавливаем 1 светодиод на цвет красный
    leds[i] = CHSV(hue++, 255, 255);
    // показываем светодиоды
    FastLED.show();
    fadeall();
    // ждём немного и повторяем цикл
    delay(10);
  }
}
//-----------------------------------------------------------------------------------------------------------------
void loop() { 
  BrightnessCheck();                  // проверяем датчик освещения
  DSTcheck();                         // проверяем режимы
  TimeAdjust();                       // проверяем время если сменилось на 1 цифру
  TimeToArray();                      // проверяем часы если сменилось на 1 цифру
  TempToArray();                      // температура
  FastLED.show();                     // задаём массив светодиодов
  if (TempShow == true) delay (2000); // время отображения температуры (3000 = 3 сек)
}