WiFi灯带-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6712|回复: 5

[项目] WiFi灯带

[复制链接]
发表于 2017-10-15 13:50 | 显示全部楼层 |阅读模式
WiFi灯带:

项目简介:
       利用的是现在的可编程LED灯带,然后配合家里的路由就可以实现远程控制和一些Demo展示。

整体的流程如下:
QQ图片20171029133442.png
功能说明:
1、ESP8266
(1)搭载micropython,驱动wifi灯带
(2)创建socket服务端,接收web发送消息
2、WRTnode
(1)搭建web环境,提供用户交互web页面
(2)根据用户的交互信息,按钮,连接ESP8266发送控制消息

效果视频:
地址:http://v.youku.com/v_show/id_XMz ... 0.3416059.1#paction


详细源码:
WiFi灯带源码.rar (2.21 KB, 下载次数: 48)

=======华丽丽的分割线:下面是详细的制作流程=========

       ok,稍微记录下整个的流程哈,看到大家今年的作品,发现自己做的有点low哈!
       但是大家也都是在交流哈,那也就厚着脸皮上了!
       这个项目也是希望大家如果有兴趣的,也是可以自己一步一步跟着我做的,我希望把所有的步骤都描述清楚,然后就可以自己完成啦!

       申请了奥松机器人的WiFi Module,是可以应用的,但是有个不好的地方,这个模块没有把WiFi芯片的引脚全部引出来,所以连线有点不太方便,刚好国庆回了趟家,发现家里有一块Node MCU,刚好这个模块是有把引脚全部引出来的,哈哈,完美,这样就比较方便连线了。

       那么针对WiFi芯片,ESP8266这是一个非常出名的WiFi芯片,用的也很多,包括现在最新的ESP32,在推出的时候也是广受关注。

       出厂的8266是支持串口操作的,这个我们在官方的文档都可以找到对应的说明,但是串口的指令操作相对是比较麻烦的,我们需要一种更加方便简洁的方式来操作WiFi芯片,这个时候我们的主角软件上场了!

Micropython!!!

       相信大家如果有关注机器学习的,对于Python肯定不陌生了,在机器学习领域,python的应用是比较多的,当然其他方面也有很多,包括网页爬虫等等。也正是由于在机器学习的兴起,让python的关注度变得更加活跃,现在应该是前五的语言了。

       so!我们就来将python这个语言应用到8266中!

       神奇吧,这居然是可行的,要感谢Damien George这位大神哈!是micropython项目的创始人!剑桥大学!

       那么我们应该怎么把出厂的8266变成支持micropython的呢?

       我们需要给芯片刷固件,这听起来很熟悉吧,刷固件,可以理解为刷系统,其实是相同的,比如说电脑,那么win7就是它的系统,它的固件。道理都是一样的。
       固件的下载地址:http://www.micropython.org/download
       然后找到对应的8266模块,这里要注意,因为8266板子上的空间有的是512K,有的是4M,要选择对,我们这里选择4M的。
QQ图片20171015112524.png

       然后我们需要一个小工具。来升级该固件!
       首先我们需要说明一点,8266有两个模式,一个是刷固件模式,一个是运行模式。这个和很多东西也是相同的,比如说安卓手机,平常使用的时候我们都是属于运行模式,(当然手机自己升级系统不算),比如我们自己要升级手机的系统,我们可能需要进入Recovery模式,那这个模式就是属于刷固件模式。
       工具上场啦!NodeMcu Flasher,为什么选择这个工具呢,因为比较简单,容易使用,当然使用官方的工具也是可以的啦!~

       好,然后需要让芯片进入刷固件的模式,对于奥松机器人模块上面有一个开关,一边标着RUN,另外一边标着什么来着我的板子看不清楚了,就是选择到RUN的另外一侧,对于NodeMCU的话就是按住上面的FLASH按键,然后接上电脑,可以看到连接串口!(这里需要注意,电脑需要安装对应串口的驱动哦,不然电脑识别不到,这部分需要补充)
QQ图片20171015114654.png

       然后我们选择到Config标签,选择下图的设置按钮,选择到我们刚刚下载到固件文件(.bin文件)
QQ图片20171015114514.png

       然后就可以开始刷机了,哈哈!选回到Operation标签,点击Flash,可以看到MAC地址可以生成了,进度条开始走啦!
