ARDUINO Нужна помощь в доработке кода часов.

Alekcandr

✩✩✩✩✩✩✩
24 Июл 2020
1
0
Сделал часы на ленте ws2812b как сделать управление яркостью с помощью фоторезистора.
 

Вложения

Изменено:

Alex Kireev

✩✩✩✩✩✩✩
24 Авг 2024
6
1
По идее лучше использовать библиотеку неопиксель и уйти от задержек делей


C++:
#include "Adafruit_GFX.h" // библиотеки для работы с адресной лентой
#include "Adafruit_NeoMatrix.h"
#include "Adafruit_NeoPixel.h"

#include "DHT.h" // библиотека для датчика DHT11
 
#include "iarduino_RTC.h" // библиотека для модуля часов
iarduino_RTC time(RTC_DS3231);

#define DHT_PIN 2 // порт подключения датчика DHT11
#define LED_PIN 9  // порт подключения адресной ленты
#define WIDTH 31  // ширина матрицы в пикселях
#define ROWS 7      // количество строк в матрице

#define PHOT_PIN 6          // Пин фоторезистора
boolean adapt_light = 1;       // адаптивная подсветка (1 - включить, 0 - выключить)
unsigned long last_bright;    // время адаптивной подсветки
int max_bright = 100;          // максимальная яркость (0 - 255)
int min_bright = 100;          // минимальная яркость (0 - 255)
int new_bright;               // новая яркость

boolean humidity = true;          // выводить влажность воздуха - true/false
unsigned int timer = 50;             // скорость бегущей строки
unsigned int pausa1 = 10000;   // на сколько мсек остановится время на табло
unsigned int pausa2 = 1000;     // на сколько мсек остановится температура и влажность
unsigned int brightness = 200;  // яркость матрицы с адресной лентой

// настройки матрицы (если текст выводится некорректно, следует их изменить)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, ROWS, 1, 1, LED_PIN,
                            NEO_MATRIX_LEFT     + NEO_MATRIX_BOTTOM +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

DHT dht(DHT_PIN, DHT22); // создаем объект для датчика температуры
byte w, t, h;
int x = WIDTH;

void setup() {
  dht.begin();              // запускаем датчик давления
  Serial.begin(9600); // запускаем монитор порта

  matrix.begin();
  matrix.fillScreen(0);
  // установка цветовой палитры адресной ленты (RGB)
  matrix.setTextColor(matrix.Color(0, 0, 255));
  matrix.setTextWrap(false);
  matrix.setBrightness((brightness);

  time.begin();
  // после установки времени и загрузки скетча в плату Ардуино
  // закомментируйте следующую строчку и снова загрузите скетч в плату
  //time.settime(0, 35, 17, 12, 14, 21, 2); // сек,  мин,  час, число, месяц, год, день недели
}

void loop() {
    if (adapt_light) {                        // если включена адаптивная яркость
    if (millis() - last_bright > 500) {     // каждые полсекунды
      last_bright = millis();               // сброить таймер
      new_bright = map(analogRead(PHOT_PIN), 1, 1000, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      matrix.setBrightness(new_bright);        // установить новую яркость
    }
  }
  // выводим на монитор порта: температуру, влажность и время
  t = dht.readTemperature();
  h = dht.readHumidity();
  Serial.print(t);
  Serial.println("°C");
  Serial.print(h);
  Serial.println("%");
  Serial.println(time.gettime("H:i"));
 
  // два варианта вывода информации на табло (ненужный можно удалить)
  variant1(); // первый вариант с бегущей строкой
  //variant2(); // второй вариант с плавным затуханием
}

void variant1() {
  //matrix.setBrightness((brightness);
  matrix.fillScreen(0);
  w = 1;

  // == выводим время (часы и минуты) на светодиодное табло == //
  while (w == 1) {


    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(0, 0, 255));
    matrix.setCursor(x, 0);
    matrix.print(time.gettime("H:i"));
    matrix.show();
    delay(timer);
    x--;
    // когда текст оказывается посередине табло - делаем паузу
    if (x == -1) {
      delay(pausa1);
    }
    if (x < - WIDTH) {
      x = WIDTH;
      w = 2;
    }
  }

  // == выводим температуру воздуха на светодиодное табло == //
  while (w == 2) {
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(t);
    matrix.setTextColor(matrix.Color(0, 255, 0));
    matrix.print("'C");
    matrix.show();
    delay(timer);
    x--;
    // когда текст оказывается посередине табло - делаем паузу
    if (x == 3) {
      delay(pausa2);
    }
    if (x < - WIDTH && humidity == true) {
      x = WIDTH;
      w = 3;
    }
    if (x < - WIDTH && humidity == false) {
      x = WIDTH;
      w = 0;
    }
  }

  // == выводим влажность воздуха на светодиодное табло == //
  while (w == 3) {
    matrix.fillScreen(0);
    matrix.setTextColor(matrix.Color(255, 0, 0));
    matrix.setCursor(x, 0);
    matrix.print(h);
    matrix.print("%");
    matrix.show();
    delay(timer);
    x--;
    // когда текст оказывается посередине табло - делаем паузу
    if (x == 6) {
      delay(pausa2);
    }
    if (x < - WIDTH) {
      x = WIDTH;
      w = 0;
    }
  }

}

void variant2() {
  matrix.setBrightness(0);
  matrix.fillScreen(0);
  w = 1;

  // == плавное появление/исчезновение времени на табло == //
  while (w == 1) {
    for (byte i = 0; i < brightness; i++) {
      matrix.setBrightness(i);
      matrix.setCursor(0, 0);
      matrix.print(time.gettime("H:i"));
      matrix.show();
      delay(timer / 10);
    }
    delay(pausa1); // пауза перед затуханием надписи
    for (byte i = brightness; i > 0; i--) {
      matrix.setBrightness(i);
      matrix.setCursor(0, 0);
      matrix.print(time.gettime("H:i"));
      matrix.show();
      delay(timer / 10);
    }
    matrix.setBrightness(analogRead(0);
                         delay(timer * 10);
                         w = 2;
  }

  // == плавное появление/исчезновение температуры воздуха == //
  while (w == 2) {
    for (byte i = 0; i < brightness; i++) {
      matrix.setBrightness(i);
      matrix.setCursor(4, 0);
      matrix.print(t);
      matrix.print("'C");
      matrix.show();
      delay(timer / 10);
    }
    delay(pausa2); // пауза перед затуханием надписи
    for (byte i = brightness; i > 0; i--) {
      matrix.setBrightness(i);
      matrix.setCursor(4, 0);
      matrix.print(t);
      matrix.print("'C");
      matrix.show();
      delay(timer / 10);
    }
    matrix.setBrightness(analogRead(0);
                         delay(timer * 2);
    if (humidity == true) {
    w = 3;
  }
  if (humidity == false) {
    w = 0;
  }
}

// == плавное появление/исчезновение влажности воздуха == //
while (w == 3) {
    for (byte i = 0; i < brightness; i++) {
      matrix.setBrightness(i);
      matrix.setCursor(6, 0);
      matrix.print(h);
      matrix.print("%");
      matrix.show();
      delay(timer / 10);
    }
    delay(pausa2); // пауза перед затуханием надписи
    for (byte i = brightness; i > 0; i--) {
      matrix.setBrightness(i);
      matrix.setCursor(6, 0);
      matrix.print(h);
      matrix.print("%");
      matrix.show();
      delay(timer / 10);
    }
    matrix.setBrightness(0);
    delay(timer * 10);
    w = 0;
  }

}