0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32+JAVA宠物管理系统的设计与实现

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-09-09 11:40 次阅读

【摘要】 本系统主要是由RFID自动识别技术,通过无线射频方式对宠物的电子标签进行读取,获取宠物的基本信息和在店内的所有消费,然后将数据通过网络传输至服务器。在应用层开发一个管理系统,对宠物信息、店内消费等各种行为进行管理。同时系统需有登录注册功能,宠物信息管理,店内消费管理等功能。

一、设计需求

本系统主要是由RFID自动识别技术,通过无线射频方式对宠物的电子标签进行读取,获取宠物的基本信息和在店内的所有消费,然后将数据通过网络传输至服务器。在应用层开发一个管理系统,对宠物信息、店内消费等各种行为进行管理。同时系统需有登录注册功能,宠物信息管理,店内消费管理等功能。

宠物店管理系统主要分为以下模块:

1.RFID模块:由天线射频电路组成,通过自动识别电子标签,采集数据,采用RFID封装技术将其封装,并传输给服务器。

2.电子标签模块:接收外部信号和发送信号

3.店铺管理模块:管理员可以对店铺商品进行增删改操作,修改、删除顾客宠物信息以及店内消费行为。

4.登录注册模块:新用户可以进行注册和登录5.用户管理模块:对注册用户进行管理

二、设计需求总结

整个系统的设计:

(1). 宠物店每来一个新的宠物,就在软件端进行注册、注册时填入宠物的名称,宠物的类型,主人的电话号码、选择一张宠物的图片方便后面展示(图片可以预存几张猫、狗即可)、如果宠物后面在店里有消费也会记录包含时间,这些数据都保存在软件端的数据库里。

(2). 开卡: 新宠物注册之后,需要为这个宠物办理一张电子标签卡,这个卡里存放着这个宠物主人的电话号码,后面要查询这个宠物的信息,就读取整个电子标签里的电话号码,到数据库里查询。

(3). 开卡和查询的数据传输: 设备端与软件端采用 TCP网络方式进行通信;设备端当做TCP客户端,软件端当做TCP服务器;当设备端查询宠物的电子标签时,设备端读取电话号码之后,会通过约定的数据格式通过网络传递给软件端。 当软件端开卡注册时,也会用约定好的数据格式传递给设备端,如果设备端收到数据,开发板上的LED会点亮;这时把IC拿到RC522射频模块上刷一下即可;如果成功写入LED灯就会关闭。

(4). 软件端的设计(这个软件是给店家用的,功能都是针对店家这边方向开发):

有注册界面、登录界面;

主界面上显示店内有所有注册过的宠物信息,每个宠物有图片进行显示、宠物图片下面就显示宠物的名称;

商品界面: 展示一些狗粮、猫粮、药剂、一些宠物周边物品。 用于演示消费功能。 可以预定几个商品即可。 用户可以自己动态添加修改。

管理员界面: 可以对店内的商品进行添加、设计价格、修改宠物的信息等。

查询页面: 输入宠物信息可以查询这个宠物在店里的所有详细信息。

设备硬件部分:

这里的硬件刷卡部分采用的使用STM32开发的,更加灵活方便,完成对IC卡读写通过网络与JAVA服务器通信,也可以换成扫码枪之类的其他设备。

\1. RC522刷卡模块负责对卡进行读写。

\2. ESP8266WIFI初始化工作在STA模式,连接到指定WIFI,与软件所在的电脑处于同一个局域网,方便连接软件端的服务器进行数据通信,每次设备开机将会自动连接到程序里设置好WIFI热点和服务器。

\3. 设备端上有一个LED灯,用来显示刷卡的状态—成功与否。

三、硬件设备效果图与部分核心代码

imgimgimg
#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_SendCmd(char *cmd)
{
    u8 i,j;
    for(i=0;i<10;i++) //检测的次数--发送指令的次数
    {
        USARTx_StringSend(USART3,cmd);
        for(j=0;j<100;j++) //等待的时间
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,"OK"))
                {
                    return 0;
                }
            }
        }
    }
    return 1;
}

