项目介绍
NFC技术(Near Field Communication,近场通讯技术)已经悄然走入我们的日常生活。你或许没有听说过它,但你一定用过它。你是否在便利店尝试过手机感应支付?在地铁站用手机刷NFC公交卡进站?这些方便又快捷的操作,全靠的就是NFC技术。它让设备可以在极短距离内安全、快速地传输数据,通常距离不超过几厘米。
NFC不仅被广泛应用于支付和门禁系统,还在智能家居和智能设备控制中扮演重要角色。今天,我们将探索如何利用NFC技术,结合行空板和LED灯环,打造一款简单创新的互动装置。通过简单的手机动作扫描NFC标签,就能实时控制灯光颜色。这个项目不仅展示了硬件与软件的完美结合,更是对移动NFC交互和彩色LED显示的新颖应用。
硬件清单
· 行空板
· 12位RGB灯环
· PH2.0母母头3 Pin连接线
制作过程
1 硬件连接通电
连接: 使用3pin连接线将LED环连接到行空板端口(P24端口)
加电: 使用USB线将行空板连接到电源。一旦通电,板子会自动识别连接的LED环
2 创建本地项目和Python脚本
在您的本地设备上创建一个名<NeoPixelAPI>的新项目目录。在新目录<NeoPixelAPI>中创建名为<main.py>的Python文件。
示例代码如下
from pinpong.board import Board, Pin, NeoPixel
from flask import Flask, jsonify
COLORS: dict = {
'red': (255, 0, 0),
'green': (0, 255, 0),
'blue': (0, 0, 255),
'black': (0, 0, 0),
'white': (255, 255, 255)
}
app = Flask(__name__)
@app.route(rule='/api/colors', methods=['GET'])
def get_available_colors():
"""
This method is an API route that returns the available colors. The values are from the COLORS dictionary.
:return: A JSON object containing the status and the available colors.
"""
return jsonify({'status': 'success',
'message': COLORS}), 200
@app.route(rule='/api/<string:color>', methods=['GET'])
def set_color(color):
"""
This method is an API route that sets the color of an LED strip. It takes in a color parameter as a string and
returns a JSON response indicating the status and message. The color parameter is used to set the color of each
LED in the strip. It is expected to be a valid color value that matches one of the predefined colors in the COLORS
dictionary. If the provided color is valid, the method iterates through each LED in the strip and sets the color to
the corresponding value from the COLORS dictionary.
The method returns a success response with a status code of 200 and a message indicating the color that was set if
the provided color is valid. If the provided color is not valid, the method returns an error response with a
status code of 400 and a message indicating that the color is not valid.
:param color: The color value to set for the LED strip.
:return: Response indicating the status and message.
"""
global led
api_color = str(color.lower())
if api_color in COLORS:
for pixel in range(led.num):
led[pixel] = COLORS[api_color]
return jsonify({'status': 'success',
'message': f"{color} is valid."}), 200
else:
return jsonify({'status': 'error',
'message': f"{color} is not valid."}), 400
if __name__ == '__main__':
Board().begin()
try:
led = NeoPixel(Pin(Pin.P24), 12)
led.clear()
except Exception as err:
print(err)
app.run(host='0.0.0.0')
复制代码
3 将Python脚本上传到行空板
通过WI-FI或USB连接的方式,将项目文件上传到行空板,然后通过SSH在行空板上运行REST API服务。
示例代码如下
```bash
# upload script with SCP
scp -r ~/NeoPixelAPI root@10.1.2.3:/root/NeoPixelAPI
# login with SSH
ssh -C4 root@10.1.2.3
# change directory
cd ~/NeoPixelAPI
``` 复制代码
4 运行REST API服务器
启动Python Flask Web API服务器,通过串口连接,就能在特定IP和端口上提供REST API服务。
```bash
# run simple Flask server
python3 main.py
___________________________
| |
| PinPong v0.5.1 |
| Designed by DFRobot |
|___________________________|
[01] Python3.7.3 Linux-4.4.143-67-rockchip-g01bbbc5d1312-aarch64-with-debian-10.13 Board: UNIHIKER
selected -> board: UNIHIKER serial: /dev/ttyS3
[10] Opening /dev/ttyS3
[32] Firmata ID: 3.7
[22] Arduino compatible device found and connected to /dev/ttyS3
[40] Retrieving analog map...
[42] Auto-discovery complete. Found 30 Digital Pins and 30 Analog Pins
------------------------------
All right. PinPong go...
------------------------------
* Serving Flask app 'main' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://10.0.0.14:5000/ (Press CTRL+C to quit)
``` 复制代码
这里Running on http://10.0.0.14:5000/ 是我家环境中行空板的WLAN IP。你也可以在本地WLAN中测试API:
### Example usage:
```
GET http://[IP address]/api/colors
Response:
{
"message":{
"black":[0,0,0],
"blue":[0,0,255],
"green":[0,255,0],
"red":[255,0,0],
"white":[255,255,255]
},
"status":"success"
}
GET http://[IP address]/api/red
Response:
{
"status": "success",
"message": "red is valid."
}
GET http://[IP address]/api/black
Response:
{
"status": "success",
"message": "black is valid."
}
GET http://[IP address]/api/invalid_color
Response:
{
"status": "error",
"message": "invalid_color is not valid."
}
``` 复制代码
5 在手机上创建API调用
代码测试成功后,就可以用手机读取NFC标签来触发操作。当NFC标签被扫描时,手机会发送一个HTTP GET请求到行空板上的Flask网络服务,改变LED的颜色。
我这里用的iPhone,可以使用“快捷指令”应用来实现这个功能。
效果展示
作者:Lupin
发布时间:2024年7月14日
原文链接:https://community.dfrobot.com/makelog-314414.html