Geek 基本原理

本 Geek 作品原理,是通过运行在 Linux 电脑上的 Bash 脚本,定时执行 curl 命令,获取 Gmail 的 ATOM 服务返回的数值,当返回数值大于 0 时,向 Arduino 所在窗口发送数值,进而控制 RGB 亮灭。

操作耗时

10 ~ 20 分钟

注意事项

  1. 因为 Gmail 已被墙掉,确保可以连接到 Gmail,可以在浏览器地址栏输入 https://mail.google.com/mail/feed/atom ,在弹出窗口中输入用户名和密码,检查是否能够看到 XML Feed,如果不能,需要使用 VPN 翻墙。
  2. 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|<fullcount>\(.*\)</fullcount>|\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
*/