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

Sinopsis
Offline
Зарегистрирован: 17.06.2019

sadman41 пишет:

В FastLED цвета задаются как в HTML

Спасибо

AyuOX
AyuOX аватар
Offline
Зарегистрирован: 07.05.2019

Всем привет. Почти доделал. Вот что получилось.
https://youtu.be/qLVG0Eqj_oI

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

Всем доброго времени. Заменил я BMP180 на BME280. Есть разница в измерении температуры и влажности. На 280 эти значения в температуре +3*С, влажность +5%. Почистил слегка код от того, что теперь не используется. По предыдущим коментариям по делеям в поледних строках 272-275 (нынешнее 342-344), дык там же время показа. Если их убрать значения на часах разве будет отображаться корректно?

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

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

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

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

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

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

CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t  digits[] = {
  0b00111111,     // Digit 0
  0b00100001,     // Digit 1
  0b01110110,     // Digit 2
  0b01110011,     // Digit 3
  0b01101001,     // Digit 4
  0b01011011,     // Digit 5
  0b01011111,     // Digit 6
  0b00110001,     // Digit 7
  0b01111111,     // Digit 8
  0b01111011,     // Digit 9
  0b01111000,     // Digit * градус  10
  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);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

AyuOX пишет:
Всем привет. Почти доделал. Вот что получилось. https://youtu.be/qLVG0Eqj_oI

Неплохо получилось, интересная идея.

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

Идея прикольная, воплощение тяжелое. Но всё вправе быть! Иди попробуй повтори. Но я бы сказал, не картина теряется на фоне, а часы - на фоне картины. Тут надо что-то поменять.

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

AyuOX пишет:
Всем привет. Почти доделал. Вот что получилось. https://youtu.be/qLVG0Eqj_oI

красиво!

Aleksis7
Offline
Зарегистрирован: 19.03.2019

OdinochkA пишет:

Всем доброго времени. Заменил я BMP180 на BME280. 

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

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

Aleksis7 пишет:
Всё работает, хочется еще чтобы и отрицательную температуру показывало.

Есть предложение убрать знак "С", всё передвмнуть чтобы освободить вначале место под знак "-".

Ну тут как бы всё упрётся в эстетизм. Я так понимаю что надо два термометра: один внутри дома второй на улице. Ладно с домашним всё ясно. Всё остаётся как есть. А вот уличный будет выглядеть не кашерно. Для минуса придется убрать все знаки на 3 и 4м блоках и сдвинуть значение температуры на это место, иначе будет большой пробел из-за разделительных точек. Опять же летом минуса не будет ( хотя может вы на севере живёте))),  и тогда у вас просто будут две цифры появляться без каких либо опознавательных знаков. Была идея сделать значение температуры по цвету. Типа минус - синий, жарко - красный, но это сильно увеличит код и много заморочек. Как вариант добавить перед лентой светодиодов ещё 2 диода, чтоб срабатывал только на минус. ОПять нужно будет менять цифры в коде (хотя это уже менее трудновыполнимо)

Aleksis7
Offline
Зарегистрирован: 19.03.2019

Часы висят на темной стене, пробел не так заметен.

Пока хочу хотябы один датчик на улицу. Здесь вместо "С" минус, переместил вначало(Это все что я пока умею).

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

OdinochkA пишет:

Была идея сделать значение температуры по цвету. Типа минус - синий, жарко - красный, но это сильно увеличит код

строчек на пять, навскидку :)

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

Aleksis7 пишет:

Здесь вместо "С" минус, переместил вначало(Это все что я пока умею).

 

ну и отлично. А что не так с кодом?

Aleksis7
Offline
Зарегистрирован: 19.03.2019

На картинках просто пример как это выглядит у меня, там первый блок перемещен и изменен символ "С". На первой он потушен, на второй изменен на минус и горит всегда.

Aleksis7
Offline
Зарегистрирован: 19.03.2019

OdinochkA пишет:

 Типа минус - синий, жарко - красный, но это сильно увеличит код и много заморочек. Как вариант добавить перед лентой светодиодов ещё 2 диода, чтоб срабатывал только на минус. ОПять нужно будет менять цифры в коде (хотя это уже менее трудновыполнимо)

Цветом хорошая идея. Добавлять два диода тоже не очень смотрется будет, как и большое растояние в середине. Думаю давление тоже не очень смотрится с болшим пробелом.

 

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

Aleksis7 пишет:

Цветом хорошая идея.

ни вопрос. Если Одиночка разрешит, могу добавить смену цвета от температуры в его код из сообщения #303. Если кто другой хочет потренироваться - дерзайте, задчка элементарная

В принципе, можно даже сделать смену цвета не просто "плюс" и "минус", а по диапазонам - например меньше 0 С - синее, от нуля до +10 С - зеленое, от 10 до +25 - желтое, ну и выше +25 - красное :)

Цвета подбирайте сами, у меня с дизайном не очень, это просто как пример.

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

Совсем уже . Меня спрашивать разрешения.? Это мы, недалёкие до кода, должны вас просить о помощи. И по цвету даже не представляю как будет выглядеть эта радуга. Допустим время 20:15 красное, за бортом -10 цвет синий. Во моргалики будут. А градации от температуры здорово. -30-16 синий, -15-5 голубой, -4+4 белый, +5+15 жёлтый, +16+30 оранжевый, +30^ красный

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

OdinochkA пишет:
И по цвету даже не представляю как будет выглядеть эта радуга. Допустим время 20:15 красное, за бортом -10 цвет синий.

да, я тоже об этом подумал, но решил не грузить проблемами раньше времени :)

Ну решайте - может и правда слишком пестро будет.  Я в этом не очень разбираюсь, не художник :)

