该项目使用 W5100S-EVB-PICO 实现了一个简单的智能农场,其中接收数据的人工智能服务器测量和管理实时状态、最佳温度。

转发: WIZnet Smart Farm(AI Server + W5100S-EVB-PICO)
项目介绍
介绍
大家好! 在这个项目中,我与 WIZnet 的 Benjamin 一起实现了一个小型智能农场。 有时我们都想种植植物,但给它们浇水可能很麻烦,而且我们的植物常常会死掉。 然而,以这个项目为参考,情况并非如此。 该项目将帮助您的植物茁壮成长。
项目目标
我们的首要任务是从 AI 接收最佳环境数据(温度、湿度、亮度、浇水时间)并将其发送到 PICO。 一旦数据从 Benjamin 的 AI 服务器到达我的 PICO 服务器,我就实现了内部逻辑来与传感器进行比较过程。 通过这个比较过程,灯、风扇和水泵将相应地被激活。
开发准备及流程
项目材料:W5100S-EVB-PICO、GPIO LED(灯)、直流电机(风扇)、水泵、CDS 传感器(ADC)、DHT22、SG-90(伺服电机)
开发环境:VS Code
编程语言:C、Python
开发步骤:W5100S-EVB-PICO逻辑测试-创建AI服务器-电路配置和组装-测试操作
(有关AI服务器的详细信息,请参阅Benjamin的Smart Farm WCC帖子。)
项目硬件照片


