(原) 程小奔复活记

原创文章,请后转载,并注明出处。

程小奔是2019年购买的,本着不浪费和废物再利用的观念,花了点时间把它“复活”一下。

这里是用于显示网站的访问数显示。下方的小点是用于显示一个时间状态,不会每次都直接访问地址。

PS: 看起来它并不支持https,而只能用http


第一张图是总访问量,因为显示倍数有限,所有只取前四位。

第二张图是显示当日访问量。

功能之间使用摇晃小程来切换。当有新浏览量(粗糙的比较)时,小程会“耶”的“惨叫”。比如你刷新本页面时,它将“耶”的一声提醒我。


用不怕它口干,因为想把它带出家门,甚至给它加了充电宝。

代码不多,60行左右,用python。未整理。

import codey,time,rocky,random
import urequests as requests
import json

Run = 0
Number = 0
cmd = ""
info = ""
old_info = ""
# 连网
codey.wifi.start('CMCC-abc', 'abcabcabc')

while True:
    codey.speaker.volume = codey.potentiometer.get_value()      # 调节声音

    # 网络联通
    if codey.wifi.is_connected() and Run==0:
        codey.speaker.play_melody("hello")
        Run = 2       # 自动开始显示博客数量统计

    # 按A键
    if codey.button_a.is_pressed():
        Run = 2
        Number = 0
        codey.speaker.play_melody("start")
    # 按B键结束
    if codey.button_b.is_pressed():
        Run = 1
        Number = 0
        codey.speaker.play_melody("bye")
        codey.display.clear()

    # 摇晃改变功能
    if codey.motion_sensor.is_shaked():
        codey.speaker.play_melody("score")
        Run = Run+1
        if Run>3:
            Run = 1
        time.sleep(1)

    # 主程序部份
    if Run==2 or Run==3:
        if Number<=1:
           res = requests.get(url='http://scwy.net/counter?host=https://i.scwy.net')
           cmd = json.loads(res.text)
           old_info = info 
           if Run==2:   # 显示总访问数
                info = str(cmd['views']//10)  # 显示不了太多位数
           if Run==3:   # 显示当天访问数
                info = "D" + str(cmd['today'])
           if old_info!=info:           # 有新的数据时,有声音反馈
               codey.speaker.play_melody("yeah")
        Number=Number+1
        if Number>15:
            Number=0
        codey.display.show(info)
        codey.display.set_pixel(Number, 7, True)
    else:
        codey.led.show(0, 0, 0)
        time.sleep(1)
        if random.randint(1, 10)>7:
            codey.led.show(255, 0, 0)
        

顺便附上Python相关语句

小程

led — 板载全彩LED灯

led.show(r,g,b) 设置并显示RGB LED灯的颜色
r g b 参数范围是 0 ~ 255

led.set_red(val) 设置 RGB LED灯的红色色值
led.set_green(val)
led.set_blue(val)

led.off() 熄灭LED灯

import codey
import time

codey.led.show(255,255,255)
time.sleep(2)
codey.led.off()

display — 表情面板

display.show_image(image, pos_x = 0, pos_y = 0, time_s = None) 以图片参数的方式显示自定义的点阵图形
image 字符串数据,点阵的每一列有8个显示点,为1 byte的数据,转换为16进制的字符串, 因此16列点阵,需要用 32 个字符串数据来表示。
pos_x 显示图形在表情面板上x轴的偏移量,参数范围是 -15 ~ 15,如果不设置该参数,默认从 0位置开始。 pos_y 显示图形在表情面板上y轴的偏移量,参数范围是 -7 ~ 7,如果不设置该参数,默认从 0位置开始。
time_s 显示暂留的时间(以秒为单位),如果没有设置该参数,在有清屏或者重新设置表情面板操作之前,维持显示不变。

display.show(var, pos_x = 0, pos_y = 0, wait = True) 以全类型的数据参数方式显示数据
var 全类型, 其中数值型和时间类型的显示会做特殊处理,时间格式显示需满足: [x]x:[x]x 格式 (正则表达式 \d?\d:\d\d?)。
pos_x 显示数据在表情面板上x轴的偏移量,参数范围是 -15 ~ 15,如果不设置该参数,默认从 0位置开始。
pos_y 显示数据在表情面板上y轴的偏移量,参数范围是 -7 ~ 7,如果不设置该参数,默认从 0位置开始。
wait 设置是否阻塞显示,其中 True:表示阻塞直到显示完毕, False:表示显示但不阻塞。

display.set_pixel(pos_x, pos_y, status) 设置表情面板单个像素点的亮灭状态
pos_x 像素点在表情面板上x轴的坐标,参数范围是 0 ~ 15。
pos_y 像素点在表情面板上y轴的坐标,参数范围是 0 ~ 7。
status 布尔值,其中 True:表示像素点亮, False:表示像素熄灭。

display.get_pixel(pos_x, pos_y) 获得表情面板上单个像素点当前的亮灭状态,返回值是布尔值,其中 True:表示像素点亮, False:表示像素熄灭,参数:

display.toggle_pixel(pos_x, pos_y) 切换表情面板上单个像素点当前的亮灭状态

display.clear() 熄灭表情面板上全部的灯

speaker — 板载扬声器

speaker.stop_sounds() 停止所有声音。
speaker.play_melody(file_name) 播放音频文件
file_name 字符串类型,烧录在程小奔flash中的wav格式的音频文件名,输入时,也可省略格式的后缀 .wav。
hello.wav : hello(哈喽)
hi.wav : hi(嗨)
bye.wav : bye(拜)
yeah.wav : yeah(耶)
wow.wav : wow(哇哦)
laugh.wav : laugh(笑声)
hum.wav : hum(哼唱)
sad.wav : sad(难过)
sigh.wav : sigh(叹气)
annoyed.wav : annoyed(哼)
angry.wav : angry(生气)
surprised.wav : scared(惊吓)
yummy.wav : pettish(撒娇)
curious.wav : curious(好奇)
embarrassed.wav : embarrassed(尴尬)
ready.wav : ready(准备)
sprint.wav : sprint(冲刺)
sleepy.wav : snore(打呼)
meow.wav : meow(喵)
start.wav : start(启动)
switch.wav : switch(开关)
beeps.wav : beeps(哔哔)
buzzing.wav : buzz(蜂鸣)
exhaust.wav : air-out(排气)
explosion.wav : explosion(爆炸)
gotcha.wav : gotcha(获取)
hurt.wav : painful(痛苦)
jump.wav : jump(跳动)
laser.wav : laser(激光)
level up.wav : level-up(升级)
low energy.wav : low-energy(低能量)
metal clash.wav : metal-clash(金属音)
prompt tone.wav : prompt-tone(提示)
right.wav : right(正确)
wrong.wav : wrong(错误)
ring.wav : ringtone(铃声)
score.wav : score(得分)
shot.wav : shot(发射)
step_1.wav : step_1(脚步声1)
step_2.wav : step_2(脚步声2)
wake.wav : activate(激活)
warning.wav : warning(警告)

speaker.play_melody_until_done(file_name) 播放音频文件直到停止,该函数会阻塞播放

speaker.play_note(note_num, beat = None) 播放音符
beat 数值数据,表示节拍数
音符与频率的对应关系如下:
[‘C2’,‘65’], [‘D2’,‘73’], [‘E2’,‘82’], [‘F2’,‘87’],
[‘G2’,‘98’], [‘A2’,‘110’], [‘B2’,‘123’], [‘C3’,‘131’],
[‘D3’,‘147’], [‘E3’,‘165’], [‘F3’,‘175’], [‘G3’,‘196’],
[‘A3’,‘220’], [‘B3’,‘247’], [‘C4’,‘262’], [‘D4’,‘294’],
[‘E4’,‘330’], [‘F4’,‘349’], [‘G4’,‘392’], [‘A4’,‘440’],
[‘B4’,‘494’], [‘C5’,‘523’], [‘D5’,‘587’], [‘E5’,‘659’], [‘F5’,‘698’], [‘G5’,‘784’], [‘A5’,‘880’], [‘B5’,‘988’],
[‘C6’,‘1047’], [‘D6’,‘1175’], [‘E6’,‘1319’], [‘F6’,‘1397’],
[‘G6’,‘1568’], [‘A6’,‘1760’], [‘B6’,‘1976’], [‘C7’,‘2093’],
[‘D7’,‘2349’], [‘E7’,‘2637’], [‘F7’,‘2794’], [‘G7’,‘3136’],
[‘A7’,‘3520’], [‘B7’,‘3951’], [‘C8’,‘4186’], [‘D8’,‘4699’],

speaker.play_tone(frequency, time = None) 播放设定频率的声音
frequency 数值数据,播放声音的频率,其数值范围是 0 ~ 5000。
time 数值数据,表示播放时间(单位是 毫秒-ms ),其数值范围是 0 ~ 数值范围极限

speaker.rest(number) 停止节拍

常量

speaker.volume 数值数据,音量的大小的属性值,可以修改或者读取这个值。修改这个数值,可以控制音量的大小。其数值范围是 0 ~ 100。
speaker.tempo 数值数据,表示播放速度的属性,单位是 bmp (beat per minute),即每一个节拍的长度。 其数值范围是 6 ~ 600。 默认数值是60,即一个节拍的维持时间是1秒。 rest 和 play_note 函数的节拍会受该常量影响。

sound_sensor — 板载音量传感器

sound_sensor.get_loudness() 获得音量传感器检测的声音强度, 返回值是音量的大小。 数值范围 0 ~ 100

light_sensor — 板载光线传感器

light_sensor.get_value() 获得光线传感器检测的光线强度, 返回值是可见光的强度值。 数值范围 0 ~ 100。

potentiometer — 板载电位器旋钮

potentiometer.get_value() 获得电位器旋钮的当前数值。 数值范围 0 ~ 100。

button_a — 板载按键ABC

button_a.is_pressed() 获取按键A当前状态。
button_b.is_pressed()
button_c.is_pressed()

motion_sensor — 板载姿态传感器

x轴:Pitch 前后旋转 -180° ~ 180°
y轴:Roll 左右旋转 -90° ~ 90°
z轴:顺/逆针旋转

motion_sensor.get_roll() 获取姿态角的翻滚角 motion_sensor.get_pitch() 获取姿态角的俯仰角
motion_sensor.get_yaw() 获取姿态角的偏航角,返回的数据范围是 0 ~ 360
motion_sensor.get_rotation(axis) 获得小程在三个轴上转动的角度,以逆时针转动方向为正方向
motion_sensor.reset_rotation(axis = “all”) 初始化绕三个轴转动的当前角度为0
motion_sensor.is_shaked() 检测小程是否有被摇晃
motion_sensor.get_shake_strength() 如果小程被摇晃了,这个函数可以获得摇晃的强度,返回值的数值范围是 0 ~ 100
motion_sensor.is_tilted_left() 检测小程是否向左倾斜
motion_sensor.is_tilted_right() 检测小程是否向右倾斜
motion_sensor.is_ears_up() 检测小程是否耳朵向上
motion_sensor.is_ears_down() 检测小程是否耳朵向下
motion_sensor.is_display_up() 检测小程是否表情面板朝上
motion_sensor.is_display_down() 检测小程是否表情面板朝下
motion_sensor.is_upright() 检测小程是否直立
motion_sensor.get_acceleration(axis) 获取三个轴的加速度值,单位是 m/s^2
motion_sensor.get_gyroscope(axis) 获取三个轴的角速度值,单位是 °/秒

ir — 板载红外收发

ir.receive() 返回红外收到的字符串信息,所以发送端发送的数据必须以 \n 结束。如果是接收 NEC编码协议的遥控器指令,请使用另外一个函数 receive_remote_code()。
ir.receive_remote_code() 获取红外遥控器数据,红外遥控器数据包含地址和内容两部分,因此返回一个长度为2的list数据。 前面一个参数是地址码,后面一个参数是数据码。
ir.send(str) 发送红外字符串
ir.start_learning() 开始红外学习,仅支持学习标准NEC协议的遥控器指令
ir.stop_learning() 停止红外学习
ir.save_learned_result(index) 将学习的红外编码结果保存到相应区域
index 数值范围是 0 ~ 15,一共有16个存储区域。
ir.send_learned_result(index = 1) 发送红外学习保存下来的红外编码, 默认发送 index = 1的区域的学习结果
ir.learn(time = 3) 红外学习 time 秒,在调用该API后会保存 time 秒内学到的红外信息。 默认会保留到index = 1的区域

wifi — 板载Wi-Fi

wifi.start(ssid = “wifi_ssid”, password = “password”, mode = codey.wifi.STA) 启动wifi连接,该API不阻塞,API退出不代表Wi-Fi已连接上,需要调用 wifi.is_connected() 判断
wifi.is_connected() 检测wifi是否已连接上

常量

wifi.STA Wi-Fi的站点模式,即无线网卡模式,该模式下,Wi-Fi可以连接到路由器。
wifi.AP Wi-Fi的无线接入点模式,一般的无线路由/网桥工作在该模式,该模式下,Wi-Fi可以允许其它无线设备接入。
wifi.APSTA Wi-Fi的AP和STA模式共存。

battery — 内置锂电池

battery.get_voltage() 获取当前的电池电压,返回值是一个浮点数据。单位是 V
battery.get_percentage() 获取剩余电池电量的百分比,返回值是一个整数,数据范围是 0 ~ 100

codey_timer — 计数器

codey.get_timer() 获取计时器当前值(计时器从用户脚本启动时开始运行),返回值是一个浮点数据,单位是 秒。
codey.reset_timer() 初始化计时器的值

codey_broadcast — 广播模块

codey.broadcast(str) 可以向串口,蓝牙以及自身的事件监听单元发送一个广播

import codey
import event

@event.button_a_pressed
def button_a_cb():
    print("button a event succeeded")
    codey.broadcast("hello")

@event.received("hello")
def received_cb():
    print("received message: hello")

codey_external_module_detect — 模块接入检测

codey.has_neuron_connected() 检测是否有任何神经元模块接入小程(包括小奔的接入)
codey.is_rocky_connected() 检测小奔是否接入小程

codey_script_control — 脚本/线程控制

codey.stop_this_script() 停止当前脚本
codey.stop_other_scripts() 停止其他脚本。
codey.stop_this_script() 停止所有脚本。

import codey
import time
import event

@event.start
def start_cb():
    while True:
        print("start cb executing...")
        time.sleep(1)
        print("stop this script")
        codey.stop_this_script()

@event.button_a_pressed
def button_a_cb():
    codey.stop_other_scripts()
    while True:
        print("button a event")

@event.button_b_pressed
def button_b_cb():
    codey.stop_other_scripts()
    while True:
        print("button b event")

@event.button_c_pressed
def button_c_cb():
    codey.stop_all_scripts()

小奔

rocky.stop() 停止运动

rocky.forward(speed, t=None, straight=False) 向前运动
speed 速度 -100 ~ 100 负数代表后退
t 运动所用时间,单位秒。如果不设置,在没有停止运动或新指令前,维持前进状态
straight 是否使用陀螺仪进行方向校正

rocky.backward(speed, t=None, straigh=False) 向后运动

rocky.turn_left(speed, t=None) 向左转
rocky.turn_right(speed, t=None) 向右转

rock.drive(left_power, right_power) 电机按照设定的数值转动
left_power 左轮电机运动速度 -100 ~ 100
right_power 右轮电机运动速度 -100 ~ 100

rocky.turn_right_by_degree(angle, speed=40) 按照设定角度右转
angle 转动角度,负数代表左转
speed 转弯速度 0 ~ 100
rocky.turn_left_by_degree(angle, speed=40) 按照设定角度左转

color_ir_sensor.get_red() 获取颜色传感器的红色色值分量 0 ~ 100
color_ir_sensor.get_green()
color_ir_sensor.get_blue()

color_ir_sensor.is_color(color_str) 判断是否检测到匹配的颜色
color_str: red.green.blue.yellow.cyan.purple.white.black

color_ir_sensor.get_light_strength() 获取可见光传感器检测到的环境光强度 0 ~ 100
color_ir_sensor.get_greyness() 获取可见光传感器的检测到的灰度值(使用RGB和可见光传感器) 0 ~ 100
color_ir_sensor.get_reflected_light() 获取可见光传感器的检测到的可见光反射强度(使用白灯和可见光传感器) 0 ~ 100
color_ir_sensor.get_reflected_infrared() 获取红外光接收管检测到的红外光反射强度

color_ir_sensor.is_obstacle_ahead() 前方是否有障碍物

color_ir_sensor.set_led_color(color_name) 设置颜色传感器中 RGB LED灯的颜色
color_name: red、green、blue、yellow、cyan、purple、white、black

第三方库

urequests 网络请求模块

urequests.request(method, url, data=None, json=None, headers={}) 发送网络请求, 它会阻塞返回网络的响应数据
method 建立网络请求的方法,例如 HEAD,GET,POST,PUT,PATCH, DELETE
data 在请求正文中发送的字典或元组列表
json 在请求正文中发送的json数据
headers 与请求一起发送的HTTP标头字典

urequests.head(url, **kw) 发送一个 HEAD 请求,返回类型是 request 的响应
urequests.get(url, **kw) 发送一个 GET 请求
urequests.post(url, **kw) 发送一个 POST 请求
urequests.put(url, **kw) 发送一个 PUT 请求
urequests.patch(url, **kw) 发送一个 PATCH 请求
urequests.delete(url, **kw) 发送一个 DELETE 请求

mqtt 消息队列遥测传输

class mqtt.MQTTClient(client_id, server, port=0, user=None, password=None, keepalive=0, ssl=False, ssl_params={})

connect(clean_session=True) 将客户端连接到服务器。 这是一个阻塞函数
reconnect() 重新连接到服务器
disconnect() 与服务器断开连接
ping() 测试客户端与服务器的连通性
set_last_will(topic, msg, retain=False, qos=0) 设置要发送给服务器的遗嘱
publish(topic, msg, retain=False, qos=0) 从客户端向代理发送消息,然后从代理发送到订阅匹配主题的任何客户端
subscribe(topic, qos=0) 订阅服务的某个主题
set_callback(f) 设置主题订阅的回调函数
wait_msg() 等待服务器直到服务器无待处理消息。该函数是阻塞函数
check_msg() 检查服务器是否有待处理消息

其它

import random
random.randint(1, 10) 随机整数

@event.button_a_pressed
def on_button_a_pressed():
    codey.display.show(random.randint(1, 10), wait = False)

相关文章