目录
较常用的WIFI模块为:NodeMCU ESP8266,ESP-01S这两种,两者比较相对容易使用的是ESP-01S,前者需要用Arduino进行编译,而后者只需要用我们常用的keil5就可以编译。NodeMCU ESP8266可单独作为一个开发板来使用,而ESP-01S只是一个简单的WIFI模块。以下将围绕ESP-01S来展开教程。
ESP-01S引脚如图

红色方框框出引脚为必须连接的引脚。同时注意圆圈圈出部分,模块3.3V的电源一定不能由USB转TTL模块提供,它带不动。
ESP-01S属于新版,相较与ESP-01模块它底部有引脚名标记,且去掉了电源指示灯,所以ESP-01S上电后只有蓝灯会闪烁一下,不会有其他现象发生。并且ESP-01S在串口通信时不需要接使能脚,而ESP-01需要拉高使能脚。
下面以STM32正点原子精英开发板为例开启应用教程
所使用到的文件均会上传
在【正点原子】精英STM32F103开发板资料 资料盘(A盘) 程序源码(库函数版本)中复制粘贴个跑马灯实验工程进行修改
WIFI模块所需文件的导入



所需导入的点C文件如图红圈所示


注意:更替前后文件夹名称未变,若未更替会报错!!!

更替后的usart.h文件

2.写个初始化文件(后续加入的功能初始化写进这里面,此为个人习惯,大家可自由发挥)

3.编写主函数


#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "hcsr04.h"
#include "SysTick.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//C库
#include <string.h>
const char *sub_topics[] = {"hjc225sub"}; //单片机接收数据主题
const char pub_topics[] = {"hjc225pub"}; //单片机发送数据主题
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
float lenth;
u8 adcx;
char PUB_BUF[256]; //上传数据buf
char* LED_BUF; //led状态上传buf
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
LED_Init(); //初始化与LED连接的硬件接口 //LED0=0;亮灯
delay_init(); //延时函数初始化
HCSR04_Init();
Usart1_Init(115200); //串口1,打印信息用
Usart2_Init(115200); //串口2,驱动ESP8266用
UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
}
int main(void)
{
Hardware_Init(); //初始化外围硬件
ESP8266_Init(); //初始化ESP8266
while(OneNet_DevLink()) //接入OneNET
delay_ms(300); //延时300ms
OneNet_Subscribe(sub_topics, 1);
while(1)
{
if(timeCount%100 == 0) //处理数据
{
if(LED0==0){
LED_BUF="1";
}
else if(LED0==1){
LED_BUF="0";
}
}
if(++timeCount >= 185) //发送间隔10s(400)(还需计算)
{
UsartPrintf(USART_DEBUG, "OneNet_Publish\r\n");
UsartPrintf(USART_DEBUG, "距离:%.1f",lenth);
lenth=Hcsr04GetLength();
sprintf(PUB_BUF,"#%.1f#%s",lenth,LED_BUF);
OneNet_Publish(pub_topics, PUB_BUF);
timeCount = 0;
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(3); //执行此行需15ms
if(dataPtr != NULL)
OneNet_RevPro(dataPtr);
delay_ms(10);
}
}
以上便是最初始的整个工程,下面讲解所需修改的部分
esp8266.c文件

onenet.c文件

mian.c文件

这三处是必须修改的地方
在esp8266.c文件中ESP8266_WIFI_INFO,参照格式修改成所需要连接的WIFI即可
下面对后面几处进行详解
使用WIFI模块那避免不了要使用到MQTT服务器,何为MQTT,大家可以参考我的一篇文章。MQTT服务器有很多,如阿里云、腾讯云、机智云、巴法云、EMQ服务器,通过我学习WIFI的经验,为了减少弯路,我推荐大家使用巴法云,使用其他的难免不了要搭建自己的服务器,耗时耗力,还需要花钱,过程十分繁琐,有能力者可以去尝试。
使用巴法云则esp8266.c文件中的ESP8266_ONENET_INFO不用修改
巴法云官网链接bemfa.com,进去之后用邮箱注册,便可使用巴法云MQTT服务器,注意我们这里使用的是MQTT设备云,从下图我们可以看到,注册登录后,我们有我们专属的私钥,可新建自己的主题。这里可以参考我一篇文章的应用部分MQTT协议介绍与应用
在onenet.c文件中DEVID改成自己的私钥,mian.c文件中sub_topics[ ] 、pub_topics[ ]改成自己的主题

对其进行总结:
要修改的地方有三个:
以上便是基础设置的内容
应用篇将分为控制部分和传输数据部分来进行讲解
控制部分:将以点亮【正点原子】精英STM32F103开发板上的LED灯为例,带大家学会用客户端软件MQTT.fx控制【正点原子】精英STM32F103开发板
传输数据部分:以超声波模块为例,将所测得数据上传
注意:ESP-01S的RX接开发板上的PA2,TX接PA3
只需要修改onenet.c文件即可,需要注意的是,记得引入对应的头文件,如:我们这里要控制LED灯,则需在onenet.c文件中引入led.h文件

需要修改的部分如图中框选,sub_buf是接收发来指令的数组,我们从客户端软件MQTT.fx发送1,则会打开LED灯,若想增加更多指令,添加执行条件和执行内容即可
如下图框选部分,是执行读取指令的代码,注意不要轻易删改

下面进行演示
接好ESP-01S

将代码烧录进单片机,然后上电,打开MQTT.fx,连接服务器,输入单片机接收数据主题(这里是hjc225sub,注意改成自己的)
输入指令,点击Publish发布

即可点亮LED灯


导入超声波模块驱动文件

修改main.c文件

初始化超声波模块

将超声波测量数据和LED状态拼接在一个数组内发送到客户端
将写好的代码烧录,并接好超声波模块(这里是超声波模块的Echo口接单片机的PB10,Tring接PB11,VCC接5V,GND接GND)

上电运行程序


以上便是ESP-01SWIFI模块的基础应用,后续还会更新在小程序和APP上控制单片机并读取数据,不足之处请指正!
本文章文件下载地址
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我有一个Controller,我想为这个Controller创建一个助手,我可以在不包含它的情况下使用它。我尝试像这样创建一个与Controller同名的助手classCars::EnginesController我创建的助手是moduleCars::EnginesHelperdefcheck_fuellogger.debug("chekingfuel")endend我得到的错误是undefinedlocalvariableormethod`check_fuel'for#有没有我遗漏的约定? 最佳答案 如果你真的想在Controll
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Testingmodulesinrspec目前我正在使用rspec成功测试我的模块,如下所示:require'spec_helper'moduleServicesmoduleAppServicedescribeAppServicedodescribe"authenticate"doit"shouldauthenticatetheuser"dopending"authenticatetheuser"endendendendend我的模块位于应用程序/服务/services.rb应用程序/服务/app_servi