Uno + DS3231 + DHT11 + 1602-I2C + 4-bit digital tube module 74hc595

viktorflam
Offline
Зарегистрирован: 09.09.2016

Добрый вечер господа и дамы!

Живем в семье с женой, 1,5 годовалям сыном и 2х месячным сыном. Погода в последнее время крайне не постоянная. Жена попросила "спаять" ей что-то типа термометра рядом с детской кроваткой со встроенными часиками. Не долга думая начал "паять" как говориться, из того, что было. А было у меня много чего, но выбрал я arduino UNO r3 добавил к ней DHT11 и LCD1602 через I2C. Термометр не самый точный, но если холодает в квартире, то видим и включаем обогреватель. Недавно моей жене захотелось, что бы помимо термометра еще отображались часики, и я нашел парочку примеров подобных решений и прикрутил к термометру дату и время, как раз в дисплей все удачно вписалось. Через пару деньков супруга моя изьявила еще одно желание - сделать часики по крупнее, а то ночью плоховато видно, и я достал из шляпы 4-bit digital tube module 74hc595 дисплей и начал его "припаивать". Тут то у меня и закончились все навыки и умения,  и с примерами подобных решений как-то не очень в интернете дела обстоят. Все дело в том, что часики на LCD1602 показывают время с :, например: 23:01:57, а дисплей всего четырех символьный. Помогите господа прикрутить дисплейчик к термометру, жена очень просит, я отказать не могу, и сам доделать до конца не могу, а жену не охото огорчать)))

Скеч мой ниже:

#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <EEPROM.h>
#include <DHT.h>

#define DHTPIN A0 // к какому пину будет подключен сигнальный выход датчика

//выбор используемого датчика
#define DHTTYPE DHT11 // DHT 11 используем в данный момент
//#define DHTTYPE DHT22 // DHT 22 (AM2302) не используем
//#define DHTTYPE DHT21 // DHT 21 (AM2301) не используем

//-----------дисплей-----------
#include <TM74HC595Display.h>
int SCLK = 7;
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];
//--------дисплей-------

//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
LiquidCrystal_I2C lcd(0x27, 16, 2);

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;
char compileDate[] = __DATE__;

DS3231 Clock(SDA, SCL);
Time RTC_Time;

void setup()
{
  Serial.begin(115200);
  Clock.begin();

  // initialize the LCD
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  dht.begin();
  lcd.createChar(1, degree); // Создаем символ под номером 1

  //Получаем число из строки, зная номер первого символа
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
  if (EEPROMReadInt(0) != hash) {
    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);
    // Записываем время в часы
    Clock.adjust(compileDate, compileTime);
  }

  //для дисплея цифры
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9

}

void loop()
{
  //Для запроса времени в структуру "Time"
  RTC_Time = Clock.getTime();

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit
  float f = dht.readTemperature(true);
  // Выводим показания влажности и температуры

  //Вывод дня недели: Пока их не вывдим, дисплей не позволяет
  //Serial.print(Clock.getDOWStr());
  //Serial.print(" ");

  lcd.setCursor(0, 0);
  lcd.print(Clock.getDateStr());
  lcd.setCursor(11, 0);
  lcd.print("%");
  lcd.setCursor(12, 0); // Устанавливаем курсор на 7 символ
  lcd.print(h, 1); // Выводим на экран значение влажности
  lcd.setCursor(0, 1);
  lcd.print(Clock.getTimeStr());
  lcd.setCursor(11, 1);
  lcd.print("\1C");
  lcd.setCursor(12, 1); // Устанавливаем курсор на 7 символ
  lcd.print(t, 1); // Выводим значение температуры

  //disp.digit4(Clock.getTimeStr(),50);  //вывод на дисплей 4Bit

  delay(1000);
}

char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - '0') * 10 + int(string[startIndex + 1]) - '0';
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}
//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);
  return (highByte << 8) | lowByte;
}

 

viktorflam
Offline
Зарегистрирован: 09.09.2016

Друзья, я много не прошу, мне бы только помочь разобраться как из этого

//Получаем число из строки, зная номер первого символа
byte hour = getInt(compileTime, 0);
byte minute = getInt(compileTime, 3);
byte second = getInt(compileTime, 6);
unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
if (EEPROMReadInt(0) != hash) {
//Сохраняем новый хэш
EEPROMWriteInt(0, hash);
// Записываем время в часы
Clock.adjust(compileDate, compileTime);

сделать переменную и из 4х символов и записать ее, а после вывести в 

//disp.digit4(Clock.getTimeStr(),50);  //вывод на дисплей 4Bit

только вместо Clock.getTimeStr  будет новая переменая, которая будет выводиться на дисплей

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

Вообще-то приведенный фрагмент связан с коррекцией частв и никакого отношения к индикации не имеет.

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

viktorflam
Offline
Зарегистрирован: 09.09.2016

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

или может можно прменить какое-то другое решение?

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

Спасибо за книжку, конечно, но наличие 2х деток напрочь исключают возможность изучения языка, любого языка, кроме русского, со старши сыном... но, к сожалению, не русском языке нельзя программировать ардуину, а к великому счастью можно на нем программировать сына))) но сын не может отображать точное время на дисплее 4-bit digital tube module 74hc595.

Короче, у кого нибуть есть живые примеры или хоть что-то из чего можно взять полезную инормацию, кроме книг, конечно, на 800 страниц.

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

viktorflam пишет:

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

Отнюдь.

Программировать можно (и нужно!) именно на русском языке. А потом просто переводить алгоритм на Си для заливки в Ардуину.

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

Цитата:

Короче, у кого нибуть есть живые примеры или хоть что-то из чего можно взять полезную инормацию, кроме книг, конечно, на 800 страниц.

Тут можно только повторить истину про "отсутствие царского пути".

 

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

viktorflam
Offline
Зарегистрирован: 09.09.2016

когда-нибудь обязательно займусь изучением...

На данный момент идет сессия - не до этого.