今朝の着想、「Arduinoのメールサーバお知らせランプ」というのを実際に作った。
自分のプロバイダのメールサーバを定期的に監視して、メールがたまっていなければ緑、少し多ければ黄、たまりすぎていれば赤、早急に読み出さなければならないようなら赤の点滅、というふうに、ランプで知らせてくれるのである。
以前作った「未読メールメータ」とは違って、「ETHERNET SHIELD 2」を使って単独でネットにつながるように作ってあり、パソコンを立ち上げたりサーバを上げたりする必要はないので、使い方も単純だ。電源をつなぎ、そのへんにのたくっているカテ5のケーブルを突っ込めば終わりである。
まず、100円ショップで買ったアクリルの枠にEHTERNET SHIELD 2を取り付けたArduino UNOをねじ止めする。
LEDは昨日も使ったアノードコモンのものを、大きく見えるよう、これまた100円ショップで買ってきたピンポン玉の中に封入し、クリップでアクリルの枠にとりつける。
RGBそれぞれのピンをデジタルの3,4,5番につなぎ、アノードに+5Vを加える。それぞれのピンに330Ωの抵抗を付けておくことを忘れてはならない。
組み付けた様子
回路図については、描くほどのものではないが、まあ、描けばこうなる。
回路図
そうすると、メールの量に応じて、こんな具合に光り方が変わる。
メール10通以下は緑
メールが50通くらいまでは黄
メールが100通近くなってくると赤、100通を超えると赤点滅
写真の彩度が悪いが、実物はもっと鮮やかな色に見える。
スケッチはこんな感じだ。
//
// メールの残りによりランプの色を変える。
// 佐藤俊夫
// 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();
}
}