Учебник по дисциплине "Обучение пользователей информационных систем"

Лабораторная работа №1 - загрузка Arduino IDE

1. Зайдите на официальный сайт Arduino и выберите, из предложенного списка, операционную систему на которой работает Ваш компьютер. В данной статье мы рассмотрим установку Arduino IDE на операционную систему Windows.

2. Выбрав первую строку «Windows Installer» Вы установите Arduino IDE (как устанавливаете любые другие программы), а выбрав третью строку «Windows ZIP file for non admin install» Вы скачаете ZIP-архив с папкой программы, которую сможете запускать без установки (даже если у Вас нет прав администратора Вашего компьютера).

1

Рисунок 1. Загрузка

3. Далее нажмите JUST DOWNLOAD и ещё раз JUST DOWNLOAD

1

Рисунок 2. Загрузка 2

1

Рисунок 3. Загрузка 3

4. Если Вы просто хотите скачать программу, то нажмите на кнопку «JUST DOWNLOAD», если хотите скачать программу и поблагодарить разработчиков, способствуя дальнейшему развитию ПО, то нажмите на кнопку «CONTRIBUTE & DOWNLOAD».

5. Дождитесь завершения загрузки файла

1

Рисунок 4. Загрузка 4

6. Прямо из браузера или в папке загрузок запустите exe-файл

1

Рисунок 5. Открытие файла

7. Если Вы скачивали (загружали) ZIP-архив (выбрав на первом этапе пункт «Windows ZIP file for non admin install»), то распакуйте папку из архива в любое место на Вашем компьютере.

8. Следующий раздел «Установка Arduino IDE» не для Вас, так как устанавливать программу Вам не нужно, перейдите к разделу «Запуск Arduino IDE».

9. Для начала работы в Arduino IDE нужно запустить файл «arduino.exe», из того места, куда Вы распаковали архив.

10. Если Вы скачивали (загружали) установочный файл (выбрав на первом этапе пункт «Windows Installer»), то следуйте инструкциям в следующем разделе «Установка Arduino IDE».

Установка Arduino IDE:

11. В первом окне установщика будет предложено согласиться с Лицензионным соглашением. Нажмите "Принимаю", если Вы согласны, в противно случае придётся отказаться от использования программы...

1

Рисунок 6. Принятие соглашения

12. Далее будет предложено для кого установить приложение:

1

Рисунок 7. Установка

13. Укажите в какую папку Вы хотите установить:

1

Рисунок 8. Установка 2

14. Начнётся установка...

1

Рисунок 9. Установка 3

15. Во время установки может появиться вот такое окно, нажмите "Да":

1

Рисунок10. Разрешение

На этом установка Arduino IDE завершена.

1

Рисунок 11. Установка 4

16. На Вашем рабочем столе должна появиться иконка программы:

1

Рисунок 12. Запуск

Запуск Arduino IDE

17. После запуска приложения может появится вот такое сообщение mdns-discovery, нажмите "Разрешить"

1

Рисунок 13. Разрешение 2

18. И вот такое сообщение от брендмауера Windows, так же нажмите "Разрешить", в противном случае не будет работать установка библиотек и плат из репозиториев Arduino.

1

Ресунок 14. Разрешение

19. Далее, в зависимости от того устанавливали ли Вы ранее Arduino IDE или другие приложения работающие с COM-портами (например Cura), могут появляться окна Windows запрашивающие у Вас разрешение на установку драйверов:

1

Рисунок 15. Установка 4

20.Разрешайте установку драйверов нажимая на кнопку «Установить», эти драйверы позволят определять и работать с платами Arduino подключёнными по шине USB.

21.Теперь можно написать скетч (код) и загрузить (залить/прошить) его в Arduino. Но перед этим, надо подключить плату Arduino к компьютеру и указать программе Arduino IDE, какую именно плату Arduino Вы подключили, и к какому порту...

Подключение платы Arduino

22.После того как Вы подключите плату Arduino через USB порт к компьютеру, программе Arduino IDE нужно указать, какую именно плату Arduino Вы подключили. Для этого выберите нужную плату из списка в разделе меню « Инструменты > Плата > Arduino AVR Boards > Название Вашей платы », как это показано на следующем рисунке:

1

Рисунок 16. Выбор платы

23. Теперь нужно выбрать Com-порт к которому подключена Ваша плата Arduino. Для этого выберите нужный Com-порт из списка доступных Com-портов в разделе меню « Инструменты > Порт > Номер доступного порта », как это показано на следующем рисунке:

1

Рисунок 17. Выбор порта

Загрузка скетча из программы Arduino IDE в плату Arduino

24.После того, как Вы указали тип платы Arduino, выбрали Com-порт и написали свой скетч (код программы), скетч можно загрузить (залить/прошить) в контроллер платы Arduino. Для этого выберите пункт меню « Скетч > Загрузка » или нажмите на кнопку в виде круга со стрелкой:

1

Рисунок 18. Запуск скетча

25.Во время загрузки Вы увидите строку состояния которая будет отображать ход выполнения компиляции и загрузки скетча. Если в скетче нет ошибок и он успешно загружен, то в области уведомлений появится информация о количестве использованной и доступной памяти Arduino, а над областью уведомлений появится надпись «Загрузка завершена.».

1

Рисунок 19. Работа скетча

Лабораторная работа №2 - часы

Необходимые компоненты:

Arduino Uno х 1шт.

Trema Set Shield х 1шт.

Trema-модуль красная кнопка х 1шт.

Trema-модуль зеленая кнопка х 1шт.

Trema-модуль часы реального времени, RTC х 1шт.

Trema-модуль четырехразрядный LED индикатор х 1шт.

Для реализации проекта нам необходимо установить следующие библиотеки:

1. Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.

2. Библиотека iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.

Схема сборки:

3. Устанавливаем Trema Set Shield в Arduino Uno.

4. Устанавливаем Trema-модуль Четырехразрядный LED индикатор во 2 посадочную площадку.

1

Рисунок 20. Установка индикатора

5. Устанавливаем Trema-модуль часы реального времени, RTC в 3 посадочную площадку, в верхнюю I2C колодку.

1

Рисунок 21. Установка модуля часов

6. Устанавливаем Trema-модуль зеленую кнопку в 5 посадочные площадки.

1

Рисунок 22. Установка зеленой кнопки

7. Устанавливаем Trema-модуль красную кнопку в 6 посадочные площадки.

1

Рисунок 23. Установка красной кнопки

Полученные результат представлен ниже на рисунке.

1

Рисунок 24. Готовая сборка

8. Код программы:

#include // Подключаем библиотеку iarduino_4LED

iarduino_4LED dispLED(1, A0); // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ).

//

#include // Подключаем библиотеку.

iarduino_RTC time(RTC_DS3231); // Объявляем объект time для модуля на базе чипа DS3231.

//

const int pinKeyRed = A3; // Объявляем пин для работы с красной кнопкой.

const int pinKeyGreen = 11; // Объявляем пин для работы с зеленой кнопкой.

//

int m; // Переменная для минут.

int h; // Переменная для часов.

int i; // Переменная счета.

int k; // Переменная счета.

int menu; // Переменная события.

int minPrev; // Переменная предыдущего значения минут.

//

void ShowTime(); // Функция показа времени.

//

void setup() //

