Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

77 проектов Arduino

.pdf
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
49.45 Mб
Скачать

Эксперимент 43.

Часы на 4-х разрядной светодиодной матрице

В этом эксперименте рассмотрим использование экрана 4-х разрядной светодиодной матрицы в качестве часов

В эксперименте мы будем использовать следующие компоненты:

Плата Arduino UNO – 1;

Кабель USB – 1;

Плата прототипирования – 1;

Модуль DS3231 – 1;

4-х разрадная светодиодная матрица – 1;

Провода MF – 5.

Провода MM – 7

Переключатели на плате Arduino+WiFi установите следующим образом:

1

2

3

4

5

6

7

 

 

 

 

 

 

 

OFF

OFF

ON

ON

OFF

OFF

OFF

 

 

 

 

 

 

 

В эксперименте 42 мы научились использовать модуль DS3231 для получения реального времени. В этом эксперименте создадим часы с использовангием модуля DS3231, используя в качестве экрана 4-х разрядную светодиодную матрицу.

Схема подключения показана на рис. 43.1.

Приступим к написанию скетча. Необходимо получить данные о времени (часы, минуты) с модуля DS3231, и вывести 4 цифры на матрицы, кроме того необходимо организовать разделитель часов и минут – мигание точек между показаниями с частотой 1 секунда. Содержимое скетча показано в листинге 43.1.

Листинг 43.1.

// подключение библиотек

#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <Wire.h> #include <DS1307RTC.h> #include <Time.h> #include <TimeLib.h>

202 Эксперимент 43

Рис.43.1.Схема соединений для часов на DS3231 и 4-х разрядной светодиодной матрице

// пин CS

int pinCS = 9;

//количество матриц по-горизонтали int numberOfHorizontal = 4;

//количество матриц по-вертикали int numberOfVertical = 1;

//создание объекта

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontal, numberOfVertical);

//текст для вывода ошибки

String texterror = "ERROR"; unsigned long millist=0;

//переменная времени tmElements_t datetime;

//показ разделителя boolean blinkview=true;

void setup() {

// яркость от 0 до 15 matrix.setIntensity(7);

}

Эксперимент 43

203

void loop() {

// прошло 500 мсек? if(millis()-millist>=500) {

millist=millis();

// получение данных из ds3231 if (RTC.read(datetime)) {

matrix.setRotation( 0, 1 );

matrix.drawChar(1, 0, datetime.Hour/10+0x30, HIGH, LOW, 1); matrix.setRotation( 1, 1 );

matrix.drawChar(9, 0, datetime.Hour%10+0x30, HIGH, LOW, 1); matrix.setRotation( 2, 1 );

matrix.drawChar(17, 0, datetime.Minute/10+0x30, HIGH, LOW, 1); matrix.setRotation( 3, 1 );

matrix.drawChar(25, 0, datetime.Minute/10+0x30, HIGH, LOW, 1); matrix.write();

// разделитель matrix.drawPixel(15, 2, blinkview); matrix.drawPixel(15, 5, blinkview); blinkview=!blinkview;

}

else {

for ( int i = 0 ; i < texterror.length(); i++ ) { matrix.setRotation( i, 1 );

matrix.drawChar(i*6, 0, texterror[i], HIGH, LOW, 1);

}

matrix.write();

}

}

}

Скачать данный скетч можно на сайте Arduino-kit по ссылке https://arduino-kit.ru/scetches/exp_43_01.zip.

Загружаем скетч на плату Arduino и получаем часы на светодиодной матрице (рис. 42.2).

Эксперимент 44.

Часы с бегущей строкой на 4-х разрядной светодиодной матрице

В этом эксперименте добавим функционал для часов на модуле DS3231 и 4-х разрядной светодиодной матрице.

В эксперименте мы будем использовать компоненты из эксперимента 43. Схема соединений согласно рис. 43.1.

Переключатели на плате Arduino+WiFi установите следующим образом:

1

2

3

4

5

6

7

 

 

 

 

 

 

 

OFF

OFF

ON

ON

OFF

OFF

OFF

 

 

 

 

 

 

 

