Arduino automatický školský / školský zvonový systém

Vyskúšajte Náš Nástroj Na Odstránenie Problémov





V tomto príspevku zostrojíme automatický školský zvon / školský zvonový systém využívajúci Arduino, displej 16 x 2 a modul hodín v reálnom čase. Tento projekt môžete naprogramovať tak, aby zvonil na zvonček až 16-krát denne v požadovanú hodinu a minútu. Dĺžku zvonenia je možné naprogramovať v sekundách.

Hľadáte jednoduchšiu verziu bez kódovania? Získajte to TU



Prehľad

Časy, keď peon v škole zazvonil na zvon „plechová cínová plechovka“, boli preč a študenti vybehli z vchodu do školy jasnými farbami. Niektorí môžu byť ešte šťastnejší, keď peon zazvonil na posledný zvon o pár minút skôr.

To bol scenár pred 15 až 20 rokmi, ale teraz sú všetky školy a vysoké školy prísne časovo obmedzené a zvony sú automatizované.



Autorova detská / tínedžerská kukla si pamätá:

Počas mojej základnej a strednej školy sa digitálne hodinky, ktoré som nosil, synchronizovali so školským zvonovým systémom s presnosťou na 1 sekundu.

Zakričal by som „zvonček zazvoní o 5 sekúnd“ po zazvonení zvonku všetci študenti na mňa prekvapene zízali, stáva sa to takmer každý deň. Jedného dňa začnem ja a moji blízki priatelia odpočítavať 10, 9, 8, 7 ... pred posledným zvonením.

Všetci moji priatelia hovoria, že sú to čarovné náramkové hodinky, ale neuvedomili si jeden jednoduchý fakt, že školský zvon bol automatizovaný. LOL !!

Chystáme sa vyrobiť jeden taký školský zvon pomocou Arduina.

Pripojenie displeja k Arduinu

Pripojenia displeja k Arduinu sa mierne líšia od toho, čo obvykle pripájame, tu sa používajú piny 9, 8, 7, 6, 5 a 4. Kolíky číslo 2 a 3 sa používajú ako hardvérové ​​prerušenie cez tlačidlá .

Použite 10K potenciometer pre nastavenie kontrastu pre displej .

Arduino školský zvonček LCD

Automatický školský / školský zvonový systém využívajúci Arduino

Podrobné informácie o pripojení zvonov a relé:

školský zvonček s obvodom Arduino

AKTUALIZÁCIA: A5 na SCL a A4 na SDA (nie A4 na SCK)

Hodinový modul v reálnom čase

The Hodiny reálneho času modul sleduje čas aj po dlhom výpadku napájania. Na zapnutie a vypnutie zvončeka je k dispozícii 9V relé.

Pripojte diódu 1N4007 v opačnom smere na relé (čo nie je znázornené na schéme), ktorá absorbuje škodlivé vysoké napätie EMF z relé.

Napájajte obvod pomocou a 9V / 500mA nástenný adaptér .

Tri tlačidlá sú opatrené jedným tlačidlom na ručné ovládanie zvončeka v určitých situáciách. Stlačením tlačidla „opustiť“ sa zvonenie zastaví po manuálnom zvonení.

„Tlačidlo deaktivácie zvončeka“ zvonček deaktivuje navždy. Pre opätovné zapnutie zvončeka stlačte tlačidlo „Ukončiť“.

Ako nastaviť čas na modul RTC:

Stiahnite si knižnicu RTC:
Odkaz: github.com/PaulStoffregen/DS1307RTC

-------------------------------------------------- ---------------
Stiahnite si timeLib.h:
github.com/PaulStoffregen/Time
-------------------------------------------------- ----------------

Nahrajte program

Nahrajte program nižšie, ktorý 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 nahraní kódu otvorte sériový monitor, ten povie, že je nastavený čas.
Po úspešnom dokončení vyššie uvedeného kroku prejdite na ďalší.
Teraz nahrajte nasledujúci 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 nahraní vyššie uvedeného kódu by sa mal na displeji zobraziť čas v hodinách.

Týmto sa programový kód končí.

Ako používať tento systém automatického zvončeka:

Urobte to pomocou dokončeného nastavenia hardvéru.

1. Najskôr nahrajte kód „nastavenia času“ a otvorte sériový monitor.
2. V hlavnom programe tu nastavte čas, v ktorom je potrebné relé aktivovať.

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

• Nastaviť h1 v hodinách od 1 do 23 hodín a m1 v minútach od 0 do 59.
• Rovnaké pre h1 až h16 a m1 až m16.
• Ak chcete deaktivovať niektoré hodnoty zvončeka, nechajte napríklad h = 0 am = 0: h5 = 0 a m5 = 0, nula deaktivuje konkrétny zvon.

3. Tu nastavte časovú periódu zapínania a vypínania zvončeka:

// --------------- dĺžka zvonenia v sekundách ------- //
const int Dĺžka = 3 // v sekundách

Štandardne je hodnota nastavená na 3 sekundy. Keď nastane nastavený čas, štafeta sa zapne na 3 sekundy a vypne sa. Ak je to potrebné, zmeňte to.

4. Nahrajte upravený kód do Arduina.
5. Ak chcete zvonček deaktivovať, stlačte „tlačidlo deaktivácie zvončeka“. Pre opätovné povolenie stlačte tlačidlo „Exit“.
6. Pre zvonenie zvončeka stlačte ručne „spínač ručného zvončeka“ a pre zastavenie zvončeka stlačte „výstup“.

Týmto je projekt ukončený, pokiaľ máte akékoľvek otázky týkajúce sa tohto projektu, neváhajte ich vyjadriť v sekcii komentárov.




Dvojica: Zostavte tohto moskytiéra bez batérie Ďalej: Ako vyrobiť dochádzkový systém založený na RFID