项目介绍
它使用W5100S-EVB-PICO与Blynk通信来监视和控制电池充电器。 (包括 Siri 功能。)
转发: IOT Battery Charger - W5100S-EVB-PICO with Blynk and Charger
故事
这是一款基于物联网平台Blynk Cloud对电池进行监控和控制的应用。 它使用W5100S-EVB-PICO作为充电器和Blynk之间的主要通信设备。
为了提供用户友好的界面,我添加了 Siri 和 I-Phone 的快捷功能,以使用语音命令控制充电器。
我所有的编码方法都是使用 CircuitPython。
详情请参阅以下信息。
结构:
电池充电器结构图
这是我的电池充电器应用的整个连接结构。
监控电池充电器的主要功能是检查电池的电压。
因此,我使用MAX471的分压电路来检查电压值。
对于控制部分,我使用了继电器模块来控制电源为电池充电。
关于Blynk之间的通信,它使用TCP协议。
对于 Blynk APP 和 Siri 部分,它使用了 Blynk 的帮助来实现这一目标。
编程 - 从 MAX471 收集电压值:
在我之前的应用程序中,我使用了 Solar 项目中的相同库。
但是,我没有将当前部分用于此应用程序。
MAX471库:
import board
import analogio
import digitalio
import time
class MAX471:
def __init__ (
self, voltage_pin: pin, current_pin: pin
) -> None:
self.voltage = analogio.AnalogIn(voltage_pin)
self.current = analogio.AnalogIn(current_pin)
def Voltage(self):
""" Voltage measure (calibrated) """
n_result = 0
for i in range(20):
n_result += self.voltage.value
#print(n_result)
time.sleep(0.1)
result =(((n_result * 0.825) / 65535) * 1.0213) - 0.141
display = ("{:.2f}").format(result)
self.v_result = result
return result
def Current(self):
""" Currrent measure (calibrated)"""
n_result = 0
for i in range(20):
n_result += self.current.value
#print(n_result)
time.sleep(0.1)
result = (((n_result * 150) / 65535) * 1.0789) - 8.0218
display = ("{:.2f}").format(result)
self.c_result = result
return display
def Power(self):
"""Power = Current * Voltage"""
result = self.c_result/1000 * self.v_result
display = ("{:.2f}").format(result)
return display
"""
max471 = max471(voltage_pin = board.A0, current_pin = board.A1)
while True:
C = max471.Current()
V = max471.Voltage()
P = max471.Power()
"""
MAX471示例:
import board
import busio
import digitalio
import time
import MAX471
meter = MAX471.MAX471(voltage_pin = board.A0, current_pin = board.A1)
#voltage = analogio.AnalogIn(board.A0)
while True:
voltage = meter.Voltage()
print (("{} V").format(voltage))
#current = meter.Current()
#print (("{} mA").format(current))
#power = meter.Power()
#print(("{} W").format(power))
time.sleep (0.1)
编程 - 继电器控制:
对于继电器控制来说,会非常简单。 通过使用 CircuitPython 的 digitalio 模块,我可以控制其中一个 GPIO 来进行继电器控制。
当有电压输入到继电器时,继电器闭合电路,为充电器提供电压。
该部分将完全由 Blynk 控制。
#Add Power switch
power_switch = digitalio.DigitalInOut(board.GP0)
power_switch.direction = digitalio.Direction.OUTPUT
#Handle message from Blynk to control
@blynk.on("V5")
def v5_write_handler(value):
if value[0] is '1':
power_switch.value = 1
elif value[0] is '0':
power_switch.value = 0
编程 - 与 Blynk 通信:
在本节中,我使用了 Blynk 库,它与我之前的太阳能项目相同。
如您所知,Blynk云平台使用Python编码。
通过结合 Blynk 库和 WIZnet 的 Circuitpython 库,我完成了基于此应用程序的完整编码。
发送警报:
def battery_value(voltage):
presentage = voltage /3.7 * 100
print(presentage)
if presentage >= 100: #check battery status
return "full" , presentage
elif presentage <= 0: #check is there any battery
power_switch.value = 0
return "no_battery", presentage
else:
return None, presentage
#check and send alert
msg, presentage = battery_value(voltage)
if msg is not None:
blynk.log_event(msg)
向 Blynk 发送数据:
#check the current battery switch status
def device_status():
if power_switch.value is False:
return '0'
elif power_switch.value is True:
return '1'
#Update the current battery status to Blynk
blynk.run()
status = device_status()
blynk.virtual_write(5, status) #update status
#Check the voltage value from MAX471
voltage = meter.Voltage()
blynk.virtual_write(0, voltage) #Update the voltage of the battery
msg, presentage = battery_value(voltage) #convert to %
blynk.virtual_write(1, presentage) # Update the Battery status in %
time.sleep(1)
完整代码:
import board
import digitalio
import time
import busio
import struct
import BlynkLib
import MAX471
import adafruit_requests as requests
from adafruit_wiznet5k.adafruit_wiznet5k import * #active WIZnet chip library
import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket #open socket from WIZnet library
# Go to your blynk device and input related information
BLYNK_TEMPLATE_ID = "XXXXXXXXXXXXXXX "
BLYNK_DEVICE_NAME = "Quickstart Template"
BLYNK_AUTH_TOKEN = "XXXXXXXXXXXXXXXXXXXXX"
#Add Power switch
power_switch = digitalio.DigitalInOut(board.GP0)
power_switch.direction = digitalio.Direction.OUTPUT
#Add MAX471 metering sensor
meter = MAX471.MAX471(voltage_pin = board.A0, current_pin = board.A1)
# Activate GPIO pins for SPI communication
SPI0_SCK = board.GP18
SPI0_TX = board.GP19
SPI0_RX = board.GP16
SPI0_CSn = board.GP17
# Activate Reset pin for communication with W5500 chip
W5x00_RSTn = board.GP20
print("Wiznet5k SimpleServer Test (DHCP)")
class Blynk(BlynkLib.BlynkProtocol):
def __init__(self, auth, **kwargs):
self.insecure = kwargs.pop('insecure', True)
self.server = kwargs.pop('server', 'blynk.cloud')
self.port = kwargs.pop('port', 80 if self.insecure else 443)
BlynkLib.BlynkProtocol.__init__(self, auth, **kwargs)
#self.on('redirect', self.redirect)
def _write(self, data):
#print('<', data)
client.send(data) #information that we send out
# TODO: handle disconnect
def run(self):
data = b''
try:
data = client.recv() #information that we received from Blynk
#print('>', data)
except KeyboardInterrupt:
raise
#except socket.timeout:
# No data received, call process to send ping messages when needed
#pass
except: # TODO: handle disconnect
return
self.process(data)
def battery_value(voltage):
presentage = voltage /3.7 * 100
print(presentage)
if presentage >= 100:
return "full" , presentage
elif presentage <= 0:
power_switch.value = 0
return "no_battery", presentage
else:
return None, presentage
def device_status():
if power_switch.value is False:
return '0'
elif power_switch.value is True:
return '1'
# Setup your network configuration below
# random MAC, later should change this value on your vendor ID
MY_MAC = (0x00, 0x08, 0xDC, 0x11, 0x22, 0x33)
IP_ADDRESS = (192, 168, 0, 111)
SUBNET_MASK = (255, 255, 0, 0)
GATEWAY_ADDRESS = (192, 168, 0, 1)
DNS_SERVER = (8, 8, 8, 8)
# Set LED for checking the network system working
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
# Set reset function
ethernetRst = digitalio.DigitalInOut(W5x00_RSTn)
ethernetRst.direction = digitalio.Direction.OUTPUT
# Set this SPI for selecting the correct chip
cs = digitalio.DigitalInOut(SPI0_CSn)
# Set the GPIO pins for SPI communication
spi_bus = busio.SPI(SPI0_SCK, MOSI=SPI0_TX, MISO=SPI0_RX)
# Reset WIZnet's chip first
ethernetRst.value = False
time.sleep(1)
ethernetRst.value = True
# Initialize ethernet interface with DHCP
eth = WIZNET5K(spi_bus, cs, is_dhcp=True, mac=MY_MAC, debug=False)
# Show all information
print("Chip Version:", eth.chip)
print("MAC Address:", [hex(i) for i in eth.mac_address])
print("My IP address is:", eth.pretty_ip(eth.ip_address))
# Initialize steps for WIZnet's socket to create TCP server
socket.set_interface(eth)
client = socket.socket() # Set and name the socket to be a TCP server
client_ip = "128.199.144.129" #blynk.cloud
client_port = 80 # HTTP port for Blynk Port
client.connect((client_ip, client_port), None)
blynk = Blynk(BLYNK_AUTH_TOKEN)
@blynk.on("V5")
def v5_write_handler(value):
if value[0] is '1':
power_switch.value = 1
elif value[0] is '0':
power_switch.value = 0
while True:
# Maintain DHCP lease (continue the DHCP setting while TCP is connected)
eth.maintain_dhcp_lease()
led.value = not led.value #showing the light is blinking
time.sleep(0.1) #transmit data speed
#During the connection with Blynk Cloud, you could modified in this section.
if client.status == SNSR_SOCK_ESTABLISHED:
blynk.run()
status = device_status()
blynk.virtual_write(5, status)
#Blynk.log_event('Device ON')
voltage = meter.Voltage()
blynk.virtual_write(0, voltage)
msg, presentage = battery_value(voltage)
if msg is not None:
blynk.log_event(msg)
blynk.virtual_write(1, presentage)
time.sleep(1)
# Found out the connection has been disconnected from the server
elif client.status == SNSR_SOCK_CLOSE_WAIT:
client.disconnect() #close the connection
# Socket has closed
elif client.status == SNSR_SOCK_CLOSED:
client.connect((client_ip, client_port), None)
Blynk 操作 - 平台设置:
正如您从编码中看到的,我通过 Blynk 进行了一些警报设置和更新。 以下是更具体的实现过程。
为了允许我上传信息 Blynk,需要将信息上传到他们的数据流。 通过从 Blynk 云和 Blynk 库获取设备信息,W5100S-EVB-PICO 能够与这些数据流进行通信。
因此,需要我如下正确设置数据流。
数据流:
数据流设置
V0:电压数据流,用于从 W5100S-EVB-PICO 收集实际电压值
V1:经W5100S-EVB-PICO修改为百分比的电池值(%)
V5:控制W5100S-EVB-PICO继电器的电源开关。 该功能将由 Blynk APP 激活。
警报:
警报正在设置 Blynk 云在网页和 Blynk APP 上发送通知,以允许用户收到通知并采取一些相关操作。
这将由“事件”部分处理。
对于这个应用程序,我添加了两种可能的场景。
1. 电池已充满电。 当电池充满电(100%)时,它会向 Blynk 的 Log 事件发出“充满”命令。
2. 无电池。 当MAX471接收到低于或等于电池状态0%的值时,它将向Blynk的Log事件发送“no_battery”命令。
当 Blynk Cloud 收到这些命令时,它会向我的手机发送通知。
设置将显示如下。
事件(警报)设置
向 Blynk 提供信息后,您可以在情况发生时激活这些命令。
有关详细信息:请参阅 Blynk 中的事件文档。
无电池报警:
充满电报警
Blynk操作-网页仪表板&手机APP仪表板
对于网页仪表板,网站和移动应用程序的小部件略有不同。 因此,我刚刚添加了显示仪表和标签栏(包含值状态)以显示电压和电池充电状态。
对于移动应用程序,它包括一个按钮开关,使我可以轻松地制作我的演示。
网页仪表板:
移动APP仪表板:
Siri 操作:
对于 Siri 部分来说,这是一个非常简单的进步。 通过使用 Shortcut 的 URL 获取内容功能,我可以轻松更改设置并从 Blynk 获取信息。
通过 Blynk 提供的HTTP API,我可以轻松地从 Blynk 获取信息并通过以下过程创建通知。
从 Blynk 获取数据流价值
1.使用获取内容URL
2. 使用 HTTP API 获取数据流值
3. if语句收集消息并收集消息内的数字
4.根据您的留言,它会提供相关信息
5. 呼叫siri,它会显示通知
获取数据流快捷方式结果:
将数据流更新到 Blynk
1.使用获取内容URL
2. 使用 HTTP API 的更新数据流值
3. 调用 siri,它会向 Blynk 发送命令