В эксперименте 43 мы создали часы на модуле DS3231, используя в качестве экрана 4-х разрядную светодиодную матрицу. В этом эксперименте добавим функционал часам, организуем вывод на экран:

даты (день-месяц);

года;

дня недели.

Смена экранов будем производить "бегущей строкой". Приступим к написанию скетча. Создадим две функции:

viewData() – вывод данных;

viewrunningData() – вывод данных бегущей строки

//вывод неподвижного текста

void viewData(String txt,int m[8],boolean f) { Serial.println(txt);

// вывод текста

for ( int i = 0 ; i < txt.length(); i++ ) { matrix.setRotation( i, 1 ); matrix.drawChar(i*8+2, 0, txt[i], HIGH, LOW, 1);

}

// вывод разделителя for(int i=0;i<8;i++) {

matrix.drawPixel(16, i, m[i]&f);

}

matrix.write();

Эксперимент 44

205

}

// вывод бегущей строки

void viewrunningData(String txt,int speedstr) { int offset=0;

Serial.println(txt); // 48 шагов

for(int offset=0;offset<48;offset++) { matrix.fillScreen(LOW);

// вывод строки с позиции offset

for ( int i = 0 ; i < txt.length(); i++ ) { matrix.setRotation( i, 1 ); matrix.drawChar(i*8-offset+1, 0, txt[i], HIGH, LOW, 1);

}

matrix.write();

delay(speedstr);

}

}

Данные для экрана и бегущей строки формируются в зависимости от значения переменной pos (0-7), согласно таблице

pos

Данные для экрана

0"hh:ss"

1Бегущая строка "hh:ss dd/mm"

2"dd:mm"

3Бегущая строка "dd:mm YYYY"

4"YYYY"

5Бегущая строка "YYYY Wday"

6"Wday"

7Бегущая строка "Wday dd/mm"

Содержимое скетча показано в листинге 44.1.

Листинг 44.1.

//подключение библиотек

#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <Wire.h> #include <DS1307RTC.h> #include <Time.h> #include <TimeLib.h>

//пин CS

206 Эксперимент 13

int pinCS = 9;

//количество матриц по-горизонтали int numberOfHorizontal = 15;

//количество матриц по-вертикали int numberOfVertical = 1;

//создание объекта

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontal, numberOfVertical);

//текст для вывода ошибки

String text =""; unsigned long millist=0;

//переменная времени tmElements_t datetime;

//показ разделителя boolean blinkview=true;

//текущий режим

//0 - hh:ss

//1 - hh:ss --> dd/mm

//2 - dd:mm

//3 - dd:mm --> YYYY

//4 - YYYY

//5 - YYYY --> Wday

//6 - Wday

//7 - Wday --> dd/mm

int pos=0;

//для отсчета времени unsigned long millispos=0;

String weekdays[]={

{"Sun "},{"Mon "},{"Tue "},{"Wed "}, {"Thu "},{"Fri "},{"Sat "}

};

//разделители

int bl0[]={0,0,1,0,0,1,0,0}; int bl1[]={0,0,1,1,1,0,0,0};

void setup() {

Serial.begin(9600); // яркость от 0 до 15

matrix.setIntensity(7);

}

