基于RK3399ESP8285自动售货柜项目—MP08开发板端代码详解

article/2025/9/27 11:47:53

基于RK3399&ESP8285自动售货柜项目—②MP08开发板端代码详解

本系列文章将详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法,从硬件连接到网络通信再到软件实现,本产品所用开发板为RK3399以及MP08_2019/11/03 , 如有疑问与见解,可随时留言或评论

本系列以往文章列表:

①基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录 (zsxq.com)

文章目录

  • 基于RK3399&ESP8285自动售货柜项目—②MP08开发板端代码详解
  • 一、ESP开发代码结构
  • 二、本项目MP09开发板端代码实现
    • 2.1MP08开发板原理图
    • 2.274HC595D驱动方式
    • 2.3MP08—TCP_Client代码实现
    • 2.4MP08完整代码
    • 2.5编译烧录及运行结果

上一篇我们讲解了如何搭建AiThinkIDE开发环境以及编写和烧录程序,那么这一篇我们来详细讲解本项目在MP08开发板上的代码实现原理,如果你手上也有这块板子,可以完全按照本系列文章来进行项目的实现

一、ESP开发代码结构

由于本项目不用过多深入学习ESP_SDK,故只用知道如何利用结构框架去编写想要的功能即可

我们先来看看官方例程代码:

/*跟其他C代码一样,这里放头文件,注意:AiThinkIDE没有标准C库函数,故没有如stdio.h 或者 string。h等,不要包含他们*/
#include "driver/uart.h"  //串口0需要的头文件
#include "osapi.h"  //串口1需要的头文件
#include "user_interface.h" //WIFI连接需要的头文件
#include "gpio.h"  //端口控制需要的头文件
#include "user_config.h"/*这一长段条件编译不用管他是干嘛的,写程序放进来就行*/
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0xfd000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x3fd000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x3fd000
#else
#error "The flash map is not supported"
#endifvoid ICACHE_FLASH_ATTR user_init(void)
{//相当于main函数,一般放各类软硬件的初始化代码,为程序入口
}//这个结构体定义也必须要,不用管他是干嘛的,SDK3.0规定必须要这一段
static const partition_item_t at_partition_table[] = {{ SYSTEM_PARTITION_BOOTLOADER, 						0x0, 												0x1000},{ SYSTEM_PARTITION_OTA_1,   						0x1000, 											SYSTEM_PARTITION_OTA_SIZE},{ SYSTEM_PARTITION_OTA_2,   						SYSTEM_PARTITION_OTA_2_ADDR, 						SYSTEM_PARTITION_OTA_SIZE},{ SYSTEM_PARTITION_RF_CAL,  						SYSTEM_PARTITION_RF_CAL_ADDR, 						0x1000},{ SYSTEM_PARTITION_PHY_DATA, 						SYSTEM_PARTITION_PHY_DATA_ADDR, 					0x1000},{ SYSTEM_PARTITION_SYSTEM_PARAMETER, 				SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 			0x3000},
};//这一个函数也要放进来,直接复制就行
void ICACHE_FLASH_ATTR user_pre_init(void)
{if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {os_printf("system_partition_table_regist fail\r\n");while(1);}
}

可以看到,整个代码结构就由这几部分构成,我们主要编写user_init函数里的内容,并且也可以自己定义想要的函数,函数名前的ICACHE_FLASH_ATTR表示的是函数地址存储位置在flash里,最好都加上

编写代码我们还需要去下载几个官方文档,里面有各种API函数用法介绍,本质跟STM32库函数差不多

ESP8266文档中心 | 安信可科技 (ai-thinker.com)
在这里插入图片描述

二、本项目MP09开发板端代码实现

2.1MP08开发板原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuzgMAmI-1669960267096)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202112651324.png)]

该原理图为我用万用表徒手测并绘制,仅供引脚走线参考使用,电阻电容等均未调整数值