{ //

pinMode(pinKeyGreen, INPUT); // Переводим вывод pinKeyGreen в режим входа.

pinMode(pinKeyRed, INPUT); // Переводим вывод pinKeyRed в режим входа.

dispLED.begin(); // Инициируем LED дисплей.

time.begin(); // Инициируем RTC модуль.

menu = 1; // Задаем событие 1.

} //

//

void loop() //

{ //

time.gettime(); // Читаем время, обновляя значения всех переменных.

switch(menu) // Выбор события.

{ //

case 1: // Событие 1.

dispLED.light(7); // Устанавливаем максимальную яркость свечения LED индикатора.

if(digitalRead(pinKeyGreen) || digitalRead(pinKeyRed)) // Проверка нажатия зеленой кнопки или нажатия красной кнопки.

{ //

h = time.Hours; // Сохраняем текущее значение часов.

m = time.minutes; // Сохраняем текущее значение минут.

menu = 2; // Переходим к действию 2.

} //

//

if(fmod(time.seconds,2)) // Проверка значении на четность/нечетность с помощью функции остаток от деления. При делении на два, если остаток равен 1.

{ //

dispLED.point(0, false); // Выключаем двоеточие.

dispLED.point(2, true); // Включаем вторую точку.

} //

else // Если остаток от деления равен 0.

{ //

dispLED.print( time.Hours , time.minutes , TIME ); // Вывод времени.

} //

break; // Выходим из оператора case.

//

case 2: // Событие 2.

dispLED.light(1); // Устанавливаем небольшую яркость свечения LED индикатора

dispLED.point(2, true); // Включаем вторую точку.

if(digitalRead(pinKeyGreen) && digitalRead(!pinKeyRed)) // Проверка нажатия зеленой кнопки и не нажатия красной кнопки.

{ //

while(digitalRead(pinKeyGreen) && digitalRead(!pinKeyRed)) // Цикл слежения нажатой зеленой кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<150){i++;} else{delay(10);m++;ShowTime();} // Фиксируем, как долго удерживается кнопка pinKeyGreen, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.

} //

if(i<150){m++;ShowTime();} // Если кнопка pinKeyGreen удерживалась меньше 2 секунд, то увеличиваем минуты.

i = 0; // Обнуляем переменную счета.

} //

//

if(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen)) // Проверка нажатия красной кнопки и не нажатия зеленой кнопки.

{ //

while(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen)) // Цикл слежения нажатой зеленой кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<150){i++;} else{delay(10);m--;ShowTime();} // Фиксируем, как долго удерживается кнопка pinKeyRed, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.

} //

if(i<150) {m--;ShowTime();} // Если кнопка pinKeyRed удерживалась меньше 2 секунд, то увеличиваем минуты.

i = 0; // Обнуляем переменную счета.

} //

//

if (m == minPrev){k++;} // Если предыдущее и нынешнее значение минут одинаково, то увеличиваем переменную счета.

else {k = 0;} // Иначе, обнуляем переменную счета.

if (k >= 150) {menu = 1; k = 0;} // Если переменная счета больше 150, то задаем событие 1, обнуляем переменную счета.

minPrev = m; // Сохраняем нынешнее значение минут в переменную предыдущего значения минут.

break; // Выходим из оператора case.

} //

} //

//

void ShowTime() // Функция показа времени.

{ //

dispLED.point(2, true); // Включаем вторую точку.

if (m > 59){h++; if (h > 23){h = 00;} m = 00;} // Если значение минут больше 59, увеличиваем переменную час, если переменная часа больше 23, то обнуляем часы, обнуляем минуты.

if (m < 00){h--; if (h < 00){h = 23;} m = 59;} // Если значение минут меньше 00, уменьшаем переменную час, если переменная часа меньше 00, то присваиваем часам максимальное значение 59, присваиваем минутам максимальное значение 59.

time.settime(-1, m, h); //

dispLED.print( time.Hours , time.minutes , TIME ); // Вывод времени.

} //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

9. Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.

10. Объявляем объект dispLED, с указанием выводов дисплея.

11. Подключаем библиотеку iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.

12. Объявляем объект time для модуля на базе чипа DS3231.

13. Объявляем пины для работы с Trema-модуль красной кнопкой и Trema-модуль зеленой кнопкой.

14. Объявляем переменные и функции задействованные в скетче.

В коде setup выполняются следующие действия:

15. Переводим выводы pinKeyGreen для зеленой кнопки и pinKeyRed для красной кнопки в режим выхода.

16. Инициируем LED дисплей.

17. Инициируем RTC модуль.

Событие 1.

В коде loop выполняются следующие действия:

19. Читаем время, с модуля часов реального времени.

20. Устанавливаем максимальную яркость свечения индикатора.

21. Проверяем нажата зеленая или красная кнопка. Если одна из кнопок нажата, то сохраняем текущее значение времени в переменные времени и разрешаем переход к событию 2.

22. Каждую секунду включаем и выключаем вторую точку на индикаторе. Для этого проверяем четность/нечетность приходящих секунд с модуля реального времени. Если нечетное, включаем вторую точку на индикаторе и гасим двоеточие на индикаторе, если оно присутствует на индикаторе. Если четное, то выводим на индикатор текущее время.

Событие 2.

23. Уменьшаем яркость свечения индикатора.

24. Включаем вторую точку на индикаторе.

25. Проверяем нажата зеленая кнопка. Если нажата, то заходим в цикл нажатия зеленой кнопки. Там фиксируем, как долго удерживается зеленая кнопка: если дольше 2 секунд, то увеличиваем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, увеличение прекратится. Если же нажата один раз зеленая кнопка, то увеличение минут произойдет один раз. Обнуляем переменную счета.

26. Проверяем нажата красная кнопка. Если нажата, то заходим в цикл нажатия красной кнопки. Там фиксируем, как долго удерживается красная кнопка: если дольше 2 секунд, то уменьшаем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, уменьшение прекратится. Если же нажата один раз красная кнопка, то уменьшение минут произойдет один раз. Обнуляем переменную счета.

27. Проверяем совершалось изменение минут. Если предыдущее значение минут совпадает с нынешним значением минут, то увеличиваем переменную счета, иначе обнуляем переменную счета.

28. Если переменная счета больше 150, то разрешаем переход к событию 1. Обнуляем переменную счета.

29. Сохраняем нынешнее значение минут в переменную предыдущего значения минут.

Лабораторная работа №3 – климат-контроль

Необходимые компоненты:

Arduino Uno х 1шт.

Trema Set Shield х 1шт.

Trema-модуль силовой ключ х 1шт.

Trema-модуль потенциометр х 1шт.

Trema-модуль Четырехразрядный LED индикатор х 1шт.

Trema-модуль датчик температуры и влажности I2C х 1шт.

Для реализации проекта нам необходимо установить следующие библиотеки:

1. Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.

2. Библиотека iarduino_AM2320 для работы с Trema-модуль датчиком температуры и влажности I2C.

Схема сборки:

3. Устанавливаем Trema Set Shield в Arduino Uno.

4. Устанавливаем Trema-модуль Четырехразрядный LED индикатор в 2 посадочную площадку.

1

Рисунок 25. Установка индикатора 2

5. Устанавливаем Trema-модуль датчик температуры и влажности I2C в 3 посадочную площадку, в верхнюю I2C колодку.

1

Рисунок 26. Устанавливаем датчик

6. Устанавливаем Trema-модуль силовой ключ в 4 посадочную площадку.

1

Рисунок 27. Установка силового ключа

7. Устанавливаем Trema-модуль потенциометр в 6 посадочную площадку.

