Geek 基本原理
本 Geek 作品原理,是通过运行在 Linux 电脑上的 Bash 脚本,定时执行 curl 命令,获取 Gmail 的 ATOM 服务返回的数值,当返回数值大于 0 时,向 Arduino 所在窗口发送数值,进而控制 RGB 亮灭。
操作耗时
10 ~ 20 分钟
注意事项
- 因为 Gmail 已被墙掉,确保可以连接到 Gmail,可以在浏览器地址栏输入 https://mail.google.com/mail/feed/atom ,在弹出窗口中输入用户名和密码,检查是否能够看到 XML Feed,如果不能,需要使用 VPN 翻墙。
- Bash 脚本中的用户名和密码均为明文传输,如担心安全问题,可注册新的 Gmail 帐户来测试。
Bash 脚本
进入 Linux 命令行,通过 nano 命令在用户文件夹下创建一个 Bash 脚本文件: $sudo nano ~/GmailNotifier.sh 进入 nano 编辑器界面后,复制以下代码,并根据实际情况和代码备注提示进行修改 #!/bin/bash #SCRIPT_NAME="Arduino Gmail Checker" #SCRIPT_VERSION="0.1" #figlet $SCRIPT_NAME $SCRIPT_VERSION
输入 Gmail 用户名和密码 警告:密码为明文,有泄漏的危险:
USERID=用户名 PASSWORD=密码
设置扫瞄新邮件时间间隔,默认30秒:
WAIT=30
#########################################################################################
#循环 while [ "1" -eq "1" ]; do
# 通过命令行命令 curl 获取 Gmail Feed:
MAILCOUNTER=curl -u $USERID:$PASSWORD --silent "https://mail.google.com/mail/feed/atom" | sed -n 's|\(.*\)|\1|p'
if [[ "$MAILCOUNTER" = "" ]]; then echo "ERROR: The program coulndn't fetch the account for user "$USERID"." echo "- Are you connected to the Internet?" echo -e "- Is the userid and password correct for "$USERID"?\n" echo 111 > /dev/tty.usbmodem1d1131 #点亮 RGB 红色 注意这里要把 tty.usbmodem1d1131 替换成你的 Arduino 端口号 elif [[ "$MAILCOUNTER" -eq "0" ]]; then echo "* There is 0 new email for user $USERID." echo 000 > /dev/tty.usbmodem1d1131 #熄灭 LED 注意这里要把 tty.usbmodem1d1131 替换成你的 Arduino 端口号 elif [[ "$MAILCOUNTER" -gt "0" ]]; then echo "* There is $MAILCOUNTER new email for user $USERID." echo 232 > /dev/tty.usbmodem1d1131 #点亮 LED 注意这里要把 tty.usbmodem1d1131 替换成你的 Arduino 端口号 fi
echo "* Waiting $WAIT seconds before checking for emails again." echo "* (^C 退出)" sleep 300
done 将 GmailNotifier.sh 权限改为可执行文件 $sudo chmod a+x ~/GmailNotifier.sh 运行 Bash 脚本 $sudo sh ~/GmailNotifier.sh
常见问题
遇到以下提示的解决办法: ERROR: The program coulndn't fetch the account for user "xxx@gmail.com".
- Are you connected to the Internet?
-e - Is the userid and password correct for "xxx@gmail.com"? 检查是否连接网络,检查是否需要开启 VPN,检查 Gmail 帐户名称和密码是否正确
Arduino 代码
/* @Author: TONYLABS @连接 PuzzleKit 中的 RGB LED 模块 @根据串口读数结果控制LED 0: 全部熄灭 1: 红色开启 2: 绿色开启 3: 蓝色开启 */
int redLed = 11; int greenLed = 10; int blueLed = 9;
void setup() { Serial.begin(9600); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); }
void loop () { int value = Serial.read();
if (value == '0') { digitalWrite(redLed,LOW); digitalWrite(greenLed,LOW); digitalWrite(blueLed,LOW); }
if (value == '1') { digitalWrite(redLed,HIGH); digitalWrite(greenLed,LOW); digitalWrite(blueLed,LOW); }
if (value == '2') { digitalWrite(redLed,LOW); digitalWrite(greenLed,HIGH); digitalWrite(blueLed,LOW); }
if (value == '3') { digitalWrite(redLed,LOW); digitalWrite(greenLed,LOW); digitalWrite(blueLed,HIGH); }
delay(1000); } /* @end */