QQ图片20171015114955.png

       等到进度条走完就ok啦,完美!

       然后我们需要另外一个工具:Xshell或者是SecureCRT,建议选择其中之一哈,其他的工具我不是很清楚哈。
       这里用SecureCRT来说明哈,Xshell也是类似的.

       打开之后选择这File下面的Quick Connect
QQ图片20171015124957.png

       然后把SSH修改为Serial
QQ图片20171015125123.png

       然后设置方框中的两个信息,这里的Com口要选择为8266连接到电脑上的端口哦!波特率为115200,最后选择Connect!
QQ图片20171015125212.png

       哈!看到没有,我们进入Python的console界面啦!(8266的固件目前有点BUG,如果没看到需要复位下,或者重新上电一下)
QQ图片20171015120952.png

       到这里我们就可以做一些有趣的事情啦!

      好了,我们写几个测试的Demo吧!

      demo的代码如下:
[mw_shl_code=python,true]def neopixel_init(pin_num, num):
        import machine
        import neopixel
        global pin
        global np
        pin = machine.Pin(pin_num, machine.Pin.OUT)
        np = neopixel.NeoPixel(pin, num)

# demo(16, 0.05) make perfect
def demo1(num, tim, red, green, blue):
        import time
        for i in range(num):
                np = (red, green, blue)               
                np.write()
                time.sleep(tim)
        for i in range(num):
                np[num - i - 1] = (0, 0, 0)
                np.write()
                time.sleep(tim)

def demo2(num , tim):
        demo1(num, tim, 255, 0, 0)
        demo1(num, tim, 0, 255, 0)
        demo1(num, tim, 0, 0, 255)
        demo1(num, tim, 255, 255, 0)
        demo1(num, tim, 0, 255, 255)
        demo1(num, tim, 255, 0, 255)
        demo1(num, tim, 255, 255, 255)

def demo3(num ,tim, red, green, blue):
        import time
        for i in range(num):
                if i%2 == 0:
                        np = (red, green, blue)
                np.write()
                time.sleep(tim)
        for i in range(num):
                if i%2 == 0:
                        np = (0, 0, 0)
                else:
                        np = (red, green, blue)
                np.write()
                time.sleep(tim)

def demo4(num , tim):
        import time
        demo3(num, tim, 255, 0, 0)
        demo3(num, tim, 0, 255, 0)
        demo3(num, tim, 0, 0, 255)
        demo3(num, tim, 255, 255, 0)
        demo3(num, tim, 0, 255, 255)
        demo3(num, tim, 255, 0, 255)
        demo3(num, tim, 255, 255, 255)
        for i in range(num):
                if i%2 != 0:
                        np = (0, 0, 0)
                np.write()
                time.sleep(tim)

def demo5(num ,tim):
        import time
        for i in range(255):
                if i % 4 == 0:
                        np.fill((i, i, i))
                np.write()
                time.sleep_us(tim)
        for i in range(255):
                if i % 4 == 0:
                        np.fill((255 - i, 255 - i, 255 - i))
                np.write()
                time.sleep_us(tim)

