Опыты

Tabeli_normaliseerimine_ERmuudel_Blinov(1)Опыт 1.Светофор

1.Создание скетча светофора в Tinkercad
2.Создание цикла дневного режима и ночного режима
3.Воссоздание проекта Tinkercad в реале
4.Проверка работы светофора в Arduino
Дневной режим:
Красный длится 3 секунды
Жёлтый длится 1 секунду
Зелёный длится 5 секунд потом начинает мигать и мигает по 3 раза, с учётом интервалы между миганием 0.5 секунды.
Ночной режим:
Включается после того как дневной режим проходит 3 раза.
Потом начинает мигать жёлтый с интервалом в 0.7 секунды.
Компоненты:3 LED(Красный, Жёлтый, Зелёный), 5 проводов, 3 резистора по 220 Ом, плата Arduino Uno, макетная доска)
Применение: Светофор, Гирлянда, Азбука Морзе, Шкала температуры, Вывеска в магазине.

Реализовать программу светофора на Arduino можно различными способами. Сперва рассмотрим работу светофора по алгоритму, который изображён на картинке выше.
Для этого создадим переменные и инициализируем пины как выход.
В основном цикле loop() можно все реализовать, используя функции digitalWrite() и delay().
А чтобы заставить мигать зеленый светодиод воспользуемся функцией for()
Цикл led on выполняется 6 раз, так как при каждом выполнении цикла мы меняем булевую переменную с HIGH на LOW и наоборот. И выполняем либо включение светодиода, либо включение. По этой причине количество раз выполнения цикла увеличивается в 2 раза.
Конечный вариант кода светофора на Arduino будет вот таким:

void setup()
{
pinMode (7, OUTPUT);
pinMode (6, OUTPUT);
pinMode(5, OUTPUT);
}

void loop()
{
int i;
for (int i=0; i<2;i++)
{
digitalWrite(7, HIGH);
delay(2000);
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(3000);
digitalWrite(5, LOW);
delay(500);
digitalWrite(5, HIGH);
delay(500);
digitalWrite(5, LOW);
delay(500);
digitalWrite(5, HIGH);
delay(500);
digitalWrite(5, LOW);
delay(500);
digitalWrite(5, HIGH);
delay(500);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(6, LOW);
if (i==1) break;
}
digitalWrite(6, HIGH);
delay (800);
digitalWrite(6, LOW);
delay (800);
}

Первая часть кода отвечает за красный свет светофора,помеченной цифрой 7,другая часть отмеченная цифрой 6 отвечает за желтый свет и предпоследняя часть кода за зеленый свет отмеченная цифрой 5

https://youtu.be/rWJDe4xxG98

https://youtu.be/rWJDe4xxG98
https://youtu.be/uurdUdC-6Ek

Опыт 2.Гирлянда

https://youtu.be/s-MDnLjoaLo

ХОД РАБОТЫ:
В tinkercad.com составил схему реализующую работу гирлянды в пяти режимах.
Переключение с одного режима на другой происходит с помощью потенциаметра.
Была протестированна работоспособность в tinkercad.
После этого была собрана гирлянда.

Фиолетовый провод был подключен к питанию 5V и к плюсу. Черный провод подключен к GND и к минусу. Зеленый провод с A0 подключен к потенциометру. Сам потенциометр подключен к плюсу и к минусу. Каждый резистр на 330Кл подключен к лампочке. Лампочки подклчены в свои пронумерованные гнезда.

КОМПОНЕНТЫ:

12 LED-светодиодов (красный, желтый, белый, зеленый), 12 резисторов на 330Кл, 29 проводов, 1 потенциометр.

ВОЗМОЖНОСТИ ПРИМЕНЕНИЯ:

Контроль громкости.
На гитарном усилителе. (Громкость, режимы).


Потенциаметр может использоваться, как делитель напряжения.

И также потенциаметр можно использовать на колонках, чтоб изменять их громкость.

