今朝の着想、「Arduinoのメールサーバお知らせランプ」というのを実際に作った。
自分のプロバイダのメールサーバを定期的に監視して、メールがたまっていなければ緑、少し多ければ黄、たまりすぎていれば赤、早急に読み出さなければならないようなら赤の点滅、というふうに、ランプで知らせてくれるのである。
以前作った「未読メールメータ」とは違って、「ETHERNET SHIELD 2」を使って単独でネットにつながるように作ってあり、パソコンを立ち上げたりサーバを上げたりする必要はないので、使い方も単純だ。電源をつなぎ、そのへんにのたくっているカテ5のケーブルを突っ込めば終わりである。
まず、100円ショップで買ったアクリルの枠にEHTERNET SHIELD 2を取り付けたArduino UNOをねじ止めする。
LEDは昨日も使ったアノードコモンのものを、大きく見えるよう、これまた100円ショップで買ってきたピンポン玉の中に封入し、クリップでアクリルの枠にとりつける。
RGBそれぞれのピンをデジタルの3,4,5番につなぎ、アノードに+5Vを加える。それぞれのピンに330Ωの抵抗を付けておくことを忘れてはならない。
回路図については、描くほどのものではないが、まあ、描けばこうなる。
そうすると、メールの量に応じて、こんな具合に光り方が変わる。
写真の彩度が悪いが、実物はもっと鮮やかな色に見える。
スケッチはこんな感じだ。
// // メールの残りによりランプの色を変える。 // 佐藤俊夫 // 27.06.14(日) 1500~ // #include <SPI.h> #include <Ethernet2.h> byte MAC[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 }; IPAddress IP(192, 168, 1, 129); IPAddress MY_DNS(192, 168, 1, 1); EthernetClient CLIENT; const char MAIL_SERVER[] = "pop.hogehoge.ne.jp", USER[] = "USER hoge@pop.hage.ne.jp", PASS[] = "PASS passpass"; unsigned long LAST_CONNECTION_TIME = 0; const unsigned long CONNECTION_INTERVAL = 300L * 1000L; int R = 0, G = 0, B = 0; const int LEDR = 3, LEDG = 4, LEDB = 5; unsigned long LAST_LED_BLINK_TIME = 0; boolean LED_BLINK_RED = true; const int LED_BLINK_INTERVAL = 1000; int MAIL_NUM = 0; String RECEIVE_STR = ""; void setup() { pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); delay(1000); Ethernet.begin(MAC, IP, MY_DNS); } void loop() { if (CLIENT.available()) { char c = CLIENT.read(); RECEIVE_STR += c; } if (millis() - LAST_CONNECTION_TIME > CONNECTION_INTERVAL) { pop3connect(); if(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") >= 0){ RECEIVE_STR = RECEIVE_STR.substring(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") + 22); RECEIVE_STR = RECEIVE_STR.substring(0, RECEIVE_STR.indexOf(" ")); MAIL_NUM = RECEIVE_STR.toInt(); } RECEIVE_STR = ""; } if(MAIL_NUM <= 10){ digitalWrite(LEDR, HIGH); digitalWrite(LEDG, LOW); digitalWrite(LEDB, HIGH); }else if(MAIL_NUM <= 50){ digitalWrite(LEDR, LOW); digitalWrite(LEDG, LOW); digitalWrite(LEDB, HIGH); }else if(MAIL_NUM <= 100){ digitalWrite(LEDR, LOW); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); }else if(MAIL_NUM > 100){ if(millis() - LAST_LED_BLINK_TIME > LED_BLINK_INTERVAL){ if(LED_BLINK_RED){ digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); LED_BLINK_RED = false; }else{ digitalWrite(LEDR, LOW); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); LED_BLINK_RED = true; } LAST_LED_BLINK_TIME = millis(); } } } void pop3connect() { CLIENT.stop(); if (CLIENT.connect(MAIL_SERVER, 110)) { CLIENT.println(USER); delay(1000); CLIENT.println(PASS); delay(1000); CLIENT.println("STAT"); delay(1000); CLIENT.println("QUIT"); delay(1000); CLIENT.println(); LAST_CONNECTION_TIME = millis(); } }