тогда надо что-то другое придумать.

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

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

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

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

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

С фастледом вы ещё и перелив относительно легко можете сделать с одного цвета в другой.

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

dj-toxa пишет:

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

А можно на плюс и минус менять только цвет точек :)

Вообще, лучше все эти варианты в реале посмотреть, это вопрос к тем, у кого сами часы есть :)

Я тут только теоретик, у меня часов нет.

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

OdinochkA пишет:
Допустим время 20:15 красное, за бортом -10 цвет синий. Во моргалики будут.

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

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

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

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

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

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

dj-toxa пишет:

b707 дружище, ты у нас тут самый гуру в кодинге, а как насчет сделать меню для этого чуда? я уже как то предлагал

ну да, ты уже предлагал - а я уже отвечал, что я за это не возьмусь. Понимаешь, те правки, которые я добавил в код на 3-4й странице темы - заняли у меня от силы полчаса.  А добавлять меню, а тем более вай-фай - это серьезная работа, уже между пивом не сделать. К тому же , как уже писал - самих часов у меня нет, а вносить серьезные правки в код без тестов - это секс по телефону какой-то :)

sv.valek
Offline
Зарегистрирован: 13.07.2019

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

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

sv.valek пишет:

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

Автояркость зависит от времени или показания часов зависят от времени?

А код... ну как обычно - должен выглядеть как строчки буковок.

sv.valek
Offline
Зарегистрирован: 13.07.2019

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

 

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

Автояркость, это когда яркость зависит внешнего от освещения, а не от времени суток.

А чтобы знать, какие буковки и в каком порядке - нужно учебники почитать. Какие - написано в прикрепленной теме раздела "Песочница".

sv.valek
Offline
Зарегистрирован: 13.07.2019

а как по твоему назывется зменение яркости в зависимости от времени на часах?)

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

sv.valek пишет:

а как по твоему назывется зменение яркости в зависимости от времени на часах?)

а зачем оно нужно? В скетче уже есть автояркость от датчика освещения - и это значительно более "правильное" решение, чем яркость от времени. Ведь день может быть и солнечным и пасмурным - и яркость нужна разная. А ночью может быть включен свет либо полная темнота - и опять настройки должны отличаться. Во всех этих случаях автояркость от датчика - рулит, а яркость по часам постоянно будет врать.

sv.valek
Offline
Зарегистрирован: 13.07.2019

всецело согласен с тобой. но сейчас датчика у меня нет.

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

sv.valek пишет:

а как по твоему назывется зменение яркости в зависимости от времени на часах?)

Называется "суточное изменение яркости". Ключевое слово "суточное". Но, как справедливо отметил b707, - это весьма сомнительное решение. И "сейчас нет датчика" никак это обстоятельство не отменяет.

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

sv.valek пишет:

всецело согласен с тобой. но сейчас датчика у меня нет.

значит собери часы пока без автояркости. Датчик купишь - добавишь

sv.valek
Offline
Зарегистрирован: 13.07.2019

да я уже собрал.) вот те что сверху у меня с суточной автояркостью. но она на пик 16 собраны.

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

sv.valek пишет:

да я уже собрал.) вот те что сверху у меня с суточной автояркостью. но она на пик 16 собраны.

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

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

sv.valek
Offline
Зарегистрирован: 13.07.2019

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

alex75
Offline
Зарегистрирован: 02.08.2019

Всем добрый день! Подскажите как изменить скетч для ам2320 чтоб температуру и влажность показывало

alex75
Offline
Зарегистрирован: 02.08.2019

[quote=DetSimen]

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

День добрый. как код изменить под AM2320?

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

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


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

вот код

#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 1    // Задаём сколько у нас светодиодов в сегменте.
#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 + 1)  //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() {

  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 - 1));  //21  2й блок вывода второго символа //трогал!!!
  celsius /= 10;
  digit = celsius % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 1));  //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 - 1));  //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 - 1 ));  //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 - 1));  //21  2й блок вывода второго символа  //трогал!!!
  humidity /= 10;
  digit = humidity % 10;
  BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - 1));  //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 (" *** "); // 
}

 

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

Dgeka - а что не так? По картинке не понятно

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

b707 пишет:
Dgeka - а что не так? По картинке не понятно
отображение часов на часах ,извиняюсь за каламбур согласно данных с ком порта там индицируется 22-13

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

Все равно непонятно.

В коде что-нибудь трогали?

Когда появляется эта беда? - после показа температуры, давления или влажности?

Долго ли держится такое? - до смены следующей минуты, часа, навсегда.

И вообще, чем больше симптомов вы опишете - тем легче будет лечить

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

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

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

dgeka пишет:
В коде закоментировал строчки с упоминанием второй точки так как она выполнена одним кусочком ленты.
А если убрать  этот коментарий второй точки? пробовали таким вариантом? Да и к тому же скетч считает кол-во диодов, а не кусков ленты. Где то на пару страниц назад был код с одной точкой, но в последствии его переделали кажется под универсальные точки. Там просто указывается количество точек. Сообщение №303 строка 19 #define DOTS_NUM 2            // Задаём количество разделительных точек

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

Может я не правильно сделал что влез в тему с другим кодом ? Но я жалуюсь на код из 341 сообщения.

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

dgeka пишет:
Может я не правильно сделал что влез в тему с другим кодом ? Но я жалуюсь на код из 341 сообщения.

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

Скажите, до вашей правки числа точек код работал?

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

Нет ,не работал

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

dgeka пишет:
Нет ,не работал

а где вы его взяли?

Может, тогда стоит воспользоваться советом Одиночки и взять код из сообщения 303 - он проверенный