Из них можно собирать какие-нибудь рисунки или полностью заполнять ими пронстранство, и также сделать разные режимы и с помощью потенциаметра можно менять режимы и делать какие-то картинки.
КОД:

int sensorPin = 0;
int ledred1 = 13; // Дается знечени красному светодиоду
int ledyellow1 = 12; // Желтый
int ledwhite1 = 11;// Белый
int ledgreen1 = 10; // Синий
int ledred2 = 9;// Красный
int ledyellow2 = 8;// Желтый
int ledwhite2 = 7; // Белый
int ledgreen2 = 6;// Синий
int ledred3 = 5;// Красный
int ledyellow3 = 4;// Желтый
int ledwhite3 = 3; // Белый
int ledgreen3 = 2;// Синий
int sensorValue = 0;
int Value_new;
void red() //режим красных ламп (1 режим гирлянды. Красные лампы включаются по очереди.)
{
digitalWrite(ledred1, HIGH);
delay(300);
digitalWrite(ledred1, LOW);
digitalWrite(ledred2, HIGH);
delay(500);
digitalWrite(ledred2, LOW);
digitalWrite(ledred3, HIGH);
delay(400);
digitalWrite(ledred3, LOW);
}
void green() //режим зеленых ламп (2 режим гирлянды. Все три зеленых ламп моргают)
{
digitalWrite(ledgreen1, HIGH);
digitalWrite(ledgreen2, HIGH);
digitalWrite(ledgreen3, HIGH);
delay(200);
digitalWrite(ledgreen1, LOW);
digitalWrite(ledgreen2, LOW);
digitalWrite(ledgreen3, LOW);
delay(200);
}
void yellow() //режим желтых ламп (3 режим гирлянды. Включается 1 и 3 желтая лампа, погасают и включается 2.)
{
digitalWrite(ledyellow1, HIGH);
digitalWrite(ledyellow3, HIGH);
delay(2000);
digitalWrite(ledyellow1, LOW);
digitalWrite(ledyellow3, LOW);
delay(300);
digitalWrite(ledyellow2, HIGH);
delay(400);
digitalWrite(ledyellow2, LOW);
for (int x=0; x<12; x++){ //цикл для мигания 1 и 3 светодиода. digitalWrite(ledyellow1, HIGH); delay(100); digitalWrite(ledyellow1, LOW); digitalWrite(ledyellow3, HIGH); delay(100); digitalWrite(ledyellow3, LOW); } } void white() //режим белых ламп (4 режим гирлянды. Все три белых ламп моргают.) { digitalWrite(ledwhite1, HIGH); digitalWrite(ledwhite2, HIGH); digitalWrite(ledwhite3, HIGH); delay(5000); digitalWrite(ledwhite1, LOW); digitalWrite(ledwhite2, LOW); digitalWrite(ledwhite3, LOW); delay(100); } void mix() //совместный режим всех ламп (5 режим гирлянды. Все лампы включаются по очереди. (сначала 1) { digitalWrite(ledred1, HIGH); digitalWrite(ledred2, HIGH); digitalWrite(ledred3, HIGH); delay(2000); digitalWrite(ledwhite1, HIGH); digitalWrite(ledwhite2, HIGH); digitalWrite(ledwhite3, HIGH); delay(3000); digitalWrite(ledyellow1, HIGH); digitalWrite(ledyellow2, HIGH); digitalWrite(ledyellow3, HIGH); delay(4000); digitalWrite(ledgreen1, HIGH); digitalWrite(ledgreen2, HIGH); digitalWrite(ledgreen3, HIGH); delay(2000); digitalWrite(ledred1, LOW); digitalWrite(ledred2, LOW); digitalWrite(ledred3, LOW); delay(1000); digitalWrite(ledwhite1, LOW); digitalWrite(ledwhite2, LOW); digitalWrite(ledwhite3, LOW); delay(1000); digitalWrite(ledyellow1, LOW); digitalWrite(ledyellow2, LOW); digitalWrite(ledyellow3, LOW); delay(1000); digitalWrite(ledgreen1, LOW); digitalWrite(ledgreen2, LOW); digitalWrite(ledgreen3, LOW); delay(1000); } void led_on() //режим всех ламп (6 режим гирлянды. Все лампы включаются.) { digitalWrite(ledred1, HIGH); digitalWrite(ledred2, HIGH); digitalWrite(ledred3, HIGH); digitalWrite(ledwhite1, HIGH); digitalWrite(ledwhite2, HIGH); digitalWrite(ledwhite3, HIGH); digitalWrite(ledyellow1, HIGH); digitalWrite(ledyellow2, HIGH); digitalWrite(ledyellow3, HIGH); digitalWrite(ledgreen1, HIGH); digitalWrite(ledgreen2, HIGH); digitalWrite(ledgreen3, HIGH); delay(3000); digitalWrite(ledred1, LOW); digitalWrite(ledred2, LOW); digitalWrite(ledred3, LOW); digitalWrite(ledwhite1, LOW); digitalWrite(ledwhite2, LOW); digitalWrite(ledwhite3, LOW); digitalWrite(ledyellow1, LOW); digitalWrite(ledyellow2, LOW); digitalWrite(ledyellow3, LOW); digitalWrite(ledgreen1, LOW); digitalWrite(ledgreen2, LOW); digitalWrite(ledgreen3, LOW); delay(1000); } void setup() { pinMode(ledred1,OUTPUT); pinMode(ledred2,OUTPUT); pinMode(ledred3,OUTPUT); pinMode(ledgreen1,OUTPUT); pinMode(ledgreen2,OUTPUT); pinMode(ledgreen3,OUTPUT); pinMode(ledyellow1,OUTPUT); pinMode(ledyellow2,OUTPUT); pinMode(ledyellow3,OUTPUT); pinMode(ledwhite1, OUTPUT); pinMode(ledwhite2, OUTPUT); pinMode(ledwhite3, OUTPUT); } void loop() { Value_new = analogRead(sensorPin); //код для потенциометра. С каждым значением, включается свой режим. if (Value_new<150) { red(); } else if(Value_new>=150 && Value_new<=300) { green(); } else if (Value_new>=300 && Value_new<=450) { yellow(); } else if(Value_new>=450 && Value_new<=600) { white(); } else if(Value_new>=600 && Value_new<=750) { mix(); } else if(Value_new>=750 && Value_new<=900)
{
led_on();
}
else
{
digitalWrite(ledred1, LOW);
digitalWrite(ledred2, LOW);
digitalWrite(ledred3, LOW);
digitalWrite(ledgreen1, LOW);
digitalWrite(ledgreen2, LOW);
digitalWrite(ledgreen3, LOW);
}
}

3. Опыт с кнопкой

https://youtu.be/3IGRdtjQvSM

const int button1Pin = 2; //viik kunu on ühebdatud nupp1

const int button2Pin = 3; //viik kuhu on ühendatud nupp2

const int ledPin = 13;

void setup()

{

pinMode(button1Pin, INPUT); //algväärtuse nupu viigu sisendiks

pinMode(button2Pin, INPUT); //algväärtuse nupu viigu sisendiks

pinMode(ledPin, OUTPUT); //algväärtuse LED viigu väljundiks

}

void loop()

{

int button1State, button2State; //nupu oleku muutujad ( переменные для сохранения состояния кнопок)

// Поскольку кнопки имеют только два состояния (нажаты и не нажаты) мы будем

// работать с ними используя цифровые порты ввода. Для того чтобы считывать

// digitalRead() функция позволяет получить один параметр с цифрового порта и возвратить либо HIGH (+5V), либо LOW (“0”).

button1State = digitalRead(button1Pin);// salvestame muutujasse nupu hetke väärtuse

button2State = digitalRead(button2Pin);

if (((button1State == LOW) || (button2State == LOW)) // kui nupu on alla vajutatud (сравниваем, нажата ли одна из кнопок)

  && !                                               // и если нет
  ((button1State == LOW) && (button2State == LOW))) // kui nupude on alla vajutatud (сравниваем, нажаты ли обе кнопки тогда...)

{

digitalWrite(ledPin, HIGH);  // süütame LEDi (включаем светодиод)

}

else

{

digitalWrite(ledPin, LOW);  // kustutame LEDi (выключаем светодиод)

}

}

Опыт номер 4.Ночник

 

Компоненты

  • 3х Красных светодиоида
  • 5х Резисторов
  • 11х проводов
  • 1х набор Arduino Uno
  • 1х кнопка
  • 1х фоторесистор

Процесс работы: Фоторезистор отвечает за горение светодиоидов в темноте, при уменьшении яркости светодиоид будет гореть ярче.

Код:

const int whitel = 13;
const int white2 = 12;
const int white3 = 11;
const int button = 2;
const int sensorPin = 0;
int lightLevel, high = 0, low = 1023;void setup(){

pinMode(whitel, OUTPUT);
pinMode(white2, OUTPUT);
pinMode(white3, OUTPUT);
pinMode(button, INPUT);
}
void loop()
{
if (digitalRead(2)== HIGH)
{
lightLevel = analogRead(sensorPin);
manualTune();
analogWrite(whitel, lightLevel);
analogWrite(white2, lightLevel);
analogWrite(white3, lightLevel);
}
else
digitalWrite(whitel, LOW);
digitalWrite(white2, LOW);
digitalWrite(white3, LOW);
}

void manualTune()
{
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
}

void autoTune()

{
if (lightLevel < low)
{
low = lightLevel;
}
if (lightLevel > high)
{
high = lightLevel;
}
lightLevel = map (lightLevel, low+0, high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);

}

4.Опыт(Температурный датчик + серводвигатель)

Для этого опыта нам необходимо:
Плата Arduino
21 провод
Резистор 330 Ом
Потенциометр
Температурный датчик
Сервопривод
LCD экран

Действует сенсор температуры, когда температура становится ниже или равна 22 градусов серво поворачивается на 0 градусов. Когда температура выше 22 градусов серво поворачивается на 180.Все данные отображаются на LCD-дисплее.

Применения датчика температуры:

автоматическая настройка температуры
измерение температуры в комнате
измерение температуры в авариуме

Код:



Servo servo1;
const int temperaturePin = 0;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

void setup(){
servo1.attach(3);
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop(){
int position;
float degreesC, voltage;
voltage = getVoltage(temperaturePin);
degreesC = (voltage – 0.5) * 100.0;
lcd.print(” deg C: “);
lcd.print(degreensC);
delay(1000);
lcd.clear();
if (22>degreesC)
{
servo1.write(0);
}
if (35<degreesC)
{
servo1.write(180);
}
}
float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
}

Описание работы:
Для начала работы подключите питание к Arduino. Закрепите устройство на какой-либо предмет. С помощью потенциометра выставите критический уровень тряски. Если крутить влево, то будет установлен максимальный критический уровень тряски. Устройство никак не будет реагировать на тряску. Если крутить потенциометр вправо, то будет установлен минимальный критический уровень тряски и при малейшем движении, устройство будет сигнализировать небольшой мелодией и включенным светодиодом. Теперь устройство можно использовать для переноски любых предметов. Устройство оповестит о сильной тряске.

Проект 7. Сигнализация
ГЛАВНАЯ / УРОКИ И ПРОЕКТЫ / Проект 7. Сигнализация
Устройство оповестит вас о вибрации самого устройство, а так же каких-либо приспособлений.

Нам понадобится:
Arduino Uno х 1шт.
Trema Set Shield х 1шт.
Trema-модуль зуммер х 1шт.
Trema-модуль светодиод х 1шт.
Trema-модуль потенциометр х 1шт.
Trema-модуль датчик вибрации х 1шт.
Для реализации проекта нам не нужно устанавливать никаких библиотеки.

Схема сборки:
Устанавливаем Trema Set Shield в Arduino Uno.
Устанавливаем красный Trema-модуль светодиод в 1 посадочную площадку.

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

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

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

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

Код программы:
int pinDatZ = 11; // Объявляем пин для работы с датчиком звука.
int pinPot = A3; // Объявляем пин для работы с потенциометром.
int pinLed = 6; // Объявляем пин для работы со светодиодом.
const uint8_t pinZum = A0; // Объявляем пин для работы с зуммером.
//
float potVolue; // Переменная для чтения показаний с потенциометра.
float datZVolue; // Переменная для усредненных показаний с датчика вибрации.
float readDatZ; // Переменная для чтения показаний с датчика вибрации.
float average = 2; // Определяем константу усреднения показаний датчика (чем выше значение, тем выше инерционность выводимых показаний).
//
void Music(); // Функция музыки с зуммера.
//
void setup() //
{ //
pinMode(pinLed, OUTPUT); // Переводим вывод pinLedRed в режим выхода.
} //
//
void loop() //
{ //
potVolue = map(analogRead(pinPot), 0, 1023, 100, 0); // Читаем показания с потенциометра и масштабируем значения в диапазон от 1 до 100.
readDatZ = digitalRead(pinDatZ); // Читаем показания с датчика вибрации.
//
datZVolue = average-1; // Умножаем предыдущее значение датчика звука на коэффициент усреднения-1. datZVolue += readDatZ; // Добавляем к полученному значению новые показания датчика звука. datZVolue /= average; // Делим полученное значение на коэффициент усреднения. // while (datZVolue100 > potVolue) // Усредненные показания с датчика вибрации умножаем на сто и выполняем цикл, если они больше показаний с потенциометра.
{ //
digitalWrite(pinLed, HIGH); // Включаем светодиод.
digitalWrite(pinZum, HIGH); // Включаем зуммер.
////
Music(); // Переходим к функции музыки с зуммера.
//
//
} //
digitalWrite(pinLed, LOW); // Выключаем светодиод.
digitalWrite(pinZum, LOW); // Выключаем зуммер.
} //
//
void Music() // Функция музыки с зуммера.
{ //
datZVolue = 0; // Обнуляем переменную усреднения показаний с датчика вибрации.
tone(pinZum, 2048, 500); // Выводим звуковой сигнал с частотой 2048 Гц и длительностью 0,1 сек.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 1024, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 512, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 256, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 128, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 64, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 32, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 16, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 8, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 4, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 2, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 1, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 2, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 4, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 8, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 16, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 32, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 64, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 128, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 256, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 512, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 1024, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
tone(pinZum, 2048, 500); // Выводим звуковой сигнал длительностью 0,1 сек с частотой 2048 Гц.
delay(200); // Не выводим звук в течении 0,1 сек (см. ниже).
} //
Алгоритм работы:
В начале скетча (до кода setup) выполняются следующие действия:

Объявляем пины для работы с Trema-модуль датчик вибрации, Trema-модуль потенциометр, Trema-модуль светодиод, Trema-модуль зуммер.
Объявляем массив и переменные задействованные в программе.
В коде setup выполняются следующие действия:
Переводим вывод Arduino для светодиода в режим выхода.
В коде loop выполняются следующие действия:

Считываем показания с потенциометра в масштабе от 1 до 100.
Считываем показания с датчика вибрации.
Усредняем показания с датчика вибрации.
Если усредненные показания датчика вибрации, умноженные на 100 больше критического значения с потенциометра, то включаем светодиод и зуммер, а так же переходим к функции “Music()”, в которой проиграется небольшая мелодия. Функцию “Music()” можно отключить, закомментировав или удалив строчку с функцией в самом скетче. Это строчка обрамлена звездочками. Её легко найти. Если меньше, то выключаем светодиод и зуммер.

Проект 11. Часы
ГЛАВНАЯ / УРОКИ И ПРОЕКТЫ / Проект 11. Часы
Устройство часы в представлении не требуется. Устройство показывает текущее время.

Описание работы:
Для начала работы подключите питание к Arduino. На индикаторе появится текущее время. Для настройки времени, нажмите любую кнопку, либо зеленую, либо красную. Уменьшится яркость индикатора, значит можно настраивать время. При нажатии или удержании зеленой кнопки будут увеличиваться минуты до 59. При нажатии или удержании красной кнопки будут уменьшаться минуты до 0. При достижении минут 59, увеличивается количество часов, а значение минут установится в 0. При достижении минут 0, уменьшится количество часов, а значение минут установится в 59. При достижении часов 23, значение часов сбросится в 0, а при достижении часов 0, значение часов установится в 23. После установки нужного времени, необходимо подождать две секунды. Тогда выбранное время сохранится, индикатор увеличит свою яркость, а время пойдет как прежде.

Нам понадобится:
Arduino Uno х 1шт.
Trema Set Shield х 1шт.
Trema-модуль красная кнопка х 1шт.
Trema-модуль зеленая кнопка х 1шт.
Trema-модуль часы реального времени, RTC х 1шт.
Trema-модуль четырехразрядный LED индикатор х 1шт.
Для реализации проекта нам необходимо установить следующие библиотеки:
Библиотека iarduino_4LED для работы с Trema-модуль четырехразрядным LED индикатором.
Библиотека iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.

Схема сборки:
Устанавливаем Trema Set Shield в Arduino Uno.
Устанавливаем Trema-модуль Четырехразрядный LED индикатор во 2 посадочную площадку.

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

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

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

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

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

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) выполняются следующие действия:

Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.
Объявляем объект dispLED, с указанием выводов дисплея.
Подключаем библиотеку iarduino_RTC для работы с Trema-модуль часами реального времени, RTC.
Объявляем объект time для модуля на базе чипа DS3231.
Объявляем пины для работы с Trema-модуль красной кнопкой и Trema-модуль зеленой кнопкой.
Объявляем переменные и функции задействованные в скетче.
В коде setup выполняются следующие действия:

