这次实验了一个物联网模块,ESP8266,买开发板的时候,顺带买了一个小屏幕,于是想着做一个需要联网,才能体现价值的东西,那就做一个天气预报机吧。
这名字怪怪的
首先是这个ESP8266的开发环境,用的是安可信的IDE,目前我手里用的是1.0的版本。这个IDE的主体就是eclipse,配合了它的一系列工具,就变成了可以开发,编译,烧写的工作环境了。
开发环境的搭建可以参考如下连接
开发环境搭建
使用的是RTOS系统,所以用的是ESP8266_RTOS_SDK,项目的话,以SDK中自带的\examples\get-started这个项目为基础,直接在上面开发自己的代码即可。
所以,拷贝了一份get-started代码,作为开发项目环境。
这样不需要自己创建项目了,机智的一批
包括了联网,获取天气信息,屏幕显示等过程。
这里模拟的http请求,请求一个公共服务网站提供的接口。这里提供的地址可以免费获得天气情况哦,真是处处都有好心人。
参考http_request.c,将http请求修改一下即可
/* Constants that aren't configurable in menuconfig */
#define WEB_SERVER "ws.webxml.com.cn"
#define WEB_PORT 80
#define WEB_URL "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx"
static const char *TAG = "example";
static const char *REQUEST = "GET /WebServices/WeatherWS.asmx/getWeather?theCityCode=762&theUserID= HTTP/1.1\r\n"
"Host: ws.webxml.com.cn\r\n"
"User-Agent: esp-idf/1.0 esp32\r\n"
"\r\n";
这里是一个公共的接口,重新编译,然后烧写,就能收到天气信息了
这里用了一个任务来循环获取天气,可以设置延迟,最好不要频繁请求,人家都免费给你用了,你还糟蹋人家,不合适
这里用了一块I2c的oled显示屏幕,那么我们可以参照i2c的user_main.c,进行开发。不过这个demo挺坑的,引脚都搞反了
并且需要移植一下STM8版本的demo程序,将demo中的程序复制过到项目路径下
然后修改cmake.txt,增加oled.c。不过好像不增加也行,比较神奇
只需要修改一下iic的写命令和写数据两个函数以及初始化函数
/*definition--------------------------------------------*/
/*
@brief IIC写入命令
@param IIC_Command:写入的命令
@retval 无
*/
static void Write_IIC_Command(unsigned char IIC_Command)
{
int ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, 0x78 , ACK_CHECK_EN);
i2c_master_write_byte(cmd, 0x00, ACK_CHECK_EN);
i2c_master_write_byte(cmd, IIC_Command, ACK_CHECK_EN);
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_EXAMPLE_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
}
/*
@brief IIC写入数据
@param IIC_Data:数据
@retval 无
*/
static void Write_IIC_Data(unsigned char IIC_Data)
{
int ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, 0x78 , ACK_CHECK_EN);
i2c_master_write_byte(cmd, 0x40, ACK_CHECK_EN);
i2c_master_write_byte(cmd, IIC_Data, ACK_CHECK_EN);
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_EXAMPLE_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
}
static esp_err_t i2c_master_init()
{
int i2c_master_port = I2C_EXAMPLE_MASTER_NUM;
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = I2C_EXAMPLE_MASTER_SDA_IO;
conf.sda_pullup_en = 1;
conf.scl_io_num = I2C_EXAMPLE_MASTER_SCL_IO;
conf.scl_pullup_en = 1;
conf.clk_stretch_tick = 300; // 300 ticks, Clock stretch is about 210us, you can make changes according to the actual situation.
ESP_ERROR_CHECK(i2c_driver_install(i2c_master_port, conf.mode));
ESP_ERROR_CHECK(i2c_param_config(i2c_master_port, &conf));
return ESP_OK;
}
然后修改一下gpio对应iic的端口,放在oled.h中
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "driver/i2c.h"
#define I2C_EXAMPLE_MASTER_SCL_IO 14 /*!< gpio number for I2C master clock */
#define I2C_EXAMPLE_MASTER_SDA_IO 2 /*!< gpio number for I2C master data */
#define I2C_EXAMPLE_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */
/*definition--------------------------------------------*/
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define SIZE 16 //显示字符的大小
#define Max_Column 128 //最大列数
#define Max_Row 64 //最大行数
#define X_WIDTH 128 //X轴的宽度
#define Y_WIDTH 64 //Y轴的宽度
然后就可以进行调用封装好的显示函数进行显示了。在读取到http返回的地方,就可以直接将数据通过接口
void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr)
进行显示。
不过暂时不支持中文,所以目前天气预报还显示乱码。
解决方案在这里,是下一篇文章
单片机—ESP8266中oled中文显示(完美方案)
最近的疫情又开始抬头了。公司老板也开始作妖,加班也清零了,年假也清了,休个年假还只发基本工资,好家伙,休病假还给一半了。不过我一点也不在乎,甚至为他感到可笑。
他绞尽脑汁也就是能克扣仨瓜俩枣,员工偷懒一天,不也就扯平了么,你得到了员工的人,也得不到员工的心啊。