M5Stack/ESP32学习笔记(15)—— 入手M5Stack ATOM Lite

目录

  • 入手M5Stack ATOM Lite
    • 想法
    • 准备ATOM*按键*
      • MicroPython系统
      • ATOM端的程序
        • boot.py
        • main.py
      • NAS端的程序
        • NAS的环境
        • 思路
        • 代码
        • 设置程序为开机自启动
        • 几个关于服务的命令
    • 参考资料

入手M5Stack ATOM Lite

很久没有把玩M5Stack 玩具 开发板 了。本来说研究一下用Arduino IDE给M5Stack编程,但是一直都没空实施(懒~),回头再说吧。 最近看到M5Stack的新产品,ATOM,一个很小的小玩意,没有电池,没有显示屏,不过有一个Reset按键,一个用户按键,一个三色LED,红外发射,三轴…… 反正是麻雀虽小五脏俱全

但是,我一时也想不起来能用这个干点啥。

不过,突然想到我有个咸鱼淘的蜗牛星际主机(好像是A款)改的NAS。我淘到的这个机子有个特点,插电就自动开机,不需要再按主机上的开关键。这倒也方便,因为主机放置在一个角落里,并不能很方便的接触到主机开关,每次通电自动开机也好。不过关机和重启就没那么舒服了,需要ssh进去sudo poweroff或者sudo reboot。 于是我想到能不能用ATOM做一个外置的关机和重启按键。 嗯,有点大材小用(怎么个大材法?因为花了45块啊!我买的ATOM Lite,如果是Martrix大概两倍价钱),但是完全可以!

想法

+------+    USB    +-----+
| ATOM | ========= | NAS |
+------+           +-----+

将ATOM通过USB线连接到NAS上,NAS会识别ATOM为一个串口设备。

zzzz@nas:~$ ls /dev/ttyUSB*
/dev/ttyUSB0

然后ATOM内的MicroPython的repl是以115200波特率在串口上通信的。 那么我在NAS上写一段代码,同ATOM通信,就可以接受ATOM发出的命令了,然后相应做出重启或是关机的动作。

准备ATOM按键

MicroPython系统

首先把ATOM刷成UIFlow-v1.4.5系统,目前最新的系统。 不过我并不会使用UIFlow IDE,而只会用它基于的MicroPython。 当然用Arduino的方式+C语言也可以,不过还是python方便嘛(其实是Arduino的方式我不会)。

ATOM端的程序

boot.py

系统自带的boot.py内容比较复杂,在我们的应用里不需要了,可以在本地新建一个只有如下一行内容的boot.py,用mpfshell上传到ATOM里。

import main

main.py

同boot.py一样,main.py也需要改头换面。 main.py内是我们的主程序,编程思路如下:

  • while True循环,间隔0.05s
  • 检测串口输入,堵塞式,我不知道有没有不堵塞的方式,还望高人指点
  • 因为是堵塞检测串口输入,所以要求主机不断发送数据,这里我们检测主机发送字符"." (点)
  • 如果能检测到主机不断发送".",则LED闪烁蓝色(低亮度)
  • 检测按键是否一直按下
  • 持续按下1秒内,亮绿色
  • 持续按下1-3秒,亮黄色
  • 持续按下3-5秒,亮红色
  • 持续按下5-7秒,亮白色
  • 持续按下7-8秒,亮绿色
  • 持续按下8-10秒,亮黄色
  • 如此循环,直到松开按键
  • 松开按键时LED亮黄色的话,发送重启的信号,‘NAS.REBOOT’
  • 松开按键时LED亮红色的话,发送关机的信号,‘NAS.POWEROFF’

如下是代码

import time, sys
from m5stack import *

OFF         = 0x0
WHITE       = 0xffffff
RED         = 0xff0000
BLUE        = 0x0000ff
BLUE_L      = 0x00002F      # 蓝色,低亮度
YELLOW      = 0xffff00
GREEN       = 0x00ff00

REBOOT      = 1             # 标志常量
POWEROFF    = 2             # 标志常量

cnt_in      = 0             # NAS发送.字符的计数
led_flag    = True          # 是否点亮LED