1

Рисунок 28. Установка потенцометра

8. Полученные результат представлен ниже на рисунке.

1

Рисунок 29. Готовая сборка 2

9. Подключить кулер к Источник питания на 12В, через Коннектор с помощью Проводков как показано на рисунке ниже.

1

Рисунок 30. Подключение контура

10. Код программы:

#include // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_4LED.

#include // Подключаем библиотеку iarduino_4LED

iarduino_4LED dispLED(1, A0); // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO )

//

#include // Подключаем библиотеку iarduino_AM2320.

iarduino_AM2320 SensTH; // Объявляем объект SensorTH для работы с датчиком AM2320, используя функции и методы библиотеки iarduino_AM2320.

//

int menu; // Переменная выбора события.

int pinPot = A3; // Объявляем пин для работы с потенциометром.

int pinPowerKey = 2; // Объявляем пин для работы с силовым ключом.

//

float ptVol; // Переменная для чтения показаний с потенциометра.

float potVoluePrev; // Переменная для предыдущих показаний с потенциометра.

int i; // Переменная счета.

int led; // Переменная выбора горящей точки.

//

bool counter = false; // Переменная события, разрешает/запрещает событие каждые полсекунды.

long prevmicros; // Переменная для хранения значений таймера.

//

void setup() //

{ //

pinMode(pinPowerKey, OUTPUT); // Переводим вывод pinPowerKey в режим выхода.

//

dispLED.begin(); // Инициируем LED дисплей.

SensTH.begin(); // Инициируем работу с датчиком AM2320.

//

menu = 1; // Событие 1.

ptVol = map(analogRead(pinPot), 5, 1018, 16, 32); // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.

potVoluePrev = ptVol; // Сохраняем показания потенциометра в предыдущей переменной.

} //

//

void loop() //

{ //

switch(menu) // Выбираем событие.

{ //

case 1: // Событие 1.

if (micros() - prevmicros > 500000) // Если прошло пол секунды.

{ //

prevmicros = micros(); // Сохраняем нынешнее значение счетчика Arduino.

counter = !counter; // Изменяем переменную событию на противоположную переменную.

if (!counter) // Если переменная события false.

{ //

switch(SensTH.read()) // Читаем показания датчика температуры.

{ //

case AM2320_OK: // Ответ с полученными данными.

dispLED.light(7); // Устанавливаем максимальную яркость свечения LED индикатора.

dispLED.print(SensTH.tem, TEMP); // Выводим значение температуры на дисплей.

//

if(SensTH.tem - ptVol >= 1 && SensTH.tem - ptVol <= 2)// Если разница температур на потенциометре и датчике температуры больше 1, но меньше 2.

{led = 4; analogWrite(pinPowerKey, 63);} // Выбираем 4 точку на индикаторе, подаем 25% напряжение на силовой ключ.

//

if(SensTH.tem - ptVol >= 2 && SensTH.tem - ptVol <= 4)// Если разница температур на потенциометре и датчике температуры больше 2, но меньше 4.

{led = 3; analogWrite(pinPowerKey, 127);} // Выбираем 3 точку на индикаторе, подаем 50% напряжение на силовой ключ.

//

if(SensTH.tem - ptVol >= 4 && SensTH.tem - ptVol <= 8)// Если разница температур на потенциометре и датчике температуры больше 4, но меньше 8.

{led = 2; analogWrite(pinPowerKey, 191);} // Выбираем 2 точку на индикаторе, подаем 75% напряжение на силовой ключ.

//

if(SensTH.tem - ptVol >= 8) // Если разница температур на потенциометре и датчике температуры больше 8.

{led = 1; analogWrite(pinPowerKey, 255);} // Выбираем 1 точку на индикаторе, подаем 100% напряжение на силовой ключ.

//

if(SensTH.tem - ptVol <= 1) // Если разница температур на потенциометре и датчике температуры меньше 1.

{led = 0; analogWrite(pinPowerKey, 0);} // Выбираем 0 точку на индикаторе, подаем 0% напряжение на силовой ключ.

break; // Выходим из оператора case.

} //

} //

if (counter) {dispLED.point(led, true); } // Включаем заданную точку на индикаторе.

if (!counter){dispLED.point(led, false);} // Выключаем заданную точку на индикаторе.

} //

ptVol = map(analogRead(pinPot), 5, 1018, 16, 32); // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.

if(ptVol != potVoluePrev){menu = 2;} // Если показания потенциометра не совпадают с предыдущими показаниями, то переходим к событию 2.

break; // Выходим из оператора case.

//

case 2: // Событие 2.

dispLED.point(1, false); // Выключаем 1 точку на индикаторе.

dispLED.point(3, false); // Выключаем 3 точку на индикаторе.

dispLED.point(4, false); // Выключаем 4 точку на индикаторе.

//

ptVol = map(analogRead(pinPot), 5, 1018, 16, 32); // Читаем показания с потенциометра и масштабируем значения в диапазон от 16 до 32.

if (ptVol - potVoluePrev < 60) {i++;} // Если разность показания потенциометра и предыдущих показаний потенциометра меньше 60, то увеличиваем переменную счета.

if (ptVol != potVoluePrev) // Если показания потенциометра не совпадают с предыдущими показаниями.

{ //

i = 0; // Обнуляем переменную счета.

dispLED.light(2); // Устанавливаем уровень яркости свечения LED индикатора.

dispLED.print(ptVol, TEMP); // Выводим показания потенциометра в виде температуры.

potVoluePrev = ptVol; // Сохраняем показания потенциометра в предыдущей переменной.

} //

if (i >= 100) {menu = 1; i = 0; led = 0;} // Если переменная счета больше 100, переходим к событию 1, обнуляем переменную счета, выбираем 0 точку на индикаторе.

break; // Выходим из оператора case.

} //

} //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

11. Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.

12. Объявляем объект dispLED, с указанием выводов дисплея.

13. Библиотека iarduino_AM2320 для работы с Trema-модуль датчиком температуры и влажности I2C.

14. Объявляем объект SensorTH для работы с датчиком температуры.

15. Объявляем пины для работы с Trema-модуль потенциометр, Trema-модуль силовой ключ.

16. Объявляем переменные участвующие в работе скетча.

В коде setup выполняются следующие действия:

17. Переводим вывод для силового ключа в режим выхода.

18. Инициируем LED дисплей.

19. Инициируем работу с датчиком температуры.

20. Считываем показания потенциометра, сохраняя показания в предыдущую и нынешнюю переменную потенциометра.

Событие 1.

В коде loop выполняются следующие действия:

21. Выбор события.

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

23. Выводим значение температуры на дисплей. Устанавливаем максимальную яркость свечения LED индикатора.

24. Зажигаем точку в соответствии со скоростью вращения вентилятора.

25. Считываем показания потенциометра, если показания изменились переходим к событию 2.

Событие 2.

26. В нем гасим все точки, кроме второй. Читаем показания потенциометра.

27. Если разница показания потенциометра и предыдущих показаний потенциометра меньше 60, то увеличиваем переменную счета.

28. Если показания потенциометра не совпадают с предыдущими показаниями, обнуляем переменную счета, устанавливаем небольшой уровень яркости свечения LED индикатора.

29. Выводим показания потенциометра в виде температуры. Сохраняем показания потенциометра в предыдущей переменной.

30. Если переменная счета больше 100, переходим к событию 1, обнуляем переменную счета, выбираем 0 точку на индикаторе.

