Arduino Automatický školní / školní zvonový systém

Arduino Automatický školní / školní zvonový systém

V tomto příspěvku budeme konstruovat automatický školní zvon / školní zvonový systém pomocí Arduina, displeje 16 x 2 a modulu hodin v reálném čase. Tento projekt můžete naprogramovat tak, aby zazvonil na zvonek až 16krát denně ve vámi preferovanou hodinu a minutu. Délka zvonění může být naprogramována v sekundách.

Hledáte jednodušší verzi bez kódování? Pochopit to TADY



Přehled

Časy, kdy peon ve škole zazvonil na zvonek „plechová cínová plechovka“, jsou pryč a studenti vyběhli před vchodem do školy. Někteří mohou být ještě šťastnější, když peon zazvonil na poslední zvon o několik minut dříve.



To byl scénář před 15 až 20 lety, ale nyní jsou všechny školy a vysoké školy přísně časově omezené a zvony jsou automatizovány.

Autorova dětská / dospívající kapuce si pamatuje:



Během mé základní a střední školy byly digitální hodinky, které jsem nosil, synchronizovány se školním zvonovým systémem s přesností na 1 sekundu.

Křičel jsem „zvonek zazvoní za 5 sekund“ poté, co zazvonil zvonek, všichni studenti na mě překvapeně zírali, stalo se to téměř každý den. Jednoho dne já a moji blízcí přátelé začneme odpočítávat 10, 9, 8, 7… .. před posledním zvonem.

Všichni moji přátelé říkají, že jsou to kouzelné náramkové hodinky, ale neuvědomili si jeden jednoduchý fakt, že školní zvon byl automatizován. LOL !!



Vyrobíme jeden takový školní zvon pomocí Arduina.

Zobrazení na Arduino připojení

Připojení displeje k Arduinu se mírně liší od toho, co je obvykle propojujeme, zde jsou použity piny 9, 8, 7, 6, 5 a 4. Kolíky číslo 2 a 3 se používají jako hardwarové přerušení prostřednictvím tlačítka .

Použijte 10K potenciometr pro nastavení kontrastu pro Zobrazit .

Arduino školní zvonek LCD

Automatický školní / školní zvonový systém pomocí Arduina

Podrobné informace o připojení zvonku a relé:

školní zvonek s Arduinem

UPDATE: A5 na SCL a A4 na SDA (ne A4 na SCK)

Hodinový modul v reálném čase

The Hodiny reálného času modul sleduje čas i po dlouhém výpadku proudu. K zapnutí a vypnutí zvonku je k dispozici 9V relé.

Připojte prosím přes relé diodu 1N4007 v obráceném zkreslení (která není na schématu znázorněna), která absorbuje škodlivé vysoké napětí zpět EMF z relé.

Napájejte obvod pomocí a 9V / 500mA nástěnný adaptér .

Tři tlačítka jsou k dispozici jedno pro ruční ovládání zvonku v určité situaci. Stisknutím tlačítka „exit“ se zvonek zastaví po ručním zazvonění zvonku.

„Tlačítko deaktivace zvonku“ zvonek deaktivuje. Chcete-li zvonek znovu aktivovat, stiskněte tlačítko „Konec“.

Jak nastavit čas do modulu RTC:

Stáhněte si knihovnu RTC:
Odkaz: github.com/PaulStoffregen/DS1307RTC

-------------------------------------------------- ---------------
Stáhnout timeLib.h:
github.com/PaulStoffregen/Time
-------------------------------------------------- ----------------

Nahrajte program

Nahrajte níže uvedený program, který nastaví čas na 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
}
//----------------------------------------------------//

Po nahrání kódu otevřete sériový monitor, který řekne, že je nastaven čas.
Jakmile je výše uvedený krok úspěšně dokončen, přejděte na další.
Nyní nahrajte níže uvedený kód do Arduina.

Kód hlavního programu:

//------------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------------//

Po nahrání výše uvedeného kódu byste měli na displeji vidět čas v hodinách.

Tím je programový kód ukončen.

Jak používat tento automatický zvonkový systém:

Udělejte to s dokončeným nastavením hardwaru.

1. Nejprve nahrajte kód „nastavení času“ a otevřete sériový monitor.
2. V hlavním programu zde nastavte čas, kdy je třeba relé sepnout.

//---- 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

• Nastavit h1 v hodinách od 1 do 23 hodin a m1 v minutách od 0 do 59.
• Stejné pro h1 až h16 a m1 až m16.
• Pokud chcete deaktivovat některé hodnoty ponechat zvonek h = 0 am = 0, například: h5 = 0 a m5 = 0, nula deaktivuje daný zvon.

3. Zde nastavte dobu zapnutí a vypnutí zvonku:

// --------------- délka zvonění v sekundách ------- //
const int Délka = 3 // v sekundách

Ve výchozím nastavení je hodnota nastavena na 3 sekundy. Po dosažení nastaveného času relé se na 3 sekundy zapne a vypne. Pokud to potřebujete, změňte to.

4. Nahrajte upravený kód do Arduina.
5. Chcete-li zvonek deaktivovat, stiskněte „tlačítko deaktivace zvonku“. Pro opětovné povolení stiskněte tlačítko „Exit“.
6. Chcete-li zvonit ručně, stiskněte „manuální spínač zvonku“ a pro zastavení zvonku stiskněte „exit“.

Tím je projekt uzavřen, pokud máte jakékoli dotazy týkající se tohoto projektu, neváhejte se vyjádřit v sekci komentářů.




Předchozí: Postavte tohoto Mosquito Bat bez baterie Další: Jak vyrobit docházkový systém založený na RFID