while True:
    cnt     = 0             # 主循环循环次数
    state   = 0             # 标志变量
    
    in_key  = sys.stdin.read(1)     # 堵塞式读取1个字符

    if in_key == '.':
        cnt_in += 1

    if cnt_in > 6:
        led_flag = not led_flag     # LED亮灭切换
        cnt_in = 0

    if led_flag:
        rgb.setColorAll(BLUE_L)
    else:
        rgb.setColorAll(OFF)
    

    while btnA.isPressed():
        
        if  cnt > 70:       # 7秒
            cnt = 0
            state = 0
        elif cnt > 50:      # 5秒
            rgb.setColorAll(WHITE)
            state = 0
        elif cnt > 30:      # 3秒
            rgb.setColorAll(RED)
            state = POWEROFF
        elif cnt > 10:      # 1秒
            rgb.setColorAll(YELLOW)
            state = REBOOT
        else:
            rgb.setColorAll(GREEN)
            state = 0

        cnt = cnt + 1    
        time.sleep(0.1)
    

    if state == POWEROFF:
        print('NAS.POWEROFF')

    elif state == REBOOT:
        print('NAS.REBOOT')
        
    time.sleep(0.05)

NAS端的程序

NAS的环境

  • Debian 10
  • python 3.7.3

思路

  • 不断的发送".",间隔>=0.1s
  • 检测串口输入
  • 根据串口输入执行poweroff或者reboot

代码

在用户主目录下,建立文件nas-remote.py,并添加如下代码,作为NAS上接受ATOM指令的服务程序:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import serial
import os
import time

# 打开串口,先用ls /dev/tty* 确认一下串口名称对不对
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.1)

while True:

    ser.write(b'.')                       # 不断发送字符 .

    cmd = ser.readline()
    #print(len(cmd))

    if len(cmd)>=9:                       # 如果长度太短就不是有效指令
        if cmd[0:12]==b"NAS.POWEROFF":    # 检查头12个字符
            os.system("poweroff")
            time.sleep(180)               # 发送关机指令后停止180秒
            #print("poweroff")
        elif cmd[0:10]==b"NAS.REBOOT":    # 检查头10个字符
            os.system("reboot")
            time.sleep(180)               # 发送复位指令后停止180秒
            #print("reboot")

    time.sleep(0.1)

设置程序为开机自启动

在用户主目录下建立一个文件nas-remote,并把内容编辑为如下脚本

#!/bin/bash
### BEGIN INIT INFO
#
# Provides:  location_server
# Required-Start:   $local_fs  $remote_fs
# Required-Stop:    $local_fs  $remote_fs
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    initscript
# Description:  This file should be used to construct scripts to be placed in /etc/init.d.
#
### END INIT INFO
## Fill in name of program here.
PROG="nas-remote.py"
PROG_PATH="/home/zzzz/" ## Not need, but sometimes helpful (if $PROG resides in /opt for example).
PROG_ARGS=""
PID_PATH="/var/run/"
start() {
    if [ -e "$PID_PATH/$PROG.pid" ]; then
        ## Program is running, exit with error.
        echo "Error! $PROG is currently running!" 1>&2
        exit 1
    else
        ## Change from /dev/null to something like /var/log/$PROG if you want to save output.
        $PROG_PATH/$PROG $PROG_ARGS 2>&1 >/var/log/$PROG &
        pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | head -n 1`
        echo "$PROG started"
        echo $pid > "$PID_PATH/$PROG.pid"
    fi
}
stop() {
    echo "begin stop"
    if [ -e "$PID_PATH/$PROG.pid" ]; then
        ## Program is running, so stop it
    #pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | head -n 1`
    pid=`ps ax | grep -i 'nas-remote.py' | sed 's/^\([0-9]\{1,\}\).*/\1/g' | awk '{print $1}'`
    kill $pid
        
        rm -f  "$PID_PATH/$PROG.pid"
        echo "$PROG stopped"
    else
        ## Program is not running, exit with error.
        echo "Error! $PROG not started!" 1>&2
        exit 1
    fi
}
## Check to see if we are running as root first.
## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi
case "$1" in
    start)
        start
        exit 0
    ;;
    stop)
        stop
        exit 0
    ;;
    reload|restart|force-reload)
        stop
        start
        exit 0
    ;;
    **)
        echo "Usage: $0 {start|stop|reload}" 1>&2
        exit 1
    ;;
esac

然后执行如下命令

chmod +x /home/zzzz/nas-remote
sudo ln -s /home/zzzz/nas-remote /etc/init.d/nas-remote
sudo update-rc.d nas-remote defaults
sudo service nas-remote start

这样就把程序注册为service并启动了

几个关于服务的命令

停止服务

sudo service nas-remote stop

启动服务

sudo service nas-remote start

查看服务的信息

sudo systemctl status nas-remote.service

删除服务

sudo update-rc.d -f nas-remote remove

列出系统所有服务

sudo service --status-all

参考资料

http://www.mikewootc.com/wiki/linux/usage/ubuntu_service_usage.html
https://blog.csdn.net/littlefishzhang/article/details/8203183

我的邮箱: m a c r o a u ﹫﹫ f o x mail.com

你可能感兴趣的:(M5Stack/ESP32学习笔记(15)—— 入手M5Stack ATOM Lite)