通过原理图我们可以看到

  • 每个减速电机得三个引脚分别接在了L、C、H线上
  • 其中L引脚由原理图中间的74HC595D控制器的Q0-Q7控制
  • C引脚由ESP_IO12控制
  • H引脚由ESP_IO2控制

知道了电机由哪几个引脚控制,我们就可以往上进行推理,可知要想选择开启哪个电机就得控制74HC595D的Q0-Q7哪个引脚,所以我们需要找到74HC595D芯片手册来查看如何控制

2.274HC595D驱动方式

74HC595D数据手册

通过数据手册,我们可以知道,要想给Q0-Q7输出想要的信号值,就得在SER串行数据输入端输入相应的值并锁存到锁存寄存器里

所以,驱动方式总结如下:

  1. 设置SER串行数据输入引脚电平
  2. 拉高SCK,使SER数据被移位进入八位移位寄存器
  3. 重复以上两个步骤共8次,发送8位数据(1Byte)
  4. 拉高RCK,使得八位移位寄存器中的数据被送到八位锁存器里
  5. 锁存器里的数据将会自动发送到Q0-Q7各个引脚

提示:当我们想驱动Q3和Q5引脚输出高电平,我们的8位数据就应该为00101000,也就是0x28

根据以上信息,我们可以写出以下代码:

在看代码前,我们需要了解几个官方API函数:

  • os_printf:跟标准C库函数printf一样,但这里必须用os_printf
  • os_delay_us:官方给的专用微秒延时API
  • system_soft_wdt_feed:看门狗喂狗函数,不喂好像也没事,最好加上,安信可官方说默认开启了看门狗
  • GPIO_OUTPUT_SET(GPIO_ID_PIN(x),1):GPIO口输出电平控制宏,x为引脚编号,后面的1为高电平,0则为低电平
  • PIN_FUNC_SELECT:引脚功能选择宏函数
  • API函数及其具体用法可参照ESP8266_SDK_API参考指南