Лабораторная работа №4 – кодовый замок

Необходимые компоненты:

Arduino Uno х 1шт.

Trema Set Shield х 1шт.

Trema-модуль потенциометр х 2шт.

Trema-модуль кнопка со светодиодом, синяя х 1шт.

Штыревой соединитель х 1шт.

Сервопривод х 1шт.

Для реализации проекта нам необходимо установить следующие библиотеки:

1. Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.

2. Библиотека Servo для работы с сервоприводами (библиотека входит в стандартный набор Arduino IDE).

Схема сборки:

3. Устанавливаем Trema Set Shield в Arduino Uno.

4. Устанавливаем Trema-модуль Четырехразрядный LED индикатор в 4 посадочную площадку.

1

Рисунок 31. Установка индикатора 3

5. Устанавливаем Trema-модуль кнопка с синем светодиодом в 1 посадочную площадку.

1

Рисунок 32. Установка синей кнопки

6. Устанавливаем Trema-модуль потенциометр в 6 посадочную площадку.

1

Рисунок 33. Установка потенцометра 2

7. Устанавливаем Trema-модуль потенциометр во 2 посадочную площадку.

1

Рисунок 34. Установка потенцометра 3

8. Устанавливаем Сервопривод в 6 посадочную площадку, воспользуясь Штыревым соединителем.

1

Рисунок 35. Установка сервопривода

9. Полученный результат представлен на рисунке ниже.

1

Рисунок 36. Готовая сборка 3

10. Код программы:

#include // Подключаем библиотеку Servo.

Servo servo; // Объявляем объект для работы с сервоприводом.

//

#include // Подключаем библиотеку iarduino_4LED.

iarduino_4LED dispLED(A2, 2); // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ).

//

const uint8_t pinKeyPotLeft = A0; // Объявляем пин для работы с левым потенциометром.

const uint8_t pinKeyPotRight = A3; // Объявляем пин для работы с правым потенциометром.

//

const uint8_t pinKeyLedBlue = 10; // Объявляем пин для работы со светодиодом синей кнопки.

const uint8_t pinKeyBlue = 6; // Объявляем пин для работы с синей кнопкой.

const uint8_t pinServo = 11; // Определяем № вывода к которому подключён сервопривод.

//

const uint8_t dreb = 10; // Константа для подавления дребезга потенциометра.

//

int menu; // Переменная меню событий.

int Left; // Переменная значений левого потенциометра.

int Right; // Переменная значений правого потенциометра.

//

String LeftChar; // Переменная значений левого потенциометра в строковом формате.

String RightChar; // Переменная значений правого потенциометра в строковом формате.

String times; // Переменная значений потенциометров для вывода на индикатор.

//

uint8_t codeLeft; // Переменная для хранения кода с левого потенциометра.

uint8_t codeRight; // Переменная для хранения кода с правого потенциометра.

//

int prevLeft; // Переменная предыдущего значения левого потенциометра.

int prevRight; // Переменная предыдущего значения правого потенциометра.

//

int prevLeftDat; // Переменная предыдущего значения левого потенциометра без масштабирования.

int prevRightDat; // Переменная предыдущего значения правого потенциометра без масштабирования.

//

int i, k; // Переменные счета.

//

bool around = true; // Переменная события разрешает/запрещает изменение вывода значений потенциометров на индикаторе.

bool event = true; // Переменная события разрешает/запрещает нажатие кнопки.

long prevMicros; // Переменная предыдущих значений счетчика.

//

void ReadingValues(); // Функция чтения значения с потенциометров.

void ShowTime(); // Функция вывода значений на индикатор.

//

void setup() //

{ //

servo.attach(pinServo); // Присоединяем сервопривод к выводу pinServo.

pinMode(pinKeyBlue, INPUT); // Переводим вывод pinKeyBlue в режим входа.

pinMode(pinKeyLedBlue, INPUT); // Переводим вывод pinKeyLedBlue в режим входа.

dispLED.begin(); // Инициируем LED дисплей.

dispLED.light(7); // Устанавливаем максимальную яркость свечения LED индикатора.

menu = 1; // Задаем событие 1.

} //

//

void loop() //

{ //

switch(menu) // Переменная меню события.

{ //

case 1: // Событие 1.

ReadingValues(); // Функция чтения значения с потенциометров.

ShowTime(); // Функция вывода значений на индикатор.

if (digitalRead(pinKeyBlue) && event) // Если нажата кнопка и событие нажатие кнопки разрешено.

{ //

codeLeft = Left; // Сохраняем значения левого потенциометра.

codeRight = Right; // Сохраняем значения правого потенциометра.

menu = 2; // Разрешаем переход к событию 2.

around = !around; // Изменили событие.

} //

//

servo.write(90); // Устанавливаем сервопривод на 90 градусов.

digitalWrite(pinKeyLedBlue, HIGH); // Включаем светодиод на кнопке.

if (micros() - prevMicros > 1000000) {event = true;} // Если прошла секунда, разрешаем событие нажатие кнопки.

break; // Выходим из оператора case.

//

case 2: // Событие 2.

for (k = 0; k <= 3; k++) // В цикле осуществляем мигание.

{ //

dispLED.clear(); // Очищаем дисплей.

digitalWrite(pinKeyLedBlue, LOW); // Гасим светодиод на кнопке.

delay(500); // Задержка 500 мс.

//

ShowTime(); // Функция вывода значений на индикатор.

digitalWrite(pinKeyLedBlue, HIGH); // Зажигаем светодиод на кнопке.

delay(500); // Задержка 500 мс.

} //

digitalWrite(pinKeyLedBlue, LOW); // Гасим светодиод на кнопке.

servo.write(0); // Устанавливаем сервопривод на 0 градусов.

menu = 3; // Разрешаем переход к событию 3.

prevLeftDat = 0; // Обнуляем переменную значений с левого потенциометра без масштабирования.

prevRightDat = 0; // Обнуляем переменную значений с правого потенциометра без масштабирования.

break; // Выходим из оператора case.

//

case 3: // Событие 3.

ReadingValues(); // Функция чтения значения с потенциометров.

ShowTime(); // Функция вывода значений на индикатор.

if (Right == prevRight && Left == prevLeft){i++;} // Если предыдущее значение потенциометра равно новому, то увеличиваем переменную счета.

else{i = 0;} // Если не равно, обнуляем переменную счета.

prevLeft = Left; // Сохраняем новое значение левого потенциометра в предыдущую переменную.

prevRight = Right; // Сохраняем новое значение правого потенциометра в предыдущую переменную.

if (i > 500){menu = 4;} // Если переменная счета превысило значение 500, то разрешаем переход к событию 4.

//

if (digitalRead(pinKeyBlue)) // Если нажата синяя кнопка.

{ //

if (codeLeft == Left && codeRight == Right) // Сравниваем сохраненные значения коды и установленные заново. Если совпадают.

{ //

digitalWrite(pinKeyLedBlue, HIGH); // Зажигаем светодиод.

servo.write(90); // Устанавливаем сервопривод на 90 градусов.

menu = 1; // Разрешаем переход событию 1.

event = false; // Запрещаем событие нажатия кнопки.

prevMicros = micros(); // Сохраняем предыдущее значение таймера.

} //

else // Если не совпадают, то мигаем индикатором.

{ //

for (k = 0; k <= 3; k++) // В цикле осуществляем мигание.

{ //

dispLED.light(1); // Устанавливаем небольшую яркость свечения LED индикатора.

delay(500); // Задержка 500 мс.

dispLED.light(7); // Устанавливаем максимальную яркость свечения LED индикатора.

delay(500); // Задержка 500 мс.

} //

} //

} //

break; // Выходим из оператора case.

//

case 4: // Событие 4.

dispLED.clear(); // Очищаем индикатор.

i = 0; // Обнуляем переменную счета.

ReadingValues(); // Функция чтения значения с потенциометров.

if (Right != prevRight || Left != prevLeft){menu = 3;} // Если предыдущее значения потенциометров не равны новым, то разрешаем переход к событию 3.

prevLeft = Left; // Сохраняем новое значение левого потенциометра в предыдущую переменную.

prevRight = Right; // Сохраняем новое значение правого потенциометра в предыдущую переменную.

if (digitalRead(pinKeyBlue)){menu = 3;} // Если нажата кнопка, то разрешаем переход к Событию 3.

break; // Выходим из оператора case.

} //

} //