项目硬件端口配置
直流电机驱动器 1(风扇):GPIO 0
伺服电机(窗口):GPIO 1
LED(灯):GPIO 2
直流电机驱动器 2(水泵):GPIO 3
DHT 22:GPIO 15
ADC 传感器:GPIO 26(ADC 0)
电源(高信号):3.3V
C代码(W5100S-EVB-PICO)
- tcp.c(以太网部分)
#include <stdio.h>
#include "loopback.h"
#include "socket.h"
#include "wizchip_conf.h"
#include <string.h>
#include <stdlib.h>
#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK
void parseAiBuf(const uint8_t *ai_buf, uint16_t *temp, uint16_t *humi, uint16_t *bright, uint16_t* wf) {
char bufCopy[2049]; // copy of ai_buf (길이가 2048인 문자열 + NULL 종료 문자)
strncpy(bufCopy, (const char *)ai_buf, sizeof(bufCopy) - 1);
bufCopy[sizeof(bufCopy) - 1] = '\0'; // 문자열 마지막에 NULL 종료 문자 추가
char *token = strtok(bufCopy, ".");
if (token != NULL) {
*temp = atoi(token);
}
token = strtok(NULL, ".");
if (token != NULL) {
*humi = atoi(token);
}
token = strtok(NULL, ".");
if (token != NULL) {
*bright = atoi(token);
}
token = strtok(NULL, ".");
if (token != NULL) {
*wf = atoi(token);
}
}
int32_t tcps(uint8_t sn, uint8_t* buf, uint16_t port, uint16_t* out_temp, uint16_t* out_humid, uint16_t* out_brightness, uint16_t* water_flag)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
#ifdef _LOOPBACK_DEBUG_
uint8_t destip[4];
uint16_t destport;
#endif
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
#ifdef _LOOPBACK_DEBUG_
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn, Sn_IR_CON);
}
if(send_cnt >= 6){
ret = send(sn, buf, strlen((char*)buf));
if(send_cnt >= 6 && ret < 0)
{
close(sn);
return ret;
}
send_cnt = 0;
}
else{
send_cnt++;
}
if ((size = getSn_RX_RSR(sn)) > 0)
{
if (size > sizeof(ai_buf))
size = sizeof(ai_buf);
ret = recv(sn, ai_buf, 2048);
parseAiBuf(ai_buf, out_temp, out_humid, out_brightness, water_flag);
printf("loopback.c Temperature: %d\n", *out_temp);
// printf("loopback.c Humidity: %d\n", ai_humid);
// printf("loopback.c Brightness: %d\n", ai_brightness);
if (ret <= 0)
return ret;
}
break;
case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
//printf("%d:CloseWait\r\n",sn);
#endif
if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket Closed\r\n", sn);
#endif
break;
case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
#endif
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:TCP server loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
#ifdef _LOOPBACK_DEBUG_
//printf("%d:Socket opened\r\n",sn);
#endif
break;
default:
break;
}
return 1;
}
- tcp.h(以太网部分)
#ifndef _LOOPBACK_H_
#define _LOOPBACK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/* Loopback test debug message printout enable */
#define _LOOPBACK_DEBUG_
/* DATA_BUF_SIZE define for Loopback example */
#ifndef DATA_BUF_SIZE
#define DATA_BUF_SIZE 2048
#endif
/************************/
/* Select LOOPBACK_MODE */
/************************/
#define LOOPBACK_MAIN_NOBLOCK 0
#define LOOPBACK_MODE LOOPBACK_MAIN_NOBLOCK
static uint8_t ai_buf[2048];
static int send_cnt = 0;
int32_t tcps(uint8_t sn, uint8_t* buf, uint16_t port, uint16_t* out_temp, uint16_t* out_humid, uint16_t* out_brightness, uint16_t* water_flag);
void parseAiBuf(const uint8_t *ai_buf, uint16_t *temp, uint16_t *humi, uint16_t *bright, uint16_t* wf);
#ifdef __cplusplus
}
#endif
#endif
- main.c
/**
* Copyright (c) 2021 WIZnet Co.,Ltd
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* ----------------------------------------------------------------------------------------------------
* Includes
* ----------------------------------------------------------------------------------------------------
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "port_common.h"
#include "hardware/adc.h"
#include <dht.h>
#include "wizchip_conf.h"
#include "w5x00_spi.h"
#include "socket.h"
#include "loopback.h"
#include "hardware/pwm.h"
// extern uint16_t ai_temp;
// extern uint16_t ai_humid;
// extern uint16_t ai_brightness;
uint16_t ai_temp_main;
uint16_t ai_humid_main;
uint16_t ai_brightness_main;
uint16_t ai_water_flag_main;
void set_servo_angle(float angle, int servo_pin);
/**
* ----------------------------------------------------------------------------------------------------
* Macros
* ----------------------------------------------------------------------------------------------------
*/
/* Clock */
#define PLL_SYS_KHZ (133 * 1000)
/* Buffer */
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
/* Socket */
#define SOCKET_LOOPBACK 0
/* Port */
#define PORT_LOOPBACK 5000
/**
* ----------------------------------------------------------------------------------------------------
* Variables
* ----------------------------------------------------------------------------------------------------
*/
/* Network */
static wiz_NetInfo g_net_info =
{
.mac = {0x00, 0x08, 0xDC, 0x1D, 0x6B, 0x52}, // MAC address
.ip = {192, 168, 0, 11}, // IP address
.sn = {255, 255, 255, 0}, // Subnet Mask
.gw = {192, 168, 0, 1}, // Gateway
.dns = {8, 8, 8, 8}, // DNS server
.dhcp = NETINFO_STATIC // DHCP enable/disable
};
/* Loopback */
static uint8_t g_loopback_buf[ETHERNET_BUF_MAX_SIZE] = {
0,
};
extern uint8_t ai_buf[2048];
static const dht_model_t DHT_MODEL = DHT22;
static const uint DATA_PIN = 15;
static float celsius_to_fahrenheit(float temperature) {
return temperature * (9.0f / 5) + 32;
}
/**
* ----------------------------------------------------------------------------------------------------
* Functions
* ----------------------------------------------------------------------------------------------------
*/
/* Clock */
static void set_clock_khz(void);
void set_gpio();
/**
* ----------------------------------------------------------------------------------------------------
* Main
* ----------------------------------------------------------------------------------------------------
*/
int main()
{
/* Initialize */
int retval = 0;
int buf_len = 0;
set_clock_khz();
stdio_init_all();
set_gpio();
Git 连接
[Git 连接] : smartfarm_rp2040
人工智能服务器

当您按下AI服务器上的“开始培养”按钮时,它将与分配到同一路由器的W5100S-EVB-PICO建立连接。 连接建立后,AI服务器将发送植物生长的最佳环境数据值。 随后,在步骤3中,您可以通过Tera Term(UART)确认PICO如何接收最佳环境数据值。

PICO通过传感器处理数据,并将实时数据从智能农场发送到AI服务器。 人工智能服务器在网页上显示实时数据,并使用经过训练的模型根据实时时间和图像评估工厂的状态。 此外,当需要给植物浇水时,AI服务器会自动向PICO发送数据,使PICO使用水泵来供水。
本文介绍了一个基于W5100S-EVB-PICO的智能农场项目,通过AI服务器实时监测和管理植物生长的最佳条件,包括温度、湿度、亮度等,实现自动化控制。C和Python编程用于设备通信和数据分析。
533

被折叠的 条评论
为什么被折叠?