/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_Init(void)
{
    //退出透传模式
    USARTx_StringSend(USART3,"+++");
    delay_ms(50);
    return ESP8266_SendCmd("AT\r\n");
}

/*
函数功能: 一键配置WIFI为AP+TCP服务器模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
u16 port    创建的服务器端口号
函数返回值: 0表示成功 其他值表示对应错误值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{
    char *p;
    u8 i;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    /*1. 测试硬件*/
    if(ESP8266_SendCmd("AT\r\n"))return 1;
    /*2. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 2;
    /*3. 设置WIFI模式*/
    if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
    /*4. 复位*/
    ESP8266_SendCmd("AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    /*5. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 5;
    /*6. 设置WIFI的AP模式参数*/
    sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
    /*7. 开启多连接*/
    if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
    /*8. 设置服务器端口号*/
    sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
    /*9. 查询本地IP地址*/
    if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
    //提取IP地址
    p=strstr((char*)USART3_RX_BUFFER,"APIP");
    if(p)
    {
        p+=6;
        for(i=0;*p!='"';i++)
        {
            ESP8266_IP_ADDR[i]=*p++;
        }
        ESP8266_IP_ADDR[i]='\0';
    }
    //提取MAC地址
    p=strstr((char*)USART3_RX_BUFFER,"APMAC");
    if(p)
    {
        p+=7;
        for(i=0;*p!='"';i++)
        {
            ESP8266_MAC_ADDR[i]=*p++;
        }
        ESP8266_MAC_ADDR[i]='\0';
    }
    
    //打印总体信息
    USART1_Printf("当前WIFI模式:AP+TCP服务器\n");
    USART1_Printf("当前WIFI热点名称:%s\n",ssid);
    USART1_Printf("当前WIFI热点密码:%s\n",pass);
    USART1_Printf("当前TCP服务器端口号:%d\n",port);
    USART1_Printf("当前TCP服务器IP地址:%s\n",ESP8266_IP_ADDR);
    USART1_Printf("当前TCP服务器MAC地址:%s\n",ESP8266_MAC_ADDR);
    return 0;
}