def demo6(np):
        import time
        n = np.n # the number of neopixel

    # cycle
        for i in range(4 * n):
                for j in range(n):
                        np[j] = (0, 0, 0)
                np[i % n] = (255, 255, 255)
                np.write()
                time.sleep_ms(25)

        # bounce
        for i in range(4 * n):
                for j in range(n):
                        np[j] = (0, 0, 128)
                if (i // n) % 2 == 0:
                        np[i % n] = (0, 0, 0)
                else:
                        np[n - 1 - (i % n)] = (0, 0, 0)
                np.write()
                time.sleep_ms(60)

        # fade in/out
        for i in range(0, 4 * 256, 8):
                for j in range(n):
                        if (i // 256) % 2 == 0:
                                val = i & 0xff
                        else:
                                val = 255 - (i & 0xff)
                        np[j] = (val, 0, 0)
                np.write()

        # clear
        for i in range(n):
                np = (0, 0, 0)
        np.write()


[/mw_shl_code]


       接下来看下服务器的使用吧!
       这里我们选择Python和wrtnode来实现哈!
       wrtnode需要使用ssh连接上去,进行Linux上面的一些操作,这些内容需要学习下哈!

       首先需要在wrtnode上面安装python:
       wrtnod使用的操作系统是openwrt,简单介绍一下,就是一个小型的Linux系统,Linux就是在服务器上用的非常多,和windows、mac os三个现在算是三大操作系统,但是Linux比较不一样,它是开源的,在基于Linux最核心的东西:内核外有很多不同的衍生系统(不同的发行版),可以简单为本质是一样的,就是换了一件衣服,各自有各自的特点。

       在openwrt上面的安装命令是opkg,相对的举个例子在ubuntu上面是apt-get:
       安装命令:
[mw_shl_code=bash,true]opkg install python[/mw_shl_code]

       完成之后我们键入python就可以进入python的交互界面了,这个和我们之前在esp8266上面是一样的。(基本一样,不是完全一样哈)

       下面我们需要在wrtnode安装一个基于python的web服务器,因为我们需要提供出一个web界面用于和用户交互,我们选择了一个小型的web服务器web.py:
       安装的方式有两种,一个是下载源码,使用python setup.py进行安装,一个是直接使用pip安装,这里我们使用第一种方法:
       下载源码命令:
[mw_shl_code=bash,true]wget http://webpy.org/static/web.py-0.38.tar.gz[/mw_shl_code]
       解压命令:
[mw_shl_code=bash,true]tar zxvf web.py-0.38.tar.gz[/mw_shl_code]
       进入解压文件夹:
[mw_shl_code=bash,true]cd web.py-0.38/[/mw_shl_code]
       执行安装命令:
[mw_shl_code=bash,true]python setup.py install[/mw_shl_code]
       等待执行完成之后我们就完成了安装工作:

       选择的WEB服务器是很小型的,这个对于学习上是比较好理解的,大型的服务器由于在底层上面实现了很多内容,上层的使用基本是属于封装过的内容,对于学习上来讲也是可以,但是对于原理理解比较不那么容易,所以大家可以使用最基本的socket实现一个最小型的web服务器,就知道web服务器最基本的构成是什么,现有的服务器框架都是基于这样最小型的web实现方式进行的扩展和延伸。

       关于选择的这个web服务器的教程在这:
http://webpy.org/docs/0.3/tutorial#templating

       下面我们写一个最简单的Demo测试一下吧:

       执行命令:
[mw_shl_code=bash,true]python code.py[/mw_shl_code]
       然后会有提示:
http://0.0.0.0:8080/
       这个是什么意思呢?
       前面一个是IP地址,后面是一个端口号,端口号怎么理解,及时说在网络中,对应一台PC中有很多的应用程序,那么我们都是通过一个IP来传输数据,那么如何标识这个数据是要发给哪一个程序呢,我们在这里就是通过端口号来进行区分,比如说web服务器一般默认是80,但是这里我们是8080,这只是测试,在正式的web服务中一般都是80端口,当然还有其他的,比如说我们连接到wrtnode使用的ssh,默认的端口就是22.

       这里我的ip是192.168.1.102,对应访问得到的结果如下:
QQ图片20171028213137.png
       OK!
       到这里我们的Demo测试完成,接下来就是正事了!(写代码。。。)

       简单的思想就是8266创建一个服务端,然后web连接服务端发送消息,8266根据不同的消息执行不同的命令:
       这两个的代码如下:

       8266服务端:
[mw_shl_code=python,true]import socket
addr = socket.getaddrinfo('0.0.0.0', 8009)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)
neopixel_init(14, 16)
print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    data = cl.recv(100)
    print(data)
    if data==b'on':
        on()
    elif data==b'off':
        off()
    elif data==b'demo1':
        demo1(16, 0.05)
    elif data==b'demo2':
        demo2(16, 0.02)
    elif data==b'demo3':
        demo3(np)
    cl.close()
s.close()
[/mw_shl_code]
       web客户端:
[mw_shl_code=bash,true]def send(cmd):
    import socket
    s = socket.socket()

    addr = socket.getaddrinfo('192.168.1.101', 8009)
    s.connect(addr[0][4])
    s.send(cmd)[/mw_shl_code]


发表于 2017-10-17 18:02 | 显示全部楼层
做一些有趣的事情
 楼主| 发表于 2017-10-21 15:05 | 显示全部楼层
myra07 发表于 2017-10-17 18:02
做一些有趣的事情

是啊,有趣新鲜,和大家一起分享就好哈
发表于 2017-10-29 22:12 | 显示全部楼层
1.感谢对社区比赛的支持,开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
2.比赛结果会在11.15号前公布,请耐心等待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:52 , Processed in 0.112042 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表