//

void ReadingValues() // Функция чтения значения с потенциометров.

{ //

if ( analogRead(pinKeyPotLeft) - prevLeftDat > dreb || // Если разность между новым значением левого потенциометра и предыдущим значением левого потенциометра больше переменной дребезга левого потенциометра.

analogRead(pinKeyPotLeft) - prevLeftDat < -dreb || // Если разность между новым значением левого потенциометра и предыдущим значением левого потенциометра меньше переменной дребезга левого потенциометра.

analogRead(pinKeyPotRight) - prevRightDat > dreb || // Если разность между новым значением правого потенциометра и предыдущим значением правого потенциометра больше переменной дребезга правого потенциометра.

analogRead(pinKeyPotRight) - prevRightDat < -dreb ) // Если разность между новым значением правого потенциометра и предыдущим значением правого потенциометра меньше переменной дребезга правого потенциометра.

{ //

prevLeftDat = analogRead(pinKeyPotLeft); // Сохраняем новое значение левого потенциометра в предыдущую переменную.

prevRightDat = analogRead(pinKeyPotRight); // Сохраняем новое значение правого потенциометра в предыдущую переменную.

if (around) // Если событие изменения вывода значений на индикатор разрешено.

{ //

Left = map(analogRead(pinKeyPotLeft), 0, 1015, 0, 99); // Считываем значения левого потенциометра, масштабируя в диапазон от 0 до 99.

Right = map(analogRead(pinKeyPotRight), 0, 1015, 0, 99); // Считываем значения правого потенциометра, масштабируя в диапазон от 0 до 99.

} //

else // Если событие изменения вывода значений на индикатор неразрешено.

{ //

Left = map(analogRead(pinKeyPotLeft), 0, 1015, 99, 0); // Считываем значения левого потенциометра, масштабируя в диапазон от 99 до 0.

Right = map(analogRead(pinKeyPotRight), 0, 1015, 99, 0); // Считываем значения правого потенциометра, масштабируя в диапазон от 99 до 0.

} //

} //

} //

//

void ShowTime() // Функция показа времени.

{ //

if (Left>=0 && Left<10) // Если количество времени у левого игрока от 0 до 9.

{LeftChar = (String) "0" + Left;} // Добавляем спереди ноль и переводим в строковое значение.

else{LeftChar = (String) Left;} // Иначе просто переводим количество времени в строковое значение.

//

if (Right>=0 && Right<10) // Если количество времени у правого игрока от 0 до 9.

{RightChar = (String) "0" + Right;} // Добавляем спереди ноль и переводим в строковое значение.

else{RightChar = (String) Right;} // Иначе просто переводим количество времени в строковое значение.

//

times = LeftChar + RightChar; // Присваиваем общей переменной количество времени левого и правого игрока.

dispLED.print(times); // Выводим значение на индикатор.

} //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

11. Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.

12. Объявляем объект dispLED, с указанием выводов дисплея.

13. Подключаем библиотеку Servo, для работы с Сервоприводом.

15. Объявляем объект servo.

16. Объявляем пины для работы с левым и правым Trema-модуль потенциометром, Сервоприводом, Trema-модуль кнопкой со светодиодом, синяя, а так же пины для работы с самими светодиодами.

17. Объявляем переменные и константы, которые задействованы в программе.

18. Объявляем функции.

В коде setup выполняются следующие действия:

19. Присоединяем сервопривод к выводу pinServo.

20. Переводим вывод pinKeyBlue, pinKeyLedBlue в режим входа.

21. Инициируем LED дисплей.

22. Устанавливаем максимальную яркость свечения LED индикатора.

23. Разрешаем переход к событию 1.

В коде loop выполняются следующие действия:

Событие 1.

24. Считываем значение с потенциометров с помощью функции "ReadingValues()".

25. Выводим значения потенциометров с помощью функции "ShowTime()".

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

27. Устанавливаем сервопривод на 180 градусов.

28. Включаем светодиод на кнопке.

29. Разрешаем событие нажатия кнопки, если прошла одна секунда с момента начала этого события.

Событие 2.

30. Осуществляем мигание с помощью цикла, в котором сначала очищаем дисплей, гасим светодиод и ждем 500 мс, затем выводим на дисплей значения потенциометров, зажигаем светодиод, ждем 500 мс и так три раза.

31. Гасим светодиод, устанавливаем на сервопривод 0 градусов, разрешаем переход к событию 3 и обнуляем переменные значений с левого и правого потенциометра без масштабирования.

Событие 3.

32. Считываем значение с потенциометров с помощью функции "ReadingValues()".

33. Выводим значения потенциометров с помощью функции "ShowTime()".

34. Если оба предыдущих значения потенциометра равно новому, то увеличиваем переменную счета. А если не равно, обнуляем переменную счета.

35. Сохраняем новые значения левого и правого потенциометров в предыдущие переменные.

36. Если переменная счета больше 500, то разрешаем переход к событию 4.

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

38. Если совпадают, то зажигаем светодиод, устанавливаем сервопривод а 180 градусов., разрешаем переход к событию 1, запрещаем события нажатия кнопки, сохраняем нынешнее значение счетчика.

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

Событие 4.

40. Очищаем индикатор.

41. Обнуляем переменную счета.

42. Считываем значение с потенциометров с помощью функции "ReadingValues()".

43. Если значения изменились, то разрешаем переход к события 3.

44. Сохраняем новые значения левого и правого потенциометров в предыдущие переменные.

45. Если нажата кнопка, то разрешаем переход в событие 3.

46. В функции "ReadingValues()" убираем дребезг потенциометров, а именно значения на потенциометрах не в масштабе должны быть больше или меньше предыдущих значений на 10 единиц.

47.Тогда сохраняем текущие значения потенциометров не в масштабе и сохраняем текущие значения потенциометров масштабе в зависимости от диапазона.

48. В функции "ShowTime()" преобразуем время целочисленного значения в строковое, добавляя ноль, где это необходимо.

49. А так же выводим раз в пол секунды общее время и мигающую точку по центру, для событий 1 и 7.

50. Для остальных событий выводим время и точку постоянно.

Лабораторная работа №5 – автоматическое управление светом

Необходимые компоненты:

Arduino Uno х 1шт.

Trema Set Shield х 1шт.

Trema-модуль реле х 1шт.

Trema-модуль часы реального времени, RTC х 1шт.

Trema-модуль кнопка со светодиодом, зеленая х 1шт.