void delay_ms(uint32_t ms)
{while(ms--){os_delay_us(1000);//os_delay_us为官方APIsystem_soft_wdt_feed();//喂狗}
}//发送数据函数
void hc595d_send_byte(uint8_t data)
{uint8_t i;for(i = 0;i < 8;i++){if(data & (0x80>>i)){GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//IO4高电平}else{GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);//IO4低电平}GPIO_OUTPUT_SET(GPIO_ID_PIN(13),0);//先拉低os_delay_us(5);//适当延时GPIO_OUTPUT_SET(GPIO_ID_PIN(13),1);//上升沿将一位数据移入移位寄存器os_delay_us(5);//适当延时}
}
//锁存函数
void hc595d_latch_data(void)
{GPIO_OUTPUT_SET(GPIO_ID_PIN(15),0);//先拉低os_delay_us(5);//适当延时GPIO_OUTPUT_SET(GPIO_ID_PIN(15),1);//上升沿将数据送入锁存寄存器os_delay_us(5);//适当延时
}void driver_motor(uint8_t j)
{/** HC595D	ESP_IO12	ESP_IO2* MOTOR_L	MOTOR_C		MOTOR_H		转向* 1		1			0			逆时针* 1		0			0			x* 1		0			1			x* 1		1			1			逆时针* */hc595d_send_byte(j);//发送1byte数据hc595d_latch_data();//锁存GPIO_OUTPUT_SET(GPIO_ID_PIN(12),1);GPIO_OUTPUT_SET(GPIO_ID_PIN(2),0);GPIO_OUTPUT_SET(GPIO_ID_PIN(5),j%2);//led监视os_printf("j:%2d on\r\n",j);//售货机转1秒就停止delay_ms(1000);GPIO_OUTPUT_SET(GPIO_ID_PIN(12),0);
}void user_init(void)
{system_soft_wdt_feed();//喂狗PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);//IO4-SERPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);//IO15-RCKPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);//IO13-SCKPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//IO12-MOTOR_CPIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);//IO2-MOTOR_HPIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);//IO5-LED
}

以上就是如何去驱动74HC595D来控制MP08开发板上8个电机的方法

现在,我们来考虑售货机通信方面的问题,从这里开始呢,就可以根据不同的方式来去控制MP08售货机板子

  • 第一种方法:利用RK3399和MP08进行TCP连接,这样我们可以在RK3399板子上对MP08进行可视化操作

  • 第二种方法:无需其他外设,只需一部手机,我们可以在手机端连接MP08上的ESP8285,进行操控

  • 第三种方法:MP08上的ESP8285连接WiFi,然后连接上云服务器,手机端通过云服务器来进行远程发送数据去控制MP08

……方法非常多,远不止这几种,我们这里采用第一种方法

2.3MP08—TCP_Client代码实现

这里我们将MP08上的ESP8285作为TCP客户端连接RK3399的TCP服务端、

tcp_client.c

#include "user_config.h"
#include "driver/uart.h"  //串口0需要的头文件
#include "osapi.h"  //串口1需要的头文件
#include "user_interface.h" //WIFI连接需要的头文件
#include "espconn.h"//TCP连接需要的头文件
#include "mem.h" //系统操作需要的头文件
#include "gpio.h"os_timer_t checkTimer_wifistate;
struct espconn user_tcp_conn;uint8_t my_atoi(char *pdata,unsigned short len)
{uint8_t ret = 0;os_printf("len = %d\r\n",len);while(len--){ret *= 10;ret += *pdata++ - '0';}os_printf("ret = %d\r\n",ret);return ret;
}//将输入的点击编号转化为二进制
//如驱动1号电机Q0,则为00000001->0x01
//如驱动8号电机Q7,则为10000000->0x80
uint8_t to_binaray(uint8_t num)
{uint8_t ret = 0;switch(num){case 1:ret = 1;break;case 2:ret = 2;break;case 3:ret = 4;break;case 4:ret = 8;break;case 5:ret = 16;break;case 6:ret = 32;break;case 7:ret = 64;break;case 8:ret = 128;break;default:break;}return ret;
}//tcp发送数据回调函数
void ICACHE_FLASH_ATTR user_tcp_sent_cb(void *arg)  //发送
{os_printf("发送数据成功!");
}
//tcp断开后的回调函数
void ICACHE_FLASH_ATTR user_tcp_discon_cb(void *arg)  //断开
{os_printf("断开连接成功!");
}
//tcp收到数据后的回调函数
void ICACHE_FLASH_ATTR user_tcp_recv_cb(void *arg,  //接收char *pdata, unsigned short len) {os_printf("收到数据:%s\r\n", pdata);driver_motor(to_binaray(my_atoi(pdata,len)));//电机驱动espconn_sent((struct espconn *) arg, "0", strlen("0"));
}
//注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连
void ICACHE_FLASH_ATTR user_tcp_recon_cb(void *arg, sint8 err) 
{os_printf("连接错误,错误代码为%d\r\n", err);espconn_connect((struct espconn *) arg);
}
//注册 TCP 连接成功建立后的回调函数
void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg)  
{struct espconn *pespconn = arg;espconn_regist_recvcb(pespconn, user_tcp_recv_cb);  //接收espconn_regist_sentcb(pespconn, user_tcp_sent_cb);  //发送espconn_regist_disconcb(pespconn, user_tcp_discon_cb);  //断开espconn_sent(pespconn, "8226", strlen("8226"));os_printf("连接服务器成功!\r\n");
}void ICACHE_FLASH_ATTR my_station_init(struct ip_addr *remote_ip,struct ip_addr *local_ip, int remote_port) {user_tcp_conn.proto.tcp = (esp_tcp *) os_zalloc(sizeof(esp_tcp));  //分配空间user_tcp_conn.type = ESPCONN_TCP;  //设置类型为TCP协议os_memcpy(user_tcp_conn.proto.tcp->local_ip, local_ip, 4);os_memcpy(user_tcp_conn.proto.tcp->remote_ip, remote_ip, 4);user_tcp_conn.proto.tcp->local_port = espconn_port();  //本地端口user_tcp_conn.proto.tcp->remote_port = remote_port;  //目标端口//注册连接成功回调函数和重新连接回调函数espconn_regist_connectcb(&user_tcp_conn, user_tcp_connect_cb);//注册 TCP 连接成功建立后的回调函数espconn_regist_reconcb(&user_tcp_conn, user_tcp_recon_cb);//注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连//启用连接espconn_connect(&user_tcp_conn);
}//连接局域网wifi,连接tcp服务器
void Check_WifiState(void) {uint8 getState;getState = wifi_station_get_connect_status();//查询 ESP8266 WiFi station 接口连接 AP 的状态if (getState == STATION_GOT_IP) {os_printf("WIFI连接成功!\r\n");os_timer_disarm(&checkTimer_wifistate);struct ip_info info;const char remote_ip[4] = { 192, 168, 31, 116 };//目标IP地址wifi_get_ip_info(STATION_IF, &info);	//查询 WiFi模块的 IP 地址my_station_init((struct ip_addr *) remote_ip, &info.ip, 6000);//连接到目标服务器的6000端口}
}void tcp_client_init()	//初始化
{wifi_set_opmode(0x01);	//设置为STATION模式struct station_config stationConf;os_strcpy(stationConf.ssid, "Xiaomi_9908");	  //改成你自己的   路由器的用户名 os_strcpy(stationConf.password, "20010624w"); //改成你自己的   路由器的密码wifi_station_set_config(&stationConf);	//设置WiFi station接口配置,并保存到 flashwifi_station_connect();	//连接路由器os_timer_disarm(&checkTimer_wifistate);	//取消定时器定时os_timer_setfn(&checkTimer_wifistate, (os_timer_func_t *) Check_WifiState,NULL);	//设置定时器回调函数os_timer_arm(&checkTimer_wifistate, 500, 1);	//启动定时器,单位:毫秒
}

在此代码中,如有不了解的API函数,可随时查阅ESP8266_SDK_API参考指南,里面对每个API都有用法讲解,但不够清晰,可参照该代码进行理解

注意:

  • WiFi名和密码需要更改成和RK3399同局域网的WiFi
  • 目标IP地址需要更改为RK3399的ip地址,可输入ipconfig查询

2.4MP08完整代码

将以下代码替换到上一篇文章所创建工程的user_main.c

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di7Bl1G4-1669960267098)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202130356806.png)]

