留守の見張り番プログラムです。
Dependencies: NetServices TextLCD mbed IniFileLib
main.cpp
- Committer:
- jksoft
- Date:
- 2012-06-21
- Revision:
- 0:7bc1d7c88b16
File content as of revision 0:7bc1d7c88b16:
#include "mbed.h" #include "EthernetNetIf.h" #include "NTPClient.h" #include "SMTPClient.h" #include "IniFile.h" #include "TextLCD.h" #define HOSTNAME "mbedSE" #define READ_BUF_SIZE 128 EthernetNetIf eth(HOSTNAME); DigitalOut led1(LED1, "led1"); DigitalIn sensor(p5); DigitalIn sw[] = { p13,p14,p9 }; TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7 LocalFileSystem local("local"); Ticker flipper; IniFile ini("/local/setting.ini"); extern "C" void mbed_reset(); char password[4] = { 1,2,4,1 }; int timecount = 0; void TimeCount() { if(timecount != 0) timecount--; } int SendMail() { int ini_port; char ini_server[READ_BUF_SIZE]; char ini_domain[READ_BUF_SIZE]; char ini_user[READ_BUF_SIZE]; char ini_password[READ_BUF_SIZE]; ini.get("PORT", ini_port); ini.get("SERVER", ini_server , READ_BUF_SIZE); ini.get("DOMAIN", ini_domain , READ_BUF_SIZE); ini.get("USER", ini_user , READ_BUF_SIZE); ini.get("PASSWORD", ini_password , READ_BUF_SIZE); Host host(IpAddr(), ini_port, ini_server); SMTPClient smtp(host, ini_domain, ini_user, ini_password, SMTP_AUTH_PLAIN); char ini_from_addr[READ_BUF_SIZE]; char ini_to_addr[READ_BUF_SIZE]; char ini_msg[READ_BUF_SIZE]; ini.get("FROM_ADDRESS", ini_from_addr , READ_BUF_SIZE); ini.get("TO_ADDRESS", ini_to_addr , READ_BUF_SIZE); ini.get("MSG", ini_msg , READ_BUF_SIZE); time_t ctTime = time(NULL) + 32400; EmailMessage msg; msg.setFrom(ini_from_addr); msg.addTo(ini_to_addr); msg.printf("Subject: Mail %s", ctime(&ctTime)); msg.printf("%s",ini_msg); printf("Send result %d\n", smtp.send(&msg)); printf("Last response | %s", smtp.getLastResponse().c_str()); smtp.clearAuth(); return(0); } int CheckInputSw() { static int BeforeSw[3] = { 0,0,0 }; int NowSw[3]; int ret = 0; for(int i=0;i<3;i++) { NowSw[i] = sw[i]; if((BeforeSw[i])&&(NowSw[i]==0)) { ret |= 0x01 << i; } BeforeSw[i] = NowSw[i]; } if(ret != 0) { wait(0.2); } return(ret); } bool password_mode() { int input_num = 0; char input_button[4] = { 0,0,0,0 }; lcd.locate(0,1); lcd.printf("Password? "); timecount = 5; flipper.attach(&TimeCount, 1.0); while((input_num < 4)&&(timecount!=0)) { lcd.locate(10,0); lcd.printf("%dsec",timecount); int in = CheckInputSw(); if( in ) { input_button[input_num] = in; input_num++; lcd.locate(10+input_num,1); lcd.printf("*"); } } flipper.detach(); if(memcmp( &input_button[0] , &password[0],4) == 0) { lcd.locate(10,1); lcd.printf(" OK "); return(true); } else { lcd.locate(10,1); lcd.printf(" NG "); return(false); } return(false); } int main() { sensor.mode(PullDown); sw[0].mode(PullUp); sw[1].mode(PullUp); sw[2].mode(PullUp); lcd.cls(); lcd.locate(0,0); lcd.printf("EtherSetting.."); EthernetErr ethErr; do { ethErr = eth.setup(); if (ethErr) printf("Timeout\n", ethErr); } while (ethErr != ETH_OK); #if 0 printf("Connected OK\n"); const char* hwAddr = eth.getHwAddr(); printf("HW address : %02x:%02x:%02x:%02x:%02x:%02x\n", hwAddr[0], hwAddr[1], hwAddr[2], hwAddr[3], hwAddr[4], hwAddr[5]); IpAddr ethIp = eth.getIp(); printf("IP address : %d.%d.%d.%d\n", ethIp[0], ethIp[1], ethIp[2], ethIp[3]); #endif // Get time NTPClient ntp; //printf("NTP setTime...\n"); Host server(IpAddr(), 123, "pool.ntp.org"); ntp.setTime(server); time_t ctTime = time(NULL) + 32400; //printf("\nTime is now (UTC): %d %s\n", ctTime, ctime(&ctTime)); Timer tm; tm.start(); bool checking = false; while (true) { time_t ctTime = time(NULL) + 32400; struct tm *timeObject = localtime(&ctTime); lcd.locate(0,1); lcd.printf("%02d/%02d %02d:%02d:%02d", timeObject->tm_mon,timeObject->tm_mday,timeObject->tm_hour,timeObject->tm_min,timeObject->tm_sec); if( checking ) { lcd.locate(0,0); lcd.printf("Watching Mode"); if (tm.read() > 0.5) { led1 = !led1; if(sensor) // if(CheckInputSw() == 0x04) { lcd.cls(); lcd.locate(0,0); lcd.printf("Alert On!"); if(password_mode()) { wait(0.5); } else { lcd.locate(0,0); lcd.printf("Send Alert Mail!"); SendMail(); mbed_reset(); } checking = false; lcd.cls(); } tm.start(); } } else { lcd.locate(0,0); lcd.printf("Free Mode"); if( CheckInputSw() == 0x01 ) { lcd.locate(0,0); lcd.printf("Mode Change..."); checking = true; wait(5); lcd.cls(); } } Net::poll(); } }