物联网电池充电器 - W5100S-EVB-PICO,带 Blynk 和充电器

本文介绍了使用CircuitPython和W5100S-EVB-PICO与Blynk平台集成的电池充电器项目,通过MAX471监测电压,CircuitPython控制继电器,同时支持Siri语音控制和BlynkAPP远程操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目介绍

它使用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。

详情请参阅以下信息。

结构:

Battery Charger Structure Diagram

电池充电器结构图

这是我的电池充电器应用的整个连接结构。

监控电池充电器的主要功能是检查电池的电压。

因此,我使用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 能够与这些数据流进行通信。

因此,需要我如下正确设置数据流。

数据流:

Datastream setup

数据流设置

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 收到这些命令时,它会向我的手机发送通知。

设置将显示如下。

Event (Alert) setup

事件(警报)设置

向 Blynk 提供信息后,您可以在情况发生时激活这些命令。

有关详细信息:请参阅 Blynk 中的事件文档

无电池报警:

No Battery Result

充满电报警

Fully Charged Result

Blynk操作-网页仪表板&手机APP仪表板

对于网页仪表板,网站和移动应用程序的小部件略有不同。 因此,我刚刚添加了显示仪表和标签栏(包含值状态)以显示电压和电池充电状态。

对于移动应用程序,它包括一个按钮开关,使我可以轻松地制作我的演示。

网页仪表板:

Webpage Dashboard

移动APP仪表板:

Mobile APP Dashboard

Siri 操作:

对于 Siri 部分来说,这是一个非常简单的进步。 通过使用 Shortcut 的 URL 获取内容功能,我可以轻松更改设置并从 Blynk 获取信息。

通过 Blynk 提供的HTTP API,我可以轻松地从 Blynk 获取信息并通过以下过程创建通知。

从 Blynk 获取数据流价值

1.使用获取内容URL

2. 使用 HTTP API 获取数据流值

3. if语句收集消息并收集消息内的数字

4.根据您的留言,它会提供相关信息

5. 呼叫siri,它会显示通知

Get datastream Shortcut setup

获取数据流快捷方式结果:

Check My Charger Status

Check the Battery Status

将数据流更新到 Blynk

1.使用获取内容URL

2. 使用 HTTP API 的更新数据流值

3. 调用 siri,它会向 Blynk 发送命令

文件:

代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值