#include "driver/uart.h"  //串口0需要的头文件
#include "osapi.h"  //串口1需要的头文件
#include "user_interface.h" //WIFI连接需要的头文件
#include "gpio.h"  //端口控制需要的头文件
#include "user_config.h"#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0xfd000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x3fd000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x1fd000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE							0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR							0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR						0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR						0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR				0x3fd000
#else
#error "The flash map is not supported"
#endifvoid delay_ms(uint32_t ms)
{while(ms--){os_delay_us(1000);system_soft_wdt_feed();//喂狗}
}//发送数据函数
void hc595d_send_byte(uint8_t data)
{uint8_t i;for(i = 0;i < 8;i++){if(data & (0x80>>i)){GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//IO4高电平}else{GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);//IO4低电平}GPIO_OUTPUT_SET(GPIO_ID_PIN(13),0);//先拉低os_delay_us(5);//适当延时GPIO_OUTPUT_SET(GPIO_ID_PIN(13),1);//上升沿将一位数据移入移位寄存器os_delay_us(5);//适当延时}
}
//锁存函数
void hc595d_latch_data(void)
{GPIO_OUTPUT_SET(GPIO_ID_PIN(15),0);//先拉低os_delay_us(5);//适当延时GPIO_OUTPUT_SET(GPIO_ID_PIN(15),1);//上升沿将数据送入锁存寄存器os_delay_us(5);//适当延时
}void driver_motor(uint8_t j)
{/** 译码器	ESP_IO12	ESP_IO2* MOTOR_L	MOTOR_C		MOTOR_H		转向* 1		1			0			逆时针* 1		0			0			x* 1		0			1			x* 1		1			1			逆时针* */hc595d_send_byte(j);//发送1byte数据hc595d_latch_data();//锁存GPIO_OUTPUT_SET(GPIO_ID_PIN(12),1);GPIO_OUTPUT_SET(GPIO_ID_PIN(2),0);GPIO_OUTPUT_SET(GPIO_ID_PIN(5),j%2);//led监视os_printf("j:%2d on\r\n",j);delay_ms(1000);GPIO_OUTPUT_SET(GPIO_ID_PIN(12),0);
}void user_init(void)
{system_soft_wdt_feed();//喂狗PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);//IO4-SERPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);//IO15-RCKPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);//IO13-SCKPIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);//IO12-MOTOR_CPIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);//IO2-MOTOR_HPIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);//IO5-LED//8266作为TCP客户端,目标端口为6000,IP地址见串口打印,此要先获取Tcp服务端的ip地址tcp_client_init();
}static const partition_item_t at_partition_table[] = {{ SYSTEM_PARTITION_BOOTLOADER, 						0x0, 												0x1000},{ SYSTEM_PARTITION_OTA_1,   						0x1000, 											SYSTEM_PARTITION_OTA_SIZE},{ SYSTEM_PARTITION_OTA_2,   						SYSTEM_PARTITION_OTA_2_ADDR, 						SYSTEM_PARTITION_OTA_SIZE},{ SYSTEM_PARTITION_RF_CAL,  						SYSTEM_PARTITION_RF_CAL_ADDR, 						0x1000},{ SYSTEM_PARTITION_PHY_DATA, 						SYSTEM_PARTITION_PHY_DATA_ADDR, 					0x1000},{ SYSTEM_PARTITION_SYSTEM_PARAMETER, 				SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 			0x3000},
};void ICACHE_FLASH_ATTR user_pre_init(void)
{if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {os_printf("system_partition_table_regist fail\r\n");while(1);}
}

将以下代码加入到smart_config->user中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZ2kj4Vk-1669960267100)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202130535246.png)]

