【林一一】手把手教你使用微信小程序远程切换树莓派RGB七色灯(图文并茂超详细,小白也能学会😆)

前言:因为上学期选修了一门嵌入式开发的课程,老师要求利用树莓派设计一个课题。由于我会微信小程序所以脑洞大开便有了下面的这一篇 使用微信小程序来远程切换树莓派RGB七色光的文章 ps: 通信狗表示很累

开始

硬件部分:介绍树莓派

image
  • 1.1 树莓派是什么:树莓派 Raspberry Pi 是由英国树莓派基金会开发,基于Linux的单片机电脑又称口袋电脑。所以电脑能干嘛树莓派基本也可以做得到,到现在树莓派已经发行了4代我使用的是3代的3B+,足够我使用了

  • 1.2 树莓派配件和系统烧入可以看看 阮老师: 树莓派新手入门教程

  • 1.3 电子元件:因为我需要实现七色光的切换,需要的 RGB 电子器件需要先集成好的,直接网购就行

发七色光原理

通过控制树莓派 GPIO 可以来控制 RGB 彩色LED灯。LED灯有3个灯分别是红灯、绿灯和蓝灯。控制这三个灯分别发出不同强度的光,混合起来就能发出各种颜色的光了。

LED 和 树莓派 GPIO 引脚接线

LED灯上的4根引脚分别是GND,R,G,B。 GND需要接地。 R,G,B分别是红绿蓝灯的正极接口。我们把它们连接到树莓派的GPIO口上。LED灯上 R接到树莓派GPIO18,G连接树莓派GPIO15,B连接树莓派GPIO14。

引脚图如下

image

连接后的实物图

image

项目流程架构图

先来了解我们项目架构的流程图

image

服务器

因为要实现远程连接和控制树莓派,我们需要一个服务器。我使用的是线上的物联网云平台服务器 oneNet

  • 注册账号后进入点击控制台 -> 全部产品服务中选择多协议接入->选择HTTP协议->选择添加产品
image
  • 产品信息可以随意填写,例如
image
  • 点击创建好的产品进入到详细页面获取 Master-APIkey 和 access-key。
image
  • 点击进入到设备列表->添加设备
image
  • 点击进入到数据流模板->添加数据流,数据流名称随意比如'led_pi'。完成这些步骤我们的云平台接口就已经创建后了
image

代码部分

微信小程序端

const app = getApp()
const API_URL = 'https://api.heclouds.com/devices/655618681/datapoints' // 655618681 是设备号,换成你自己添加的设备号
const API_KEY =  'wkXV2upi=614H4U=HpeRiQ=OLU=' // 这里换成你自己申请的api_key
Page({
  data: {
    rgb: 'rgb(0,154,97)',//初始值
    pick: false
  },

postData: function(value) {
    var that=this;
    wx.request({
      url: API_URL,
      header:{
        'api-key': API_KEY
      },
      method:"POST",
      data:{
      "datastreams": [{
        "id": "led_pi",
        "datapoints": [{
          "at": "2020-03-13T19:20:43",
          "value": value
        },
        ]
      }]
      },
      success: function (res) {
        console.log(res.statusCode)
        if(res.statusCode==200)
          that.setData({ motto: "led on" })
        else
          that.setData({ motto: "404 not found" })
      }
    })    
},

// 切换红灯
clickRed: function(){
  this.postData('red')
},
// 切换绿灯
clickGreen: function(){
  this.postData('green')
},
clickWhite: function(){
  this.postData('white')
},
clickBlue: function() {
  this.postData('blue')
},
ClickOn:function() {
  this.postData('1')
},

ClickOff: function () {
    var that=this;
    this.setData({ motto: "wait..." })
    wx.request({
        url: `${API_URL}?type=3'`,
        header: {
        'api-key': API_KEY
        },
        method: "POST",
        data: {
        'led_pi': '0'
        },
        success: function (res) {
        if (res.statusCode == 200)
            that.setData({ motto: "led off" })
        else
            that.setData({ motto: "404 not found" })
        }
    })
},

ClickGet: function () {
    this.setData({ motto: "wait" })
    wx.request({
        url: `${API_URL}?datastream_id=led_pi`,
        header: {
        'api-key': API_KEY
        },
        method: "GET",
        success(res) {
        console.log(res.data)
        }
    })
},

// 显示取色器
toPick: function () {
    this.setData({
        pick: true
    })
},
//取色结果回调
pickColor(e) {
    let rgb = e.detail.color
    console.log(rgb)
    var a = rgb.split('rgb')
    // var b = a[1].split(')')
    console.log(a[1])
    // console.log(b)
    this.postData(a[1])
    }
})