Trema-модуль кнопка со светодиодом, красная х 1шт.

Trema-модуль четырехразрядный LED индикатор х 1шт.

Для реализации проекта нам необходимо установить следующие библиотеки:

1. Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.

2. Библиотека iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.

3. Библиотека EEPROM - для работы с энергонезависимой памятью EEPROM (библиотека входит в стандартный набор Arduino IDE).

Схема сборки:

4. Устанавливаем Trema Set Shield в Arduino Uno.

5. Устанавливаем Trema-модуль Четырехразрядный LED индикатор во 2 посадочную площадку.

1

Рисунок 37. Установка индикатора 4

6. Устанавливаем Trema-модуль часы реального времени, RTC в 3 посадочную площадку, в верхнюю I2C колодку.

1

Рисунок 38. Установка модуля часов 2

7. Устанавливаем Trema-модуль реле в 4 посадочную площадку.

1

Рисунок 39. Установка реле

8. Устанавливаем Trema-модуль синюю кнопку со светодиодом в 5 посадочную площадку.

1

Рисунок 40. Установка синей кнопки 2

9. Устанавливаем Trema-модуль красную кнопку со светодиодом в 6 посадочную площадку.

1

Рисунок 41. Установка красной кнопки 2

10. Вариант 1. Подключаем лампочку как показано на рисунке ниже.

1

Рисунок 42. Установка лампочки

11. Вариант 2. Подключаем светодиодную ленту к Источник питания на 12В, через Коннектор с помощью Проводков как показано на рисунке ниже.

1

Рисунок 43. Установка светодиодной ленты

12. Код программы:

#include // Подключаем библиотеку EEPROM.

//

#include // Подключаем библиотеку iarduino_4LED.

iarduino_4LED dispLED(1, A0); // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO ).

//

#include // Подключаем библиотеку.

iarduino_RTC time(RTC_DS3231); // Объявляем объект time для модуля на базе чипа DS3231.

//

const uint8_t pinRele = 3; // Объявляем пин для работы с реле.

const uint8_t pinKeyRed = 11; // Объявляем пин для работы с красной кнопкой.

const uint8_t pinKeyGreen = A3; // Объявляем пин для работы с зеленой кнопкой.

const uint8_t pinKeyLedRed = 13; // Объявляем пин для работы со светодиодом красной кнопки.

const uint8_t pinKeyLedGreen = 5; // Объявляем пин для работы со светодиодом зеленой кнопки.

//

int menu; // Переменная события.

int i; // Переменная счета.

//

bool eventKeyGreen = true; // Переменная события разрешаем/запрещаем разовое изменение времени зеленой кнопки.

bool eventKeyRed = true; // Переменная события разрешаем/запрещаем разовое изменение времени красной кнопки.

//

int hour; // Переменная для часов.

int minut; // переменная для секунд.

//

String hourChar; // Переменная для хранения часов в строковом формате.

String minutChar; // Переменная для хранения минут в строковом формате.

String times; // Переменная для хранения времени в строковом формате.

//

int minOff; // Переменная для хранения часов выключения света.

int hourOff; // Переменная для хранения минут выключения света.

//

int minOn; // Переменная для хранения часов включения света.

int hourOn; // Переменная для хранения минут включения света.

//

int minutPrev; // Переменная для хранения предыдущих минут.

long prevMicros; // Переменная для хранения предыдущего значения счетчика.

bool counter; // Переменная события разрешает/запрещает вывод на индикатор.

bool alarm = false; // Переменная события разрешает/запрещает управление светом.

//

void Return(); // Функция возвращения в начальное состояние, событие 1.

void ShowTime(); // Функция вывода времени.

void CheckHour(); // Функция проверки часов/минут.

void ChangeTime(); // Функция изменения времени. Увеличиваем/уменьшаем минуты.

//

void setup() //

{ //

pinMode(pinRele, OUTPUT); // Переводим вывод pinRele в режим выхода.

pinMode(pinKeyGreen, INPUT); // Переводим вывод pinKeyGreen в режим входа.

pinMode(pinKeyRed, INPUT); // Переводим вывод pinKeyRed в режим входа.

dispLED.begin(); // Инициируем LED дисплей.

//

time.begin(); // Инициируем RTC модуль.

menu = 1; // Задаем событие 1.

//

minOn = EEPROM.read(1); // Считываем значение минут включения света из памяти EEPROM.

if (minOn > 59 && minOn < 00) {minOn = 0;} // Если значение не в диапазоне минут, то обнуляем.

hourOn = EEPROM.read(2); // Считываем значение часов включения света из памяти EEPROM.

if (hourOn > 23 && hourOn < 00) {hourOn = 0;} // Если значение не в диапазоне часов, то обнуляем.

minOff = EEPROM.read(3); // Считываем значение минут выключения света из памяти EEPROM.

if (minOff > 59 && minOff < 00) {minOff = 0;} // Если значение не в диапазоне минут, то обнуляем.

hourOff = EEPROM.read(4); // Считываем значение часов выключения света из памяти EEPROM.

if (hourOff > 23 && hourOff < 00) {hourOff = 0;} // Если значение не в диапазоне часов, то обнуляем.

} //

//

void loop() //

{ //

time.gettime(); // Читаем время, обновляя значения всех переменных.

switch (menu) // Выбираем действие.

{ //

case 1: // Событие 1. Задание времени.

digitalWrite(pinKeyLedRed, LOW); // Выключаем светодиод на красной кнопки.

digitalWrite(pinKeyLedGreen, LOW); // Выключаем светодиод на зеленой кнопки.

//

hour = time.Hours; // Считываем значение часов с датчика времени.

minut = time.minutes; // Считываем значение минут с датчика времени.

dispLED.light(7); // Устанавливаем максимальную яркость свечения LED индикатора.

ShowTime(); // Функция вывода времени на индикатор.

//

if (hourOn == hour && minOn == minut) // Если время совпадает с временем включения света.

{ //

alarm = true; // Разрешаем включение света.

digitalWrite(pinRele, HIGH); // Включаем реле.

} //

if (alarm) {menu = 7;} // Если разрешено включение света, то разрешаем переход к событию 7.

//

i = 0; // Обнуляем переменную счета.

if(digitalRead(pinKeyGreen)) // Проверка нажатия зеленой кнопки.

{ //

while(digitalRead(pinKeyGreen)) // Цикл слежения нажатой зеленой кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<100 && digitalRead(pinKeyRed)) // Проверка нажатия красной кнопки и переменной счета, когда она меньше 100.

{ //

menu = 2; // Разрешаем переход к событию 2.

eventKeyGreen = false; // Запрещаем нажатие зеленой кнопки.

} //

else {i++;} // Увеличиваем переменную счета.

} //

if(eventKeyGreen) // Проверка нажатия зеленой кнопки.

{ //

menu = 5; // Разрешаем переход к событию 5.

eventKeyGreen = true; // Разрешаем нажатие зеленой кнопки.

} //

} //

i = 0; // Обнуляем переменную счета.

//

if(digitalRead(pinKeyRed)) // Проверка нажатия красной кнопки.

{ //

while(digitalRead(pinKeyRed)) // Цикл слежения нажатой красной кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<100 && digitalRead(pinKeyGreen)) // Проверка нажатия зеленой кнопки. Если нажаты обе, то переходим к действию обратного отсчета.

{ //

menu = 2; // Разрешаем переход к событию 2.

eventKeyRed = false; // Запрещаем нажатие красной кнопки.

} //

else {i++;} // Увеличиваем переменную счета.

} //

if(eventKeyRed) // Проверка нажатия зеленой кнопки.

{ //

menu = 3; // Разрешаем переход к событию 2.

eventKeyRed = true; // Разрешаем нажатие красной кнопки.

} //

} //