更改头文件user_config.h

#ifndef __USER_CONFIG_H__
#define __USER_CONFIG_H__void delay_ms(unsigned int ms);
void hc595d_send_byte(unsigned char data);
void hc595d_latch_data(void);
void driver_motor(unsigned char j);void tcp_client_init();#endif

2.5编译烧录及运行结果

编译方法:保存(一定要先保存)-> Clean -> Build

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KwLS025W-1669960267102)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202130850451.png)]

编译结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0no8sJk-1669960267104)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202131003116.png)]

烧录方式见上一篇文章讲解基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录 (zsxq.com)

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDwAoEqq-1669960267106)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202131811486.png)]

开启RK3399-TCP服务器后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLo2a4TT-1669960267109)(D:\AiThinkerIDE_V1.5.2\文章\image-20221202132230158.png)]

参照本篇只需实现能够连接上WiFi即可,如要连接TCP服务器,下篇将会详细讲解RK3399服务器端代码,以及交互界面的制作,最终将完整实现本产品的制作


http://chatgpt.dhexx.cn/article/LdcdJfLh.shtml

相关文章

ESP8285 ESP-AT编译流程和操作步骤

ESP8282ESP-AT编译流程和操作步骤 ESP8285 相当于ESP8266EX 1M SPI Flash ,他的编译工具和ESP-AT 都是跟ESP8266EX 一样的. 他的AT指令不能做OTA分区. 由于flash空间原因. 个人理解 配置好 esp8285 的编译工具链 setup-toolchain export PATH"$PATH:$HOME/xtensa-lx1…

Sipeed M1W内部esp8285固件烧录教程