小程序界面

image

小程序取色版组件从npm中下载

树莓派端脚本

树莓派的脚本文件使用的是python。我分成了两个 py 文件。一个切换七色的,一个切换五颜六色。PS 因为python是为了解决这个课题临时学的,代码写的烂各位大佬们轻喷 云平台的接口使用请查看文档。 在树莓派终端运行下面的 wxMain.py 文件 ./wxMain.py

# -*- coding: utf-8 -*-
from iot10086 import Iot10086
import time
import RPi.GPIO as GPIO

def sleep(mytime):
    time.sleep(mytime)
rpin = 18
gpin = 15
bpin = 14

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(rpin, GPIO.OUT)
GPIO.setup(gpin, GPIO.OUT)
GPIO.setup(bpin, GPIO.OUT)
pwmR = GPIO.PWM(rpin, 70)
pwmG = GPIO.PWM(gpin, 70)
pwmB = GPIO.PWM(bpin, 70)
pwmR.start(1)
pwmG.start(1)
pwmB.start(1)

apikey=''
apiurl=''

iot = Iot10086(apikey, apiurl)

# 定时刷新界面接收小程序端发送的数据
for x in range(10000):
    iot_post_status = iot.get_data('led_pi')
    colors = iot_post_status['data']
    print('colors',colors)
    value = iot_post_status['data']['current_value']
    boolen = (len(value) >= 7)
    if(value == '1' or value == 'white'):
       GPIO.output(rpin, GPIO.HIGH)
       GPIO.output(gpin, GPIO.HIGH)
       GPIO.output(bpin, GPIO.HIGH)
    elif value == '0':
        GPIO.output(rpin, GPIO.LOW)
        GPIO.output(gpin, GPIO.LOW)
        GPIO.output(bpin, GPIO.LOW)
    elif value == 'red':
        GPIO.output(rpin, GPIO.HIGH)
        GPIO.output(gpin, GPIO.LOW)
        GPIO.output(bpin, GPIO.LOW)
    elif value == 'green':
        GPIO.output(gpin, GPIO.HIGH)
        GPIO.output(rpin, GPIO.LOW)
        GPIO.output(bpin, GPIO.LOW)
    elif value == 'blue':
        GPIO.output(bpin, GPIO.HIGH)
        GPIO.output(rpin, GPIO.LOW)
        GPIO.output(gpin, GPIO.LOW)
    elif boolen:
        RGB = value.split('(')[1].split(')')[0].split(',')
        r = int(RGB[0])/2.55001
        g = int(RGB[1])/2.55001
        b = int(RGB[2])/2.55001
        print('RGB', RGB)
        pwmR.ChangeDutyCycle(r)
        pwmG.ChangeDutyCycle(g)
        pwmB.ChangeDutyCycle(b)
        # 调整红绿蓝LED的各个颜色的亮度组合出各种颜色
pwmR.stop()
pwmG.stop()
pwmB.stop()
GPIO.cleanup()
  • 导入云平台提供的接入类 iot10086.py。
import requests
import json
class Iot10086(object):
    apikey='wkXV2upi=614H4U=HpeRiQ=OLeU='
    apiurl='http://api.heclouds.com/devices/65561868/datastreams/'

    def __init__(self, apikey, apiurl):
        self.apikey = apikey
        self.apiurl = apiurl
        self.apiheaders={'api-key':apikey}

    def set_data(self,datastream,value):
        apiurl_set = self.apiurl + '?type=3'
        payload={datastream:str(value)}
        r=requests.post(apiurl_set, headers=self.apiheaders, data=json.dumps(payload), timeout=30)
        return r.status_code

    def get_data(self,datastream):
        apiurl_get = self.apiurl + datastream
        r=requests.get(apiurl_get, headers=self.apiheaders, timeout=20)
        if r.status_code == 200:
            return json.loads(r.text)
        else:
            return r.status_code

实现效果

2.gif
1.gif

PS:由于当时在学校没有录制到按钮的操作视频,这里就不展示了

参考文献

微信小程序通过wifi和蓝牙控制树莓派

推荐掘金阅读体验更加好

掘金地址

结束

感谢遇见,我是林一一,下次见。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容