void loop() {

Эксперимент 13

207

switch(pos) { case 0:

millispos=millis(); while(millis()-millispos<4000) {

if(millis()-millist>=500) { millist=millis();

RTC.read(datetime);

text="";

text+=char(datetime.Hour/10+0x30);

text+=char(datetime.Hour%10+0x30);

text+=char(datetime.Minute/10+0x30);

text+=char(datetime.Minute%10+0x30);

viewData(text,bl0,blinkview);

blinkview=!blinkview;

}

}

pos=1;

Serial.println("pos=1");

break; case 1:

RTC.read(datetime);

text="";

text+=char(datetime.Hour/10+0x30);

text+=char(datetime.Hour%10+0x30);

text+=char(datetime.Minute/10+0x30);

text+=char(datetime.Minute%10+0x30); text+=" "; text+=char(datetime.Day/10+0x30); text+=char(datetime.Day%10+0x30); text+=char(datetime.Month/10+0x30); text+=char(datetime.Month%10+0x30); viewrunningData(text,20);

pos=2;

Serial.println("pos=2");

break; case 2:

millispos=millis(); while(millis()-millispos<3000) {

if(millis()-millist>=500) { millist=millis();

RTC.read(datetime);

text="";

text+=char(datetime.Day/10+0x30);

text+=char(datetime.Day%10+0x30);

208 Эксперимент 13

text+=char(datetime.Month/10+0x30);

text+=char(datetime.Month%10+0x30);

viewData(text,bl1,1);

}

}

pos=3;

Serial.println("pos=3");

break; case 3:

RTC.read(datetime);

text="";

text+=char(datetime.Day/10+0x30);

text+=char(datetime.Day%10+0x30);

text+=char(datetime.Month/10+0x30);

text+=char(datetime.Month%10+0x30); text+=" ";

text+=String(tmYearToCalendar(datetime.Year));

viewrunningData(text,20);

pos=4;

Serial.println("pos=4");

break; case 4:

millispos=millis(); while(millis()-millispos<3000) {

if(millis()-millist>=500) { millist=millis();

RTC.read(datetime);

text=String(tmYearToCalendar(datetime.Year));

viewData(text,bl1,0);

}

}

pos=5;

Serial.println("pos=5");

break; case 5:

RTC.read(datetime);

text="";

text+=String(tmYearToCalendar(datetime.Year)); text+=" ";

text+=weekdays[datetime.Wday-1]; viewrunningData(text,20); pos=6;

Serial.println("pos=6");

break;

Эксперимент 13

209

case 6:

millispos=millis(); while(millis()-millispos<3000) {

if(millis()-millist>=500) { millist=millis();

RTC.read(datetime);

Serial.println(datetime.Wday);

Serial.println(weekdays[datetime.Wday]); text=weekdays[datetime.Wday-1]; viewData(text,bl1,0);

}

}

pos=7;

Serial.println("pos=7");

break; case 7:

RTC.read(datetime);

text=""; text+=weekdays[datetime.Wday-1]; text+=" "; text+=char(datetime.Hour/10+0x30); text+=char(datetime.Hour%10+0x30); text+=char(datetime.Minute/10+0x30); text+=char(datetime.Minute%10+0x30); viewrunningData(text,20);

pos=0;

Serial.println("pos=0");

break;

default:

break;

}

}

Скачать данный скетч можно на сайте Arduino-kit по ссылке https://arduino-kit.ru/scetches/exp_44_01.zip.

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

Эксперимент 45.

Часы на ЖК-дисплее LCD Keypad shield

В этом эксперименте создадим часы на модуле DS3231 с экраном на ЖК-дисплее

В эксперименте мы будем использовать следующие компоненты:

Плата Arduino UNO – 1;

Кабель USB – 1;

Плата прототипирования – 1;

Модуль DS3231 – 1;

LCD Keypad shield – 1;

Провода MM – 12.

Переключатели на плате Arduino+WiFi установите следующим образом:

1

2

3

4

5

6

7

 

 

 

 

 

 

 

OFF

OFF

ON

ON

OFF

OFF

OFF

 

 

 

 

 

 

 

В этом эксперименте создадим часы на модуле DS3231, используя в качестве экрана ЖК-дисплей LCD Keypad shield.

Схема подключения показана на рис. 45.1.

Приступим к написанию скетча. На первой строке ЖК-дисплея будем показывать текущее время в формате "HH-mm-ss". На второй строке ЖК-дисплея будем поочередно с периодичностью 5 секунд показывать либо текущую дату в формате "dd-mm-YYYY", либо день недели. Для программирования будем использовать библиотеки DS1307, Time, которые мы уже загрузили в эксперименте 42, и стандартную библиотеку LiquidCrystal. Оставляем возможность корректировки данных DS3231 по последовательному порту. Содержимое скетча показано в листинге 45.1.

Листинг 45.1.

//подключение библиотек

#include <Wire.h> #include <DS1307RTC.h> #include <Time.h> #include <TimeLib.h> #include <LiquidCrystal.h>

//создание экземпляра дисплея