77 проектов Arduino
.pdf
Эксперимент 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>
//создание экземпляра дисплея