i = 0; // Обнуляем переменную счета.

eventKeyGreen = true; // Разрешаем нажатие зеленой кнопки.

eventKeyRed = true; // Разрешаем нажатие красной кнопки.

break; // Выходим из оператора case.

//

case 2: // Событие 2.

dispLED.light(2); // Устанавливаем небольшую яркость свечения LED индикатора.

digitalWrite(pinKeyLedRed, HIGH); // Включаем светодиод на красной кнопке.

digitalWrite(pinKeyLedGreen, HIGH); // Включаем светодиод на зеленой кнопке.

ChangeTime(); // Функция изменение времени.

time.settime(-1, minut, hour); // Датчик времени принимает установленные новые значение минут и часов.

Return(); // Функция возвращения в начальное состояние, событие 1.

break; // Выходим из оператора case.

//

case 3: // Событие 3.

dispLED.light(2); // Устанавливаем небольшую яркость свечения LED индикатора.

digitalWrite(pinKeyLedRed, HIGH); // Включаем светодиод на красной кнопке.

dispLED.print("OFF"); // Вывод текста из букв латинского алфавита.

delay(1000); // Задержка одна секунда.

menu = 4; // Разрешаем переход к событию 4.

hour = hourOff; // Считываем ранее установленные часы выключения света.

minut = minOff; // Считываем ранее установленные минуты выключения света.

break; // Выходим из оператора case.

//

case 4: // Событие 4.

dispLED.light(2); // Устанавливаем небольшую яркость свечения LED индикатора.

ShowTime(); // Функция вывода времени.

ChangeTime(); // Функция изменение времени.

Return(); // Функция возвращения в начальное состояние, событие 1.

if (menu == 1) // Если разрешен переход к событию 1.

{ //

hourOff = hour; // Сохраняем новые установленные часы выключения света.

minOff = minut; // Сохраняем новые установленные минуты выключения света.

EEPROM.write(3, minOff); // Записываем новые установленные минуты выключения света в память EEPROM по адресу 3.

EEPROM.write(4, hourOff); // Записываем новые установленные часы выключения света в память EEPROM по адресу 4.

} //

break; // Выходим из оператора case.

//

case 5: // Событие 5.

dispLED.light(2); // Устанавливаем небольшую яркость свечения LED индикатора.

digitalWrite(pinKeyLedGreen, HIGH); // Включаем светодиод на зеленой кнопке.

dispLED.print("ON"); // Вывод текста из букв латинского алфавита.

delay(1000); // Задержка одна секунда.

menu = 6; // Разрешаем переход к событию 6.

hour = hourOn; // Считываем ранее установленные часы включения света.

minut = minOn; // Считываем ранее установленные минуты включения света.

break; // Выходим из оператора case.

//

case 6: // Событие 6.

dispLED.light(2); // Устанавливаем небольшую альную яркость свечения LED индикатора.

ShowTime(); // Функция вывода времени.

ChangeTime(); // Функция изменение времени.

Return(); // Функция возвращения в начальное состояние, событие 1.

if (menu == 1) // Если разрешен переход к событию 1.

{ //

hourOn = hour; // Сохраняем новые установленные часы включения света.

minOn = minut; // Сохраняем новые установленные минуты включения света.

EEPROM.write(1, minOn); // Записываем новые установленные минуты включения света в память EEPROM по адресу 1.

EEPROM.write(2, hourOn); // Записываем новые установленные часы включения света в память EEPROM по адресу 2.

} //

break; // Выходим из оператора case.

//

case 7: // Событие 7.

ShowTime(); // Функция вывода времени.

hour = time.Hours; // Считываем значение часов с датчика времени.

minut = time.minutes; // Считываем значение минут с датчика времени.

if (hourOff == hour && minOff == minut) // Если время совпадает с временем выключения света.

{ //

menu = 1; // Разрешаем переход в событие 1.

alarm = false; // Запрещаем включение света.

digitalWrite(pinRele, LOW); // Выключаем реле.

} //

if (digitalRead(pinKeyGreen) || digitalRead(pinKeyRed)) // Проверка нажатия зеленой либо красной кнопки.

{ //

menu = 1; // Разрешаем переход к событию 1.

} //

break; // Выходим из оператора case.

} //

} //

//

void Return() // Функция вывода времени.

{ //

if (minutPrev == minut) {i++;} // Если нынешнее значение времени равно предыдущему значению минут, то увеличиваем переменную счета.

else {i = 0;} // Иначе обнуляем переменную счета.

if (i > 150){menu = 1;} // Если переменная счета больше 150, то разрешаем переход к событию 1.

minutPrev = minut; // Сохраняем текущее значение времени

} //

//

void CheckHour() // Функция проверки часов/минут.

{ //

if (minut > 59){hour++; minut = 00;} // Если минуты больше 59, увеличиваем часы на 1, обнуляем минуты.

if (minut < 00){hour--; minut = 59;} // Если минуты меньше 00, уменьшаем часы на 1, устанавливаем 59 минут.

if (hour > 23) {hour = 00;} // Если часы больше 23, обнуляем часы.

if (hour < 00) {hour = 23;} // Если часы меньше 00, устанавливаем 23 часа.

} //

//

void ChangeTime() // Функция изменения времени. Увеличиваем/уменьшаем минуты.

{ //

if(digitalRead(pinKeyRed)) // Проверка нажатия красной кнопки.

{ //

while(digitalRead(pinKeyRed)) // Цикл слежения нажатой красной кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<100){i++;} // Если переменная счета меньше 100, то увеличиваем переменную счета.

else // Если переменная счета больше 100.

{ //

delay(50); // Задержка 50 мс.

minut++; // Увеличиваем количество минут.

CheckHour(); // Функция проверки часов/минут.

ShowTime(); // Функция показа времени.

} //

} //

if (i < 70) // Если переменная счета меньше 70.

{ //

minut++; // Увеличиваем количество минут.

CheckHour(); // Функция проверки часов/минут.

ShowTime(); // Функция показа времени.

} //

i = 0; // Обнуляем переменную счета.

} //

//

if(digitalRead(pinKeyGreen)) // Проверка нажатия зеленой кнопки.

{ //

while(digitalRead(pinKeyGreen)) // Цикл слежения нажатой зеленой кнопки.

{ //

delay(10); // Ждём пока мы её не отпустим.

if(i<100){i++;} // Если переменная счета меньше 100, то увеличиваем переменную счета.

else // Если переменная счета больше 100.

{ //

delay(50); // Задержка 50 мс.

minut--; // Уменьшаем количество минут.

CheckHour(); // Функция проверки часов/минут.

ShowTime(); // Функция показа времени.

} //

} //

if (i < 70) // Если переменная счета меньше 70.

{ //

minut--; // Уменьшаем количество минут.

CheckHour(); // Функция проверки часов/минут.

ShowTime(); // Функция показа времени.

} //

i = 0; // Обнуляем переменную счета.

} //

} //

//

void ShowTime() // Функция показа времени.

