Автоматическая система школьного / студенческого звонка Arduino

Попробуйте наш инструмент устранения неполадок





В этом посте мы собираемся построить автоматическую систему школьных звонков / звонков колледжа с использованием Arduino, дисплея 16 x 2 и модуля часов реального времени. Вы можете запрограммировать этот проект так, чтобы он звонил в звонок до 16 раз в день в желаемый час и минуту. Длину звонка можно запрограммировать в секундах.

Ищете более простую версию без кода? Возьми ЗДЕСЬ



Обзор

Прошли те времена, когда в школе батюшка звонил в звонок «оловянное олово», и ученики с честью выбегали из подъезда школы. Некоторые могут стать еще счастливее, когда пеон позвонит в последний звонок на несколько минут раньше.

Так было 15-20 лет назад, но теперь все школы и колледжи строго привязаны ко времени, а звонки автоматизированы.



Быстрое детство / юность автора запомните:

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

Я кричал: «Звонок зазвонит через 5 секунд» после того, как зазвонил звонок, все ученики смотрят на меня с удивлением, это происходит почти каждый день. В какой-то день я и мои близкие друзья начинаем отсчет на 10, 9, 8, 7… ..перед последним звонком.

Все мои друзья говорят, что это волшебные наручные часы, но они не осознавали одного простого факта, что школьный звонок был автоматизирован. РЖУНИМАГУ!!

Мы собираемся сделать один такой звонок для школы / колледжа, используя Arduino.

Подключение дисплея к Arduino

Дисплей для соединений Arduino немного отличается от того, что мы обычно подключаем, здесь используются контакты 9, 8, 7, 6, 5 и 4. Контакты 2 и 3 используются как аппаратное прерывание через нажмите на кнопки .

Используйте 10K потенциометр для регулировки контраста для отображать .

ЖК-дисплей школьного звонка Arduino

Автоматическая система звонков из школы / колледжа с использованием Arduino

Подробная информация о подключении звонка и реле:

схема таймера школьного звонка с Arduino

ОБНОВЛЕНИЕ: A5 в SCL и A4 в SDA (не A4 в SCK)

Модуль часов реального времени

В Часы реального времени модуль отслеживает время даже после длительного отключения электроэнергии. Для включения и выключения звонка предусмотрено реле 9В.

Подключите к реле диод 1N4007 с обратным смещением (который не показан на схеме), который будет поглощать опасную обратную ЭДС высокого напряжения от реле.

Подайте питание на схему, используя Настенный адаптер 9 В / 500 мА .

Предусмотрены три кнопки, одна для ручного управления звонком в некоторых ситуациях. Нажатие кнопки «Выход» остановит звонок после ручного звонка.

«Кнопка отключения звонка» отключит звонок навсегда. Чтобы снова включить звонок, нажмите кнопку «Выход».

Как установить время для модуля RTC:

Загрузите библиотеку RTC:
Ссылка: github.com/PaulStoffregen/DS1307RTC

-------------------------------------------------- ---------------
Скачайте timeLib.h:
github.com/PaulStoffregen/Time
-------------------------------------------------- ----------------

Загрузить программу

Загрузите программу ниже, которая установит время в RTC

