WIZnet智能农场(AI服务器+W5100S-EVB-PICO)

本文介绍了一个基于W5100S-EVB-PICO的智能农场项目,通过AI服务器实时监测和管理植物生长的最佳条件,包括温度、湿度、亮度等,实现自动化控制。C和Python编程用于设备通信和数据分析。
该项目使用 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使用水泵来供水。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值