RaspberryPi väckarklocka (5 / 9 steg)
Steg 5: Programmet
Kopiera programmet klockan till din RaspberryPi.
/******************************************************************
* Filnamn: clock.c
*
* RaspberryPi väckarklocka med särskild påminnelse funktionen.
*
* Kompilera: gcc -o clock - vägg - jag/usr/local/include - L/usr/local/lib
* clock.c - lwiringPi - lwiringPiDev
*
* Kör: sudo. / klocka
*
* Alla pin nummer är wiringPi tal om inte annat anges.
******************************************************************/
#include < time.h >
#include < stdio.h >
#include < wiringPi.h >
#include < lcd.h >
statisk int lcdhandle; LCD-skärm
char timmar [24] [3] = {"12", "01", "02", "03", "04", "05", "06", "07",
"08", "09", "10", "11", "12", "01", "02", "03",
"04", "05", "06", "07", "08", "09", "10", "11"};
char dow [7] [4] = {"Sun", "Må", "TI", "Ons",
"Tor", "fr", "lö"};
char månader [12] [4] = {"Jan", "Februari", "Mar", "Apr", "Maj", "Jun",
"Jul", "Augusti", "September", "Oktober", "November", "Dec"};
struct tm tm2; Strukturer för att få tid.
int timeh, timem, gånger; Nuvarande tidselement.
int datum, månad, år, wday;
int apin = 5; Larmknappen
int hpin = 6; Ange timmar knappen
int mpin = 12. Ställ in minuter knappen
int spin = 13. Speciella knappen
int PWMpin = 1; Larm ljud pin
int aflag = 0; Alarm flagga
int sflag = 0; särskild flagga
int alh = 0; Alarm timmar
int alm = 0; Alarm minuter
/*********************************************************
* gettime() funktion - få tid och läsa in den i
* globala variabler.
*********************************************************/
void gettime()
{
tid nu;
char * str;
nu = time(NULL); Får tid.
Str = ctime(&now); Konvertera den till en sträng.
strptime (str, "%a %b %d % H: % m %S %Y", & tm2); Konvertera från sträng.
timeh = tm2.tm_hour; Kopiera gånger
timem = tm2.tm_min; i globala variabler.
tider = tm2.tm_sec;
datum = tm2.tm_mday;
månad = tm2.tm_mon;
år = tm2.tm_year;
WDAY = tm2.tm_wday;
}
/*********************************************************
* dsptime() funktion - visar tiden.
*********************************************************/
void dsptime()
{
lcdPosition (lcdhandle, 6, 0);
lcdPrintf (lcdhandle, "% s:", * hours+(timeh*3)); Visa timmar
lcdPrintf (lcdhandle, "% 02d", timem); Visa minuter
IF(timeh<12) lcdPrintf (lcdhandle,"AM"); Visa AM/PM
annat lcdPrintf (lcdhandle,"PM");
lcdPosition (lcdhandle, 0, 1);
lcdPrintf (lcdhandle, "%s %s %d %d",
* dow+(wday*4), * months+(month*4), datum, (1900 + år));
IF(sflag>0)
{
lcdPosition (lcdhandle, 0, 3);
lcdPrintf (lcdhandle, "*");
}
annat
{
lcdPosition (lcdhandle, 0, 3);
lcdPrintf (lcdhandle,"");
}
IF(aflag==0) lcdPrintf (lcdhandle, "larm: OFF");
annat
{
lcdPrintf (lcdhandle, "larm: % s: % 02d", * hours+(alh*3), alm);
IF(Alh<12) lcdPrintf(lcdhandle,"AM"); / / Display AM/PM
annat lcdPrintf(lcdhandle,"PM");
}
}
/*********************************************************
* dspalarm() funktion - Display alarmtiden.
*********************************************************/
void dspalarm()
{
lcdPosition (lcdhandle, 0, 1);
lcdPrintf (lcdhandle, "ställa in Alarm: % s: % 02d", * hours+(alh*3), alm);
IF(Alh<12) lcdPrintf(lcdhandle,"AM"); / / Display AM/PM
annat lcdPrintf(lcdhandle,"PM");
}
/*********************************************************
* setalarm() funktion - ställa in tiden för alarmet
* och slå på den.
*********************************************************/
void setalarm()
{
lcdClear(lcdhandle);
dspalarm();
While(aflag==2)
{
While(digitalRead(hpin)==0) / / minut knappen trycks?
{
Alh ++; Increment alarm timme
IF(Alh>23) alh = 0; Timme kan inte vara > 23
dspalarm(); Gör om displayen
Delay(500); Tid att läsa det
}
Delay(25); Debounce
While(digitalRead(MPIN)==0) / / minut knappen trycks?
{
Alm + = 5. Lägga till 5 alarm minuter.
IF(Alm>59) alm = 0; Minuter kan inte vara > 59
dspalarm(); Gör om displayen
Delay(500); Tid att läsa det
}
Delay(25); Debounce
IF(digitalRead(APIn)==0)
{
While(digitalRead(APIn)==0);
Delay(25);
aflag = 3;
}
}
}
/**************************************************************
* Main () funktion
**************************************************************/
int main)
{
int ptime = 70. tidigare tid efter gettime()
int pday = 32. Föregående dag
wiringPiSetup(); Setup krävs av wiringPi
lcdhandle = lcdInit (4, 20, 4, 11.10, 0,2,3,4,0,0,0,0);
pinMode (apin, indata); Ställa in alarm stift till ingång pullup
pullUpDnControl (apin, PUD_UP);
pinMode (hpin, ingång); Ange timmar stift till ingång pullup
pullUpDnControl (hpin, PUD_UP);
pinMode (mpin, ingång); Ställa in minuter stift till ingång pullup
pullUpDnControl (mpin, PUD_UP);
pinMode (spin, indata); Ange speciella stift till ingång pullup
pullUpDnControl (spin, PUD_UP);
pinMode (PWMpin, PWM_OUTPUT); Larm ljud pin
pwmSetMode(PWM_MODE_MS); Mark/utrymme läge
pwmSetClock(100); Standard 100 (int)
pwmSetRange(1024); Standard 1024 (unsigned int)
int tull = 200. Intermittens (0 - range)
While(1)
{
Kom och Visa systemtid
getTime();
om (ptime! = gånger)
{
ptime = gånger; Spara tid som föregående tid
dsptime(); Visa tid
}
Växla särskild flagga om svart knapp intryckt eller nya dagen.
IF(digitalRead(Spin)==0) / / om knappen nedtryckt växla
{/ / särskilda flagga
While(digitalRead(Spin)==0) / / Dämpningstid
{
Delay(25);
}
sflag =! sflag; Toggle
}
om (datum! = pday) / / är det en ny dag?
{
lcdClear(lcdhandle);
sflag =! sflag; Om så växla special flagga,
pday = datum; och spara datum som tidigare.
}
Ljud larm.
IF(timeh==Alh) / / om alarm timme
{
IF(timem==Alm) / / och larm minut
{
IF(aflag==1) / / och larm flagga == 1
{
pwmWrite (PWMpin, tull); ljud larm
}
}
}
IF(aflag==0) pwmWrite (PWMpin, 0); Alarm off om du trycker på knappen
IF(timem!=Alm) pwmWrite (PWMpin, 0); eller 1 minut har passsed
Stänga av larmet, Ställ in alarmet.
IF(digitalRead(APIn)==0) / / larmknappen trycks?
{
While(digitalRead(APIn)==0) delay(25); Debounce
IF(aflag==1) aflag = 0; Om larmet flaggan klart det.
annat aflag = 2; Om larmet flagga avmarkerar
}
IF(aflag==2) setalarm(); kör set larmfunktion
om (timem! = alm) if(aflag == 3) aflag = 1;
}
Return 0;
}
Kompilera den med kommandot:
gcc -o clock - vägg - jag/usr/local/include - L/usr/local/lib clock.c - lwiringPi - lwiringPiDev
Och köra det med kommandot: sudo. / klocka
När du kompilerar det får du följande felmeddelande:
Clock.c: I funktionen "gettime": < br > clock.c:60:3: Varning: implicit deklaration av funktion 'strptime' [- Wimplicit - funktion-förklaring]
strptime (str, "%a %b %d % H: % m %S %Y", & tm2); Konvertera från sträng.
^
Oroa dig inte om det.