/*
函数功能: TCP服务器模式下的发送函数
发送指令: 
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
        USARTx_StringSend(USART3,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART3,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART3_RX_FLAG)
                        {
                            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                            USART3_RX_FLAG=0;
                            USART3_RX_CNT=0;
                            if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}

/*
函数功能: 配置WIFI为STA模式+TCP客户端模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
char *p     将要连接的服务器IP地址
u16 port    将要连接的服务器端口号
u8 flag     1表示开启透传模式 0表示关闭透传模式
函数返回值:0表示成功  其他值表示对应的错误
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    //退出透传模式
    //USARTx_StringSend(USART3,"+++");
    //delay_ms(50);
    /*1. 测试硬件*/
    if(ESP8266_SendCmd("AT\r\n"))return 1;
    /*2. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 2;
    /*3. 设置WIFI模式*/
    if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
    /*4. 复位*/
    ESP8266_SendCmd("AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    /*5. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 5;
    /*6. 配置将要连接的WIFI热点信息*/
    sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
    /*7. 设置单连接*/
    if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
    /*8. 配置要连接的TCP服务器信息*/
    sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
    /*9. 开启透传模式*/
    if(flag)
    {
       if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9; //开启
       if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10;  //开始透传
       if(!(strstr((char*)USART3_RX_BUFFER,">")))
       {
            return 11;
       }
        //如果想要退出发送:  "+++"
    }
    
     //打印总体信息
    USART1_Printf("当前WIFI模式:STA+TCP客户端\n");
    USART1_Printf("当前连接的WIFI热点名称:%s\n",ssid);
    USART1_Printf("当前连接的WIFI热点密码:%s\n",pass);
    USART1_Printf("当前连接的TCP服务器端口号:%d\n",port);
    USART1_Printf("当前连接的TCP服务器IP地址:%s\n",ip);
    return 0;
}
/*
函数功能: TCP客户端模式下的发送函数
发送指令: 
*/
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
        USARTx_StringSend(USART3,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART3_RX_FLAG)
            {
                USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                USART3_RX_FLAG=0;
                USART3_RX_CNT=0;
                if(strstr((char*)USART3_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART3,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART3_RX_FLAG)
                        {
                            USART3_RX_BUFFER[USART3_RX_CNT]='\0';
                            USART3_RX_FLAG=0;
                            USART3_RX_CNT=0;
                            if(strstr((char*)USART3_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}

四、JAVA端效果图与部分代码示例

如果需要资料包可以去这里下载: https://download.csdn.net/download/xiaolong1126626497/20687600

imgimgimgimgimgimgimgimgimgimgimgimgimgimgimgimgimg
package com.controller;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.common.bean.MySessionContext;
import com.common.bean.ResultData;
import com.entity.User;
import com.mapper.UserMapper;

@RestController()
@RequestMapping("/user")
public class UserController {
	@Autowired
	private UserMapper um;
	
	@PostMapping("changepswd.action")
	ResultData changePswd(String token,@RequestBody Map map) {
		 HttpSession ss = MySessionContext.getSession(  token );
		 if( ss == null ) {
			 return ResultData.fail("请先登录!");
		 }
		 User uu = (User) ss.getAttribute("login_user");
		 if( uu == null )  return ResultData.fail("请先登录!");
		 String password = map.get("password");
		 String newpassword = map.get("password2");
		 int num = um.updatePassword(uu.getId(), password, newpassword);
		 if( num > 0) return ResultData.success();
		  return ResultData.fail("原始密码错误");
	}
	@PostMapping("adduser.action")
	ResultData addUser(String token,@RequestBody User user) {
		 HttpSession ss = MySessionContext.getSession(  token );
		 if( ss == null ) {
			 return ResultData.fail("请先登录!");
		 }
		 
		 User uu = (User) ss.getAttribute("login_user");
		 System.out.println( uu );
		 if( uu == null )  return ResultData.fail("请先登录!");
		 
		 if( !("admin".equalsIgnoreCase(uu.getRole()) ||
				    "root".equals( uu.getRole() )    )  )   {
			 return ResultData.fail("请用管理员账号登录再添加");
		 }
		 um.addUser(user);
		 return ResultData.success();
	}
	
	@PostMapping("delete.action")
	ResultData deleteUser(String token,@RequestBody User user) {
		 System.out.println( user);
		 HttpSession ss = MySessionContext.getSession(  token );
		 if( ss == null ) {
			 return ResultData.fail("请先登录!");
		 }
		 
		 User uu = (User) ss.getAttribute("login_user");
		 if( uu == null )  return ResultData.fail("请先登录!");
		 if("admin".equalsIgnoreCase(user.getRole()) || "root".equals( user.getRole() ))  return ResultData.fail("无法删除管理员用户!");
		 
		 if( !("admin".equalsIgnoreCase(uu.getRole()) ||
				    "root".equals( uu.getRole() )    )  )   {
			 return ResultData.fail("请用管理员账号登录再删除");
		 }
		 um.deleteUser(user);
		return ResultData.success();
	}
	@PostMapping("getall.action")
	ResultData getAll(String token) {
		 HttpSession ss = MySessionContext.getSession(  token );
		 if( ss == null ) {
			 return ResultData.fail("请先登录!");
		 }
		List list = um.getAll();
		for(User u:list) {
			u.setPassword(null);
		}
		return ResultData.success().setData( list );
	}
	@PostMapping("logout.action")
	ResultData getAllUser(String token) {
		 HttpSession ss = MySessionContext.getSession(  token );
		 if( ss != null ) {
			 ss.invalidate();
		 }
		return  ResultData.success();
	}
	
	@PostMapping("login.action")
	ResultData login(@RequestBody User user,HttpSession ss) {
		User rs = um.Login( user );
		if(rs != null ) {
			rs.setPassword( null );
			ss.setAttribute("login_user", rs );
			MySessionContext.AddSession( ss );
			return  ResultData.success().setData( rs ).setToken(ss.getId() );
		}else {
			return ResultData.fail("用户名或密码错误!");
		}
	}
}
,string>
package com.common.wx;

import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import com.common.bean.WebSocketProductHolder;

public class WebSocketServerService extends TextWebSocketHandler{
	 
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		WebSocketProductHolder.setSession( session );
	}

} 
package com.common.bean;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import com.alibaba.fastjson.JSONObject;
import com.entity.Product;
import com.mapper.ProductMapper;

@Component
public class WebSocketProductHolder implements ApplicationContextAware{
	private volatile static WebSocketSession oneSession;
	private volatile static Socket client;
	
	public WebSocketProductHolder() {
		initServer();
	}
	public static void setSession(WebSocketSession ss) {
		oneSession = ss;
	}
	 
	private static void initServer()   {
		new Thread() {
			public void run() {
				ServerSocket ss = null;
				try {
					ss = new ServerSocket(9988);
					System.out.println("初始化");
					while(true) {
						client = ss.accept();
						byte [] b = new byte[128];
						try {
							while(true) {
								int num = client.getInputStream().read(b);//数据少,一次读完就阻塞。
								if(num != -1 ) {
									String cmd = new String(b,0,num);
									parseCMD( cmd);
								}
							}
						}catch (Exception e) {
							 System.out.println("连接断开...");
						}
					}
				}catch (Exception e) {
				}
			}
		}.start();
	}
	public static void register(String cardid)throws IOException {
		if(cardid!=null && cardid.length() >0 && 
				client!=null && client.isConnected()) {
			client.getOutputStream().write(("register:"+cardid+"\r\n").getBytes());
		}
	}
 
	private static void parseCMD(String cmd) {
		 if(cmd.startsWith("query")) {
			try {
				 String cardid = cmd.split(":")[1].trim();
				 if(  oneSession != null ) {
					 oneSession.sendMessage( new TextMessage( cardid ) );
				 } 
			}catch (Exception e) {
				 System.out.println("数据错误:"+cmd);
			}
			  
		 }
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		initServer();
	}
}
商品名称商品价格商品数量商品分类商品描述商品图片提交
查询 当前共 {{datalist.length}} 件商品 商品编号商品名称商品分类商品价格商品数量商品图片操作 {{item.name}} {{item.sortname}} {{item.price|priceText}} {{item.num}} 详情删除修改返回商品编号 {{detail.id}} 商品名称 {{detail.name}} 商品价格 {{detail.price|priceText}} 商品数量 {{detail.num}} 商品分类 {{detail.sortname}} 商品描述 {{detail.detail}} 商品图片
商品名称商品价格商品数量商品分类商品描述商品图片提交
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18281

    浏览量

    288391
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348735
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102991
收藏 人收藏

    评论

    相关推荐

    RIFD技术在宠物管理上的应用方案

    也日益突出,宠物狗走失和遗弃的现象大量增加,流浪狗疾病传播等问题出现,严重影响居民安全、城市卫生、交通等。那么如何有效加强宠物管理,确保宠物管理
    的头像 发表于 12-13 09:33 7288次阅读
    RIFD技术在<b class='flag-5'>宠物</b><b class='flag-5'>管理</b>上的应用方案

    java学生信息管理系统

    java学生信息管理系统
    发表于 10-03 14:47

    机智云技术在宠物管理系统中的应用

    ,整合市场上单一产品的优点,设计实现基于机智云技术的智能宠物管理系统。本系统以Cortex-M4为内核的
    发表于 04-22 19:01

    机智云技术在宠物管理系统中的应用

    摘要: 为了方便人们更好地管理宠物,设计基于STM32和机智云SDK进行二次开发的安卓APP宠物管理系统
    发表于 03-03 21:33

    怎么实现基于java的土地档案管理系统设计?

    怎么实现基于java的土地档案管理系统设计?
    发表于 09-18 06:41

    如何利用Java swing mysql去实现一种电影票订票管理系统

    Java swing mysql实现的电影票订票管理系统,主要实现的功能有:用户端:登录注册、查看电影信息、选择影院场次、选座购票、查看自己
    发表于 01-03 06:23

    基于Web远程文件管理系统java实现

    为了实现远程文件管理系统的跨操作系统运行,设计了一套基于 Java Socket 的远程文件类应用程序接口(API),并在此基础上
    发表于 05-31 14:38 40次下载

    基于RFID电子标签的宠物管理系统设计

    RFID宠物管理系统使用自行设计的手持机读写器,采用基于Web的B/S模式结合WebSevice、SSL、动态缓存、负载均衡、集群和ActiveX控件技术,使得系统扩展性好、安全性能高
    发表于 08-19 11:20 2870次阅读
    基于RFID电子标签的<b class='flag-5'>宠物</b><b class='flag-5'>管理</b><b class='flag-5'>系统</b>设计

    RFID宠物狗防疫管理系统如何制作

    宠物狗疫苗管理系统,从根本上解决宠物丢失、遗弃和监管问题,带着全球唯一识别码(UID)的宠物电子芯片,将作为
    发表于 11-15 14:15 909次阅读

    使用Java实现的学生管理系统详细资料说明

    本文档的主要内容详细介绍的是使用Java实现的学生管理系统详细资料说明。
    发表于 12-04 08:00 3次下载
    使用<b class='flag-5'>Java</b><b class='flag-5'>实现</b>的学生<b class='flag-5'>管理</b><b class='flag-5'>系统</b>详细资料说明

    RFID宠物狗防疫管理如何来实现

    rfid宠物狗疫苗管理系统,从根本上解决宠物丢失、遗弃和监管问题,带着全球唯一识别码(UID)的宠物电子芯片,将作为
    发表于 04-01 09:58 659次阅读

    使用Java实现超市货物管理系统的资料合集免费下载

    本文档的主要内容详细介绍的是使用Java实现超市货物管理系统的资料合集免费下载。
    发表于 05-29 08:00 2次下载
    使用<b class='flag-5'>Java</b><b class='flag-5'>实现</b>超市货物<b class='flag-5'>管理</b><b class='flag-5'>系统</b>的资料合集免费下载

    基于机智云技术的智能宠物管理系统

    摘要:为了方便人们更好地管理宠物,设计基于STM32和机智云SDK进行二次开发的安卓APP宠物管理系统
    的头像 发表于 03-03 15:40 3693次阅读
    基于机智云技术的智能<b class='flag-5'>宠物</b><b class='flag-5'>管理</b><b class='flag-5'>系统</b>

    基于机智云宠物管理系统总体设计

    针对目前市场的需求,整合市场上单一产品的优点,本文基于机智云平台技术设计了一款智能宠物管理系统
    的头像 发表于 03-31 14:56 2064次阅读

    【IoT毕设】机智云物联网平台+STM32单片机+智能宠物实现

    、温湿度传感器和电机驱动等模块,实现了智能喂养、空气净化和宠物排泄物清理等功能。系统利用ESP-01SWiFi模块接入机智云平台,将传感器收集的信息实时传输到手机App
    的头像 发表于 08-30 09:25 1387次阅读
    【IoT毕设】机智云物联网平台+<b class='flag-5'>STM32</b>单片机+智能<b class='flag-5'>宠物</b>屋<b class='flag-5'>实现</b>