ESP8266-01是最小的ESP8266模块,只有8个管脚。在这些VCC中,GND,RST(复位)和CH_PD(片选)不是I/O引脚,但需要模块操作。这样就可以将GPIO0,GPIO2,TX和RX用作可能的I/O引脚,但即使这些引脚都具有预先分配的功能。 GPIO0和GPIO2确定模块以哪种模式启动,并且TX/RX引脚用于对模块进行编程以及用于串行I/O(通常用于调试)。 GPIO0和GPIO2需要连接上拉电阻,以确保模块正确启动。
步骤2:ESP8266编程技巧(espcomm失败)
使用Arduino IDE编程ESP8266时(请参阅ESP8266-01 Wifi Shield),有时(通常)会在Arduino IDE中收到错误消息,例如:-
esp_com打开失败
错误:失败打开COM33错误:espcomm_open失败
错误:espcomm_upload_mem失败
在这种情况下,请按照以下步骤操作:-
检查是否已在Arduino工具菜单中选择了ESP8266板
检查是否已在Arduino工具菜单中选择了COM端口
将GPIO0接地的ESP8266重新通电(干净)电源应用程序,请参阅下文)
如果3)不能解决问题,请从计算机上拔下USB电缆,等待几秒钟,然后再将其重新插入
如果4)不能解决问题,从PC上拔掉USB电缆,关闭Arduino IDE,打开Arduino IDE,重新插入USB电缆。
在给ESP8266供电时,将GPIO0接地后,请确保干净地供电。不要摇晃连接。 ESP8266 led应该亮起并保持不闪烁。
步骤3:最佳技巧–使用I2C
使ESP8266-01额外输入的最好技巧是使用I2C接口。
一种选择是使用GPIO0和GPIO2作为I2C总线。
使模块正确启动所需的上拉电阻可以加倍,因为I2C总线上拉电阻和总线上的其他从器件均是集电极开路,因此不应下拉总线通电时。但是,在某些情况下,从站(尤其是具有备用电池的从站)可能会卡住并压低总线。在这种情况下,您需要隔离总线,直到ESP8266进入引导阶段为止。
通过为I2C总线使用TX和RX可以避免此问题
注意:
GPIO1(TX)用作数据线,因为在加电时,您总是会在GPIO1上获得一些调试输出。没有办法抑制此输出,但时钟线(RX)会保持高电平,因此这些数据都不会被时钟传给从机
在对ESP8266进行编程时,RX线会连接到ESP8266。程序员的输出。编程结束时,ESP8266会重新启动,并且330保护电阻可防止RX短路编程器的输出驱动器。
I2C串联电阻可为TX,RX提供防止I2C总线短路的保护
ESP8266是3.3V器件,因此最好使用3.3V I2C从器件。如今,许多(但不是全部)I2C器件均为3.3V。 “通常,在一个设备的电压高于另一个设备的电压的系统中,有可能通过I2C连接两个设备,而它们之间没有任何电平转换电路。技巧是将上拉电阻器连接到两个电压中的较低者。”(SparkFun I2C教程)对于5V和3.3V器件的混合,将上拉电阻器连接到3.3V线,如上所示。
使用I2C是向ESP8266-01添加多通道A-to-D转换器的好方法,该转换器不会暴露底层模块的单个ADC输入。例如,使用Adafruit 12位I2C 4通道ADC或模拟输出SparkFun的I2C DAC Breakout – MCP4725板。 I2C总线还提供许多其他类型的传感器。
有关克服I2C问题的更多信息,请参见http://www.i2c-bus.org/i2c-primer/common-problems.。.。另请参阅I2C电池后备RTC可靠启动的简短方法,以帮助清除总线
第4步:将GPIO0/GPIO2用于OUTPUT,将RX用于INPUT
虽然可以通过WiFi连接发送调试消息,但是使用TX连接通常很方便。下一个示例显示如何将GPIO0和GPIO2用作输出,将RX用作输入。
使用
Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);
允许您将RX用作通用输入(或其他输出),同时仍将调试消息写入串行。 RX引线中的330欧姆电阻再次连接到Flash编程器,可以防止编程器的驱动器短路。注意:必须先打开S1才能对ESP8266进行编程。
可以从草图访问TX引脚,因为GPIO1和RX为GPIO3
使用GPIO0作为输出时如何重新编程
注意:需要将GPIO0接地才能进入编程模式。如果您将其拉高,则将其接地可能会损坏ESP8266芯片。当代码驱动GPIO0输出时,对ESP8266进行重新编程的安全方法是:-
a)关闭开发板电源 b)短GPIO0到gnd c)打开开发板电源,使其进入编程模式由于GPIO0短路
d)消除了GPIO0的短路,因此在程序运行时您不会短路输出
e)重新编程开发板 f)必要时重启开发板。
步骤5:另一个技巧-使用GPIO0/GPIO2驱动继电器并读取按钮
这里是另一种配置方式别针。注意:仅当您的继电器模块具有隔离的输入(N1和N1-com)时,此技巧才有效。由于此限制和支持代码的复杂性,上一个示例以RX作为输入为佳。
使用ESP8266 GPIO0/GPIO2/GPIO15引脚已经介绍了如何一起使用GPIO0/GPIO2获得额外的输入。在这里,该示例将扩展为使用GPIO0作为继电器驱动器输出,并使用GPIO0/GPIO2作为输入。
此处是pdf格式的原理图。
此处GPIO0被用作输出以驱动继电器,GPIO0/GPIO2用作输入来读取瞬时按钮,该按钮除了可以通过WiFi连接进行远程控制之外,还可以用作手动操作来打开和关闭继电器。如果在通电时按下瞬时按钮,则也可用于启用配置模式。
这里的诀窍是在ESP8266模块初始化时仍保持GPIO0和GPIO2为高电平的同时进行所有操作。
上拉电阻R1和R3为这两个引脚提供了必要的高电平,但是必须确保连接到GPIO0和GPIO2的任何额外电路都不能将引脚拉低。光电隔离继电器连接在+ 3.3V和GPIO0之间。这样可在启动时使GPIO0保持高电平,但在启动后允许GPIO0作为输出,并使继电器输入接地以操作继电器。模块初始化时是否操作瞬时按钮都没有关系,因为只需将GPIO0连接到GPIO2并将这两个都连接到其上拉电阻即可。
检测配置模式
使用ESP8266作为一个临时访问点,您可以按此处所述通过网页进行配置。该过程的一部分是在加电时使用按钮或短路链接来指示要进入配置模式的软件。
ESP8266模块初始化后,将运行 setup()代码。在该代码中,要检测瞬时按钮是否被按下,您无需使GPIO0为低电平即可为按钮提供GND,然后检查GPIO2输入是否为低。该检查的副作用是,当设备进入配置模式时,继电器将始终处于运行状态。一旦看到继电器操作,就可以释放按钮,因为届时将已检测到其输入。这是一些示例代码,可在 setup()
boolean configMode = false; // not in config mode normally
void setup() {
pinMode(0, OUTPUT);
digitalWrite(0, LOW); // make GPIO0 output low
// check GPIO2 input to see if push button pressed connecting it to GPIO0
configMode = (digitalRead(2) == LOW);
if (configMode) {
// start AP and get ready to serve config web page
// leave relay on to indicate in config mode
//。..。..
} else {
// normal usage
// make GPIO0 HIGH to turn off the relay
digitalWrite(0, HIGH);
//。..。.
}
// rest of setup()
}
检测手动覆盖按钮
中进行此操作。开机时按下按钮以启用配置模式。除了能够通过WiFi链接控制继电器之外,我们还希望使用该按钮作为手动替代来打开和关闭继电器。
此处不介绍继电器的WiFi控制,但可以使用pfodApp轻松完成。有关如何使用pfodDesigner为ESP8266模块生成Arduino代码的信息,请参见OLIMEX菜单生成器。
本节将介绍如何检测何时按下按钮,指示用户想要切换继电器,即打开它。如果是OFF,则将其打开;如果关闭,则将其打开。原理图与上面相同,所有技巧都在代码中。有两种情况需要考虑:-
继电器已关闭,用户希望使用按钮将其打开,
继电器已打开,用户希望
继电器关闭,用户希望使用按钮将其打开。
在这种情况下, GPIO0为高电平。在这种情况下,实际上GPIO0可以作为输入,因为上拉电阻R1将确保继电器不会打开。那是诀窍。在这种情况下,将GPIO0设为输入,将GPIO2输出设为LOW,然后当用户按下按钮时,将发生两件事:-a)由于GPIO2通过按钮提供的接地,继电器将打开,并且b)输入GPIO0将变为低电平。该代码检查输入GPIO0的状态,并在输入GPIO0变为低电平时知道使用已按下按钮并希望继电器打开。然后,该代码使GPIO0变为Output LOW,以在释放按钮时使继电器保持打开状态。
继电器打开,用户希望使用按钮将其关闭。
在这种情况下,从上述情况开始,GPIO0为输出低电平,继电器保持打开状态。现在,在这种情况下,将GPIO2设为输入(由R3上拉),然后当用户按下按钮时,输入GPIO2被GPIO0上的LOW输出拉低。当用户释放按钮时,代码将检测到低电平到高电平的过渡,然后将GPIO0设为输入,由于上拉电阻R1而释放继电器,并使GPIO2变为输出LOW,以针对上述情况i)进行设置。
还有另一个窍门。对于情况ii),我们需要GPIO2作为输入,该输入可检测到从低电平到高电平的转换以关闭继电器。但是,如果我们在情况i)的末尾制作GPIO2并输入,那么当用户释放他们刚刚按下以打开继电器的按钮时,我们将获得从低到高的转换。为避免立即再次关闭继电器,将忽略继电器打开后的第一个从低到高的过渡,因为这只是用户释放他们按下的按钮来打开继电器。
示例循环( )继电器手动超越控制代码
在此代码中,为简单起见,我忽略了开关的反跳。输入应在任何实际应用中进行去抖动。
示例代码在此处,ESP8266_01pinMagic_1.ino
再次使TX/RX引脚可用进行串行调试或用作其他I/O
结论
此页显示了如何充分利用ESP8266-01上可用的有限引脚。将GPIO0/GPIO2用作I2C总线可提供最大的扩展,但是如果您的项目不使用I2C,您仍可以使用GPIO0/GPIO2来驱动继电器并检测按钮输入。无论哪种情况,TX/RX都可用于串行调试,或者如果您通过WiFi链接发送调试打印语句,则这些引脚也可用于常规I/O。
责任编辑:wv
-
指示灯
+关注
关注
3文章
415浏览量
28284 -
ESP8266
+关注
关注
50文章
962浏览量
45001
发布评论请先 登录
相关推荐
评论