//----------------------------------------------------//
#include
#include
#include
int P=A3 //Assign power pins for RTC
int N=A2
const char *monthName[12] = {
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
}
tmElements_t tm
void setup() {
pinMode(P,OUTPUT)
pinMode(N,OUTPUT)
digitalWrite(P,HIGH)
digitalWrite(N,LOW)
bool parse=false
bool config=false
// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__)) {
parse = true
// and configure the RTC with this info
if (RTC.write(tm)) {
config = true
}
}
Serial.begin(9600)
while (!Serial) // wait for Arduino Serial Monitor
delay(200)
if (parse && config) {
Serial.print('DS1307 configured Time=')
Serial.print(__TIME__)
Serial.print(', Date=')
Serial.println(__DATE__)
} else if (parse) {
Serial.println('DS1307 Communication Error :-{')
Serial.println('Please check your circuitry')
} else {
Serial.print('Could not parse info from the compiler, Time='')
Serial.print(__TIME__)
Serial.print('', Date='')
Serial.print(__DATE__)
Serial.println(''')
}
}
void loop() {
}
bool getTime(const char *str)
{
int Hour, Min, Sec
if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false
tm.Hour = Hour
tm.Minute = Min
tm.Second = Sec
return true
}
bool getDate(const char *str)
{
char Month[12]
int Day, Year
uint8_t monthIndex
if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false
for (monthIndex = 0 monthIndex <12 monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break
}
if (monthIndex >= 12) return false
tm.Day = Day
tm.Month = monthIndex + 1
tm.Year = CalendarYrToTm(Year)
return true
}
//----------------------------------------------------//

После загрузки кода откройте серийный монитор, он скажет, что время установлено.
Как только вышеуказанный шаг будет успешно выполнен, переходите к следующему.
Теперь загрузите приведенный ниже код в Arduino.

Код основной программы:

//------------Program developed by R.GIRISH------------//
#include
#include
#include
#include
#include
LiquidCrystal lcd(9, 8, 7, 6, 5, 4)
int i = 0
int H = 0
int M = 0
int S = 0
int setting_value
const int bell = 10
const int P = A3
const int N = A2
const int setting_address = 0
const int over_ride_off = 11
boolean bell_status = true
boolean Over_ride = true
//------------------- Set Bell Timings from hours 1 to 23 hrs -------------------//
//---- 1st bell ------//
const int h1 = 0 //hours
const int m1 = 0 //Minutes
//---- 2nd bell ------//
const int h2 = 0
const int m2 = 0
//---- 3rd bell ------//
const int h3 = 0
const int m3 = 0
//---- 4th bell ------//
const int h4 = 0
const int m4 = 0
//---- 5th bell ------//
const int h5 = 0
const int m5 = 0
//---- 6th bell ------//
const int h6 = 0
const int m6 = 0
//---- 7th bell ------//
const int h7 = 0
const int m7 = 0
//---- 8th bell ------//
const int h8 = 0
const int m8 = 0
//---- 9th bell ------//
const int h9 = 0
const int m9 = 0
//---- 10th bell ------//
const int h10 = 0
const int m10 = 0
//---- 11th bell ------//
const int h11 = 0
const int m11 = 0
//---- 12th bell ------//
const int h12 = 0
const int m12 = 0
//---- 13th bell ------//
const int h13 = 0
const int m13 = 0
//---- 14th bell ------//
const int h14 = 0
const int m14 = 0
//---- 15th bell ------//
const int h15 = 0
const int m15 = 0
//---- 16th bell ------//
const int h16 = 0
const int m16 = 0
//--------------- bell ring lenght in seconds -------//
const int Lenght = 3 //in seconds
//-------------------------- -------------------------//
void setup()
{
lcd.begin(16, 2)
pinMode(P, OUTPUT)
pinMode(N, OUTPUT)
pinMode(bell, OUTPUT)
pinMode(over_ride_off, INPUT)
digitalWrite(P, HIGH)
digitalWrite(N, LOW)
digitalWrite(over_ride_off, HIGH)
attachInterrupt(0, over_ride, RISING)
attachInterrupt(1, bell_setting, RISING)
if (EEPROM.read(setting_address) != 1)
{
bell_setting()
}
}
void loop()
{
tmElements_t tm
lcd.clear()
if (RTC.read(tm))
{
H = tm.Hour
M = tm.Minute
S = tm.Second
lcd.setCursor(0, 0)
lcd.print('TIME:')
lcd.print(tm.Hour)
lcd.print(':')
lcd.print(tm.Minute)
lcd.print(':')
lcd.print(tm.Second)
lcd.setCursor(0, 1)
lcd.print('DATE:')
lcd.print(tm.Day)
lcd.print('/')
lcd.print(tm.Month)
lcd.print('/')
lcd.print(tmYearToCalendar(tm.Year))
} else {
if (RTC.chipPresent())
{
lcd.setCursor(0, 0)
lcd.print('RTC stopped!!!')
lcd.setCursor(0, 1)
lcd.print('Run SetTime code')
} else {
lcd.clear()
lcd.setCursor(0, 0)
lcd.print('Read error!')
lcd.setCursor(0, 1)
lcd.print('Check circuitry!')
}
}
if (EEPROM.read(setting_address) == 1)
{
if (H == 0 && M == 0 && S == 0)
{
digitalWrite(bell, LOW)
}
if (H == h1 && M == m1 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h2 && M == m2 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h3 && M == m3 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h4 && M == m4 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h5 && M == m5 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h6 && M == m6 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h7 && M == m7 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h8 && M == m8 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h9 && M == m9 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h10 && M == m10 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h11 && M == m11 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h12 && M == m12 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h13 && M == m13 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h14 && M == m14 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h15 && M == m15 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
if (H == h16 && M == m16 && S == 0)
{
for (i = 0 i {
digitalWrite(bell, HIGH)
delay(1000)
}
digitalWrite(bell, LOW)
i = 0
}
}
delay(1000)
}
void over_ride()
{
lcd.clear()
while (Over_ride)
{
digitalWrite(bell, HIGH)
lcd.setCursor(0, 0)
lcd.print('Press Exit to')
lcd.setCursor(0, 1)
lcd.print('Stop the bell!!!')
if (digitalRead(over_ride_off) == LOW)
{
Over_ride = false
digitalWrite(bell, LOW)
}
}
Over_ride = true
}
void bell_setting()
{
setting_value = 0
EEPROM.write(setting_address, setting_value)
lcd.clear()
while (bell_status)
{
lcd.setCursor(0, 0)
lcd.print('Bell is Disabled')
lcd.setCursor(0, 1)
lcd.print('Press Exit.')
if (digitalRead(over_ride_off) == LOW)
{
bell_status = false
}
}
bell_status = true
setting_value = 1
EEPROM.write(setting_address, setting_value)
}
//------------Program developed by R.GIRISH------------//

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

На этом завершается программный код.

Как использовать эту систему автоматического звонка:

Сделайте это с завершенной настройкой оборудования.

1. Сначала загрузите код «установки времени» и откройте монитор последовательного порта.
2. В основной программе установите время, в которое реле должно сработать.

//---- 1st bell ------//
const int h1 = 0 //hours
const int m1 = 0 //Minutes
//---- 2nd bell ------//
const int h2 = 0
const int m2 = 0
//---- 3rd bell ------//
const int h3 = 0
const int m3 = 0
//---- 4th bell ------//
const int h4 = 0
const int m4 = 0

• Установите h1 в часах от 1 до 23 часов и m1 в минутах от 0 до 59.
• То же самое для h1 – h16 и m1 – m16.
• Если вы хотите отключить какое-либо значение выхода звонка h = 0 и m = 0, например: h5 = 0 и m5 = 0, ноль отключит этот конкретный звонок.

3. Задайте продолжительность включения и выключения звонка, здесь:

// --------------- длина звонка в секундах ------- //
const int Lenght = 3 // в секундах

По умолчанию значение установлено на 3 секунды. Когда наступит установленное время, реле будет включен на 3 секунды и выключится. При необходимости измените это.

4. Загрузите измененный код в Arduino.
5. Чтобы отключить звонок, нажмите «кнопку отключения звонка». Для повторного включения нажмите кнопку «Выход».
6. Чтобы позвонить в звонок вручную, нажмите «ручной переключатель звонка», а чтобы остановить звонок, нажмите «Выход».

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




Предыдущая статья: Создайте эту москитную летучую мышь без батареи Далее: Как создать систему посещаемости на основе RFID