单片机---ESP8266天气预报机开发

背景

这次实验了一个物联网模块,ESP8266,买开发板的时候,顺带买了一个小屏幕,于是想着做一个需要联网,才能体现价值的东西,那就做一个天气预报机吧。
单片机---ESP8266天气预报机开发_第1张图片
这名字怪怪的
单片机---ESP8266天气预报机开发_第2张图片

环境搭建

首先是这个ESP8266的开发环境,用的是安可信的IDE,目前我手里用的是1.0的版本。这个IDE的主体就是eclipse,配合了它的一系列工具,就变成了可以开发,编译,烧写的工作环境了。
开发环境的搭建可以参考如下连接
开发环境搭建
单片机---ESP8266天气预报机开发_第3张图片

开发准备

使用的是RTOS系统,所以用的是ESP8266_RTOS_SDK,项目的话,以SDK中自带的\examples\get-started这个项目为基础,直接在上面开发自己的代码即可。
所以,拷贝了一份get-started代码,作为开发项目环境。
单片机---ESP8266天气预报机开发_第4张图片
这样不需要自己创建项目了,机智的一批
单片机---ESP8266天气预报机开发_第5张图片

开发过程

包括了联网,获取天气信息,屏幕显示等过程。

联网和获取天气信息

这里模拟的http请求,请求一个公共服务网站提供的接口。这里提供的地址可以免费获得天气情况哦,真是处处都有好心人。
单片机---ESP8266天气预报机开发_第6张图片

参考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";

这里是一个公共的接口,重新编译,然后烧写,就能收到天气信息了
单片机---ESP8266天气预报机开发_第7张图片
这里用了一个任务来循环获取天气,可以设置延迟,最好不要频繁请求,人家都免费给你用了,你还糟蹋人家,不合适
单片机---ESP8266天气预报机开发_第8张图片

天气显示

这里用了一块I2c的oled显示屏幕,那么我们可以参照i2c的user_main.c,进行开发。不过这个demo挺坑的,引脚都搞反了
单片机---ESP8266天气预报机开发_第9张图片

并且需要移植一下STM8版本的demo程序,将demo中的程序复制过到项目路径下
单片机---ESP8266天气预报机开发_第10张图片
然后修改cmake.txt,增加oled.c。不过好像不增加也行,比较神奇
单片机---ESP8266天气预报机开发_第11张图片

只需要修改一下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中文显示(完美方案)

结束语

最近的疫情又开始抬头了。公司老板也开始作妖,加班也清零了,年假也清了,休个年假还只发基本工资,好家伙,休病假还给一半了。不过我一点也不在乎,甚至为他感到可笑。
他绞尽脑汁也就是能克扣仨瓜俩枣,员工偷懒一天,不也就扯平了么,你得到了员工的人,也得不到员工的心啊。
单片机---ESP8266天气预报机开发_第12张图片

你可能感兴趣的:(单片机,单片机,ESP8266,oled,天气预报)