Переводим выводы pinKeyGreen для зеленой кнопки и pinKeyRed для красной кнопки в режим выхода.
Инициируем LED дисплей.
Инициируем RTC модуль.
Задаем событие 1.
В коде loop выполняются следующие действия:

Читаем время, с модуля часов реального времени.
Устанавливаем максимальную яркость свечения индикатора.
Событию 1.
Проверяем нажата зеленая или красная кнопка. Если одна из кнопок нажата, то сохраняем текущее значение времени в переменные времени и разрешаем переход к событию 2.
Каждую секунду включаем и выключаем вторую точку на индикаторе. Для этого проверяем четность/нечетность приходящих секунд с модуля реального времени. Если нечетное, включаем вторую точку на индикаторе и гасим двоеточие на индикаторе, если оно присутствует на индикаторе. Если четное, то выводим на индикатор текущее время.
Событие 2.
Уменьшаем яркость свечения индикатора.
Включаем вторую точку на индикаторе.
Проверяем нажата зеленая кнопка. Если нажата, то заходим в цикл нажатия зеленой кнопки. Там фиксируем, как долго удерживается зеленая кнопка: если дольше 2 секунд, то увеличиваем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, увеличение прекратится. Если же нажата один раз зеленая кнопка, то увеличение минут произойдет один раз. Обнуляем переменную счета.
Проверяем нажата красная кнопка. Если нажата, то заходим в цикл нажатия красной кнопки. Там фиксируем, как долго удерживается красная кнопка: если дольше 2 секунд, то уменьшаем быстро минуты и выводим изменение на индикатор. Как только кнопка отжата, уменьшение прекратится. Если же нажата один раз красная кнопка, то уменьшение минут произойдет один раз. Обнуляем переменную счета.
Проверяем совершалось изменение минут. Если предыдущее значение минут совпадает с нынешним значением минут, то увеличиваем переменную счета, иначе обнуляем переменную счета.
Если переменная счета больше 150, то разрешаем переход к событию 1. Обнуляем переменную счета.
Сохраняем нынешнее значение минут в переменную предыдущего значения минут.