Sipeed 的K210是真的香啊&#xff0c;但是内部的这个esp8285是做的真的不咋地。买回来之后这个8285折腾死我了&#xff0c;好几次固件出问题&#xff0c;掉固件&#xff0c;问了客户姐姐和群主“泽畔”大佬才解决&#xff0c;所以总结下。 下载固件&#xff1a; 首先我们需要先…

ESP8266与ESP8285开发时有什么区别

ESP8266与ESP8285开发时有什么区别 ESP8266与ESP8285开发时有什么区别烧录环节的改变编译前Makefile文件的更改 ESP8266与ESP8285开发时有什么区别 ESP8266模块在WiFi联网领域已经被广泛使用&#xff0c;但是ESP8266芯片是需要外挂Flash芯片的&#xff0c;这样就使模块不能做的…

ESP8285 sdkconfig

ESP8285与ESP8266使用同一套SDK&#xff0c;ESP8285内部集成了1MB或2MB的SPI FLASH&#xff0c;DOUT模式&#xff0c;所以编译和下载时需要将SPI MODE设置为DOUT模式&#xff0c;编译代码之前先执行make menuconfig ->Serial flasher config->Flash SPI mode->DOUT&am…

探索ESP8285(1)搭建arduino开发ESP8285环境搭建

CCC_122&#xff1a;博客只用于学习交流&#xff0c;不涉及任何商业用途&#xff0c;如果有错误之处&#xff0c;欢迎指正。 前言&#xff1a;ESP8285其实是ESP8266的升级版本&#xff0c;两者可以共用同一套SDK&#xff0c;只是ESP8285内部集成了1MB Flash&#xff0c;SPI Mod…

【开发环境准备】更新板载ESP8285固件

更新板载 ESP8285 固件 1. 简介: 目前 MaixPy 系列采用 M1W 模块的作为核心模块的开发板有: MaixDock(M1W), MaixGo 通常情况下我们不需要更新模块内部 WIFI SOC ESP8285 的固件,但是如果使用过程中存在 bug,以及有新版本的固件发布时我们就可以更新固件 MaixDock、Maix…

基于RK3399ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录

基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录 本系列文章讲详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法&#xff0c;从硬件连接到网络通信再到软件实现&#xff0c;本产品所用开发板为RK3399以及MP08_2019/11/03 , 如有疑问与见解&#xff…

ESP8285调试记录