{ //

if (hour>=0 && hour<10) // Если количество времени у левого игрока от 0 до 9.

{hourChar = (String) "0" + hour;} // Добавляем спереди ноль и переводим в строковое значение.

else{hourChar = (String) hour;} // Иначе просто переводим количество времени в строковое значение.

//

if (minut>=0 && minut<10) // Если количество времени у правого игрока от 0 до 9.

{minutChar = (String) "0" + minut;} // Добавляем спереди ноль и переводим в строковое значение.

else{minutChar = (String) minut;} // Иначе просто переводим количество времени в строковое значение.

//

times = hourChar + minutChar; // Присваиваем общей переменной количество времени левого и правого игрока.

//

if (menu == 1 || menu == 7) // Если разрешены событие 1 или 7.

{ //

if (micros() - prevMicros > 500000) // Каждые пол секунды.

{ //

prevMicros = micros(); // Сохраняем предыдущее значение таймера.

counter=!counter; // Изменяем переменную события вывода значений на индикатор.

if (!counter) // Если переменная события false.

{ //

dispLED.print(times); // Выводим значение на индикатор.

} //

else // Если переменная события true.

{ //

dispLED.point(2, true); // Включаем вторую точку.

} //

} //

} //

else // Если запрещены событие 1 или 7.

{ //

dispLED.print(times); // Выводим значение на индикатор.

dispLED.point(2, true); // Включаем вторую точку.

} //

} //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

13. Подключаем стандартную библиотеку EEPROM.h для работы с памятью EEPROM.

14. Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.

15. Объявляем объект dispLED, с указанием выводов дисплея.

16. Подключаем библиотеку iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.

17. Объявляем объект time для модуля на базе чипа DS3231.

18. Объявляем пины для работы с Trema-модуль реле, Trema-модуль кнопка со светодиодом, красная и Trema-модуль кнопка со светодиодом, зеленая, а так же пины для работы со светодиодами кнопок.

19. Объявляем переменные и функции задействованные в скетче.

В коде setup выполняются следующие действия:

20. Переводим выводы pinRele для реле, pinKeyGreen для зеленой кнопки, pinKeyRed для красной кнопки в режим выхода.

21. Инициируем LED дисплей.

22. Инициируем RTC модуль.

23. Задаем событие 1.

24. Проверяем данные записанные в память EEPROM. Если они не попадают в диапазон времени (для минут от 00 до 59, для часов от 00 до 24), то обнуляем полученные данные.

В коде loop выполняются следующие действия:

25. Читаем время с датчика реального времени.

Событие 1.

26. Выключаем светодиоды красной и зеленой кнопки.

27. Записываем показания датчика времени. Записываем текущее время (часы и минуты) в переменные

28. Устанавливаем максимальную яркость свечения LED индикатора.

29. Выводим время на дисплей с помощью функции "ShowTime()".

30. Проверяем совпадает текущее время с временем включения света. Если совпадает, то разрешаем включение света, включаем реле.

31. Проверяем событие разрешения света. Если разрешено, то разрешаем переход к событию 7.

32. Проверка нажатия зеленой кнопки. Если нажата, то переходим к циклу проверки нажатия красной кнопки.

33. Ждем секунду и если не нажата, то разрешаем переход к событию 5 (Событие разрешение/запрет нажатия зеленой кнопки по умолчанию разрешено).

34. Если нажата, то переходим к событию 2 и запрещаем нажатие зеленой кнопки.

35. Проверка нажатия красной кнопки. Если нажата, то переходим к циклу проверки нажатия зеленой кнопки.

36. Ждем секунду и если не нажата, то разрешаем переход к событию 3 (Событие разрешение/запрет нажатия красной кнопки по умолчанию разрешено).

37. Если нажата, то переходим к событию 2 и запрещаем нажатие красной кнопки.

38. Разрешаем событие нажатия зеленой и красной кнопки.

Событие 2.

39. Устанавливаем небольшую яркость свечения LED индикатора.

40. Включаем светодиоды на красной и зеленой кнопках.

41. Изменяем время (увеличиваем либо уменьшаем) с помощью функции "ChangeTime()".

42. Устанавливаем новое время.

43. Разрешаем переход в событие 1 с помощью функции "Return()".

Событие 3.

44. Устанавливаем небольшую яркость свечения LED индикатора.

45. Включаем светодиод на красной кнопке.

46. Вывод текста "OFF" на индикатор.

47. Ждем 1 секунду и разрешаем переход к событию 4.

48. Считываем время выключения в переменные времени "hour" и "minut".

Событие 4.

49. Выводим время на индикатор с помощью функции "ShowTime()".

50. Изменяем время (увеличиваем либо уменьшаем) с помощью функции "ChangeTime()".

51. Разрешаем переход в событие 1 с помощью функции "Return()".

52. Если разрешен переход в событие 1, то записываем новое заданное время выключения света в переменные выключения света и в память EEPROM.

Событие 5.

53. Устанавливаем небольшую яркость свечения LED индикатора.

54. Включаем светодиод на зеленой кнопке.

55. Вывод текста "On" на индикатор.

56. Ждем 1 секунду и разрешаем переход к событию 6.

57. Считываем время включения в переменные времени "hour" и "minut".

Событие 6.

58. Выводим время на индикатор с помощью функции "ShowTime()".

59. Изменяем время (увеличиваем либо уменьшаем) с помощью функции "ChangeTime()".

60. Разрешаем переход в событие 1 с помощью функции "Return()".

61. Если разрешен переход в событие 1, то записываем новое заданное время включения света в переменные включения света и в память EEPROM.

Событие 7.

62. Выводим время на индикатор с помощью функции "ShowTime()".

63. Считываем значение времени с датчика реального времени.

64. Если текущее время совпадает с временем выключения света, разрешаем переход к событию 1, запрещаем включение света, выключаем реле.

65. Если нажата одна из двух кнопок: красная либо зеленая, то разрешаем переход к событию один, а затем переход к событию нажатой кнопки.

66. В функция "Return()" проверяем изменение минут. Если меняются, то обнуляем переменную счета.

67. Если минуты не меняются увеличиваем переменную счета до 150.

68. Как только переменная счета дойдет до 150 разрешаем переход событию 1. Сохраняем новое значение минут в переменную "minutPrev".

69. В функция "CheckHour()" проверяем выход часов и минут за диапазон времени.

70. Если минуты больше 59, то увеличиваем часы на один и обнуляем минуты.

71. Если минуты меньше 00, то уменьшаем часы на один и устанавливаем минуты на 59.

72. Если часы больше 24, то обнуляем часы, если часы меньше 00, то устанавливаем часы на 23.

73. В функция "ChangeTime()" изменяем время (увеличиваем либо уменьшаем).

74. Проверяем нажатие красной/зеленой кнопки одинаковы.

75. Входим в цикл слежения нажатия красной/зеленой кнопки, в нем пока нажата кнопка увеличиваются/уменьшаются минуты, проверяем часы/минуты на выход за диапазон времени, выводим время на индикатор.

76. Проверка разового нажатия красной/зеленой кнопки.

77. Если нажата, то увеличиваем/уменьшаем минуты, проверяем часы/минуты на выход за диапазон времени, выводим время на индикатор.

78. В функция "ShowTime()" преобразуем время целочисленного значения в строковое, добавляя ноль, где это необходимо.

79. А так же выводим раз в пол секунды общее время и мигающую точку по центру, для событий 1 и 7.

80. Для остальных событий выводим время и точку постоянно.

Web hosting by Somee.com