引言 1.1. 目的 ESP8285模组ESP-IDF(Espressif IoT Development Framework&#xff09;进行软件开发。包括编译环境搭建&#xff0c;客制化AT&#xff0c;API开发&#xff0c;调试下载等。 ESP-IDF介绍 2.1. 概述 ESP8285和ESP8266的代码是兼容的&#xff0c;8285是内置FlashS…

ESP8285开发套件、比ESP8266好,利用率比ESP-01更好

ESP8285 前言本人微信号&#xff1a;you-yu一、ESP8285和ESP8286&#xff1f;比ESP-01S可用GPIO多二、开发工具&#xff1f;下图是一个3D预览图下面是实物图&#xff1a;ESP8285 开发下载板下面是由ESP8285 开发出来的成品&#xff1a;然后再来两张成品图&#xff1a;总结 前言…

计算机网络(三)—— 数据链路层

本文幕布&#xff1a; 文档链接: https://www.mubucm.com/doc/7psaav2QHtm 密码: 9twi 文章目录 第三章 数据链路层3.0 数据链路层1. 数据链路层的信道类型 3.1 使用点对点信道的数据链路层3.1.1 数据链路和帧1. 链路&#xff08;link&#xff09;2. 数据链路&#xff08;data …

OpenHarmony网络应用开发

总目录&#xff1a; 文档链接: https://mubucm.com/doc/2sINVHMg9Pm 密码: mkxb 本文幕布&#xff1a; 文档链接: https://www.mubucm.com/doc/4hviFn1y1nm 密码: q2pe 课程链接&#xff1a; https://www.bilibili.com/video/BV1tv411b7SA?spm_id_from333.999.0.0 文章目录 …

XRHT系列电钢琴实训室配置方案及清单

建设背景 国家教育部为深入贯彻落实中央有关教育信息化的战略部署&#xff0c;完成《国家中长期教育改革和发展规划纲要&#xff08;2010-2020年&#xff09;》确定的教育信息化目标任务、全面深入推进“十三五”教育信息化工作&#xff0c;在《关于“十三五”期间全面深入推进…

【云驻共创】 JAVA常用的开发工具有哪些?

前言 俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。工匠想要使他的工作做好&#xff0c;一定要先让工具锋利。比喻要做好一件事&#xff0c;准备工具非常重要。对于我们做程序员的来说也是一样的&#xff0c;想要提高开发效率&#xff0c;也需要选择好自己的开发工具…

taohui.org.cn建站历程

一直以来都在Qzone、CSDN等上面写博客&#xff0c;偶尔有些想法就在Paas平台上搭建服务&#xff0c;新浪和曾经的google上都用过其appengine。可是在别人的平台上写东西&#xff0c;总归有些不方便&#xff0c;有受制于人的感觉。《深入理解Nginx》这本书的在线支持站点&#x…

64位投影机专业测试软件,软件分享 篇十四:利用投影仪提高生活质量 —— 自用软件推荐...

软件分享 篇十四:利用投影仪提高生活质量 —— 自用软件推荐 2019-12-30 21:08:51 8点赞 121收藏 6评论 自从家里购入了投影仪以后,电视就变成摆设了 。。。本篇分享我自己经常用的几个投影软件产品评测 篇七:NAS影片播放神器 —— 新开发版体验测试V19.0KODI这款播放器相信…

强强联手,丝滑办公新体验!IdeaHub+华为云会议实测

目录 1. 前言 2. 软硬结合&#xff0c;天生一对 3. 全方位功能体验 3.1 IdeaHub接入华为云会议 3.2 随时随地一键开会 3.3 天生高清 3.3.1 高清视频 3.3.2 纯净音质 3.3.3 智能导播、智能音幕 3.4 天生融合 3.4.1 开会白板 3.4.2 无线投屏 3.4.3 一键流转 3.4.4 …

密码学(二月最佳)

《主干目录》 第一代加密 隐藏 第二代加密 移位 替代 同音替代 第三代加密 维吉尼亚加密 第四代加密 Enigma(恩尼格玛机) 第五代加密 DES 第六代加密 RSA 第七代加密 量子加密 密码学数千年的发展史&#xff0c;加密与解密不断博弈。 加密解密算法层出不穷&#xff0c;因此抓住…

【数智化案例展】深农集团——守护深圳“菜篮子”,腾讯安全携手深农集团保供稳价格...

腾讯安全案例 本项目由腾讯安全投递并参与“数据猿行业盘点季大型主题策划活动——《2022中国企业数智化转型升级创新服务企业》榜单/奖项”评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 深圳全面升级疫情管控措施后&#xff0c;农产品供应商情况如何&#xff0c;相…

MAXHUB会议平板的无线投屏怎么用?

过去,一个功能完备的会议室中,至少要备齐白板、投影仪、幕布、电脑、音响等设备才能保证会议内容能够完整的展现。因此稍微小一点的会议室就会被塞得满当当的。另外,投影仪受光线影响,还会出现投影不清晰的情况,需要把会议室光线调暗,因此开会时总是黑漆漆的。现在,智能…

如何在Ubuntu上安装OnlyOffice Docs 7.1?

如何在Ubuntu上安装OnlyOffice Docs 7.1&#xff1f; 什么是OnlyOffice Docs&#xff1f; OnlyOffice Docs是一套在线办公软件&#xff0c;可以打开阅读并编辑文档、表格和幻灯片文件&#xff0c;完全兼容开放XML格式Office文档&#xff1a;.docx、.pptx、.xlsx&#xff0c;并…