用于Arduino、esp32或esp8266的Ebyte LoRa E32(SX1278)设备:WOR(无线唤醒)微控制器和新的WeMos D1mini拓展板 - 第七部分

作者:renzo mischianti - 发布于2020年1月17日 - 更新于2021年6月21日

我们已经看到这个设备(基于流行的SX1276/SX1278无线模块的E32 UART LoRa)是如何管理省电的,但是如果我们只对e32使用省电,微控制器就会继续保持活跃,但是我们可以使用AUX引脚来解决这个问题。

图 1Sx1278 Sx1276 无线Lora uart模块 串行3000米arduino 433 rf

 

如果你有像冻结设备的麻烦,你必须把一个上拉的4.7k电阻或更好的连接到设备AUX引脚。

我们现在使用的是面包板模式,但我们要做一些修正,我们要用D3和D4代替D2和D3,这样SDA和SCL(i2c协议)就保持自由。

 

图 2D1mini esp8266引脚布局

 因此,新的连接模式变成这样

 

图 3LoRa E32-TTL-100和Wemos D1 mini完全连接

 当你处于睡眠模式时,e32把接收到的数据放在缓冲区,并立即转为低电平,当数据准备好时,返回高电平,低电平,这是唤醒微控制器的最佳方式。

 

图 4接收时LoRa e32 AUX针脚

 

1. WeMos D1 mini 唤醒

作为e32设备,WeMos有一些睡眠类型,但在这个测试中,我们将使用带有GPIO唤醒的浅睡眠。

请参考 "WeMos D1 mini (esp8266),三种睡眠模式管理节能--第四部分",了解关于睡眠模式的详细说明。

1.1.如何使WeMos D1 mini进入睡眠状态

将单片机断电的命令是这样的

 

// Enter power down state with ADC and BOD module disabled.
// Wake up when wake up pin is low.
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

但我们必须规定,当AUX引脚为低电平时,设备必须被唤醒。

// Allow wake up pin to trigger interrupt on low.
attachInterrupt(1, AUX_PIN, LOW);
 
// Enter power down state with ADC and BOD module disabled.
// Wake up when wake up pin is low.
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
 
// Disable external pin interrupt on wake up pin.
detachInterrupt(1);

因此,接收传输的代码变得如此:

/*
 * LoRa E32-TTL-100
 * Receive fixed transmission message on channel and wake up.
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO or esp8266
 * M0         ----- LOW
 * M1         ----- HIGH
 * TX         ----- RX PIN D3 (PullUP)
 * RX         ----- TX PIN D4 (PullUP)
 * AUX        ----- PIN D5
 * VCC        ----- 5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"
#include <ESP8266WiFi.h>
 
#define FPM_SLEEP_MAX_TIME           0xFFFFFFF
void callback() {
  Serial.println("Callback");
  Serial.flush();
}
 
// ---------- esp8266 pins --------------
LoRa_E32 e32ttl(D3, D4, D5);  // Arduino RX <-- e32 TX, Arduino TX --> e32 RX
// -------------------------------------
void printParameters(struct Configuration configuration);
//The setup function is called once at startup of the sketch
void setup()
{
    Serial.begin(9600);
    while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB
    }
    delay(100);
 
    e32ttl.begin();
        e32ttl.setMode(MODE_2_POWER_SAVING);
 
//  e32ttl.resetModule();
    // After set configuration comment set M0 and M1 to low
    // and reboot if you directly set HIGH M0 and M1 to program
    ResponseStructContainer c;
    c = e32ttl.getConfiguration();
    Configuration configuration = *(Configuration*) c.data;
    printParameters(configuration);
 
    configuration.ADDL = 3;
    configuration.ADDH = 0;
    configuration.CHAN = 0x04;
    configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
    configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
 
    configuration.OPTION.fec = FEC_1_ON;
    configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
    configuration.OPTION.transmissionPower = POWER_20;
 
    configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
    configuration.SPED.uartBaudRate = UART_BPS_9600;
    configuration.SPED.uartParity = MODE_00_8N1;
 
    e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
    printParameters(configuration);
    // ---------------------------
    delay(1000);
    Serial.println();
    Serial.println("Start sleep!");
 
    //wifi_station_disconnect(); //not needed
    gpio_pin_wakeup_enable(GPIO_ID_PIN(D5), GPIO_PIN_INTR_LOLEVEL);
    wifi_set_opmode(NULL_MODE);
    wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
    wifi_fpm_open();
    wifi_fpm_set_wakeup_cb(callback);
    wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME);
    delay(1000);
 
    Serial.println();
    Serial.println("Start listening!");
 
}
 
// The loop function is called in an endless loop
void loop()
{
    if (e32ttl.available()  > 1){
        ResponseContainer rs = e32ttl.receiveMessage();
        // First of all get the data
        String message = rs.data;
 
        Serial.println(rs.status.getResponseDescription());
        Serial.println(message);
    }
}
 
void printParameters(struct Configuration configuration) {
    Serial.println("----------------------------------------");
 
    Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
    Serial.println(F(" "));
    Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);
    Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);
    Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
    Serial.println(F(" "));
    Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
    Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
    Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
 
    Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
    Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
    Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
    Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
    Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
 
    Serial.println("----------------------------------------");
 
}

结果是串口在第91行停止,当我们收到信息时,e32自己唤醒并把AUX置于低位,所以Arduino用AUX引脚的中断唤醒。

这里是发射端代码

/*
 * LoRa E32-TTL-100
 * Send fixed broadcast transmission message to a specified channel.
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO or esp8266
 * M0         ----- HIGH
 * M1         ----- LOW
 * TX         ----- RX PIN D3 (PullUP)
 * RX         ----- TX PIN D4 (PullUP)
 * AUX        ----- PIN D5
 * VCC        ----- 5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"
 
LoRa_E32 e32ttl(D3, D4, D5); 
// -------------------------------------
 
void printParameters(struct Configuration configuration);
 
//The setup function is called once at startup of the sketch
void setup()
{
    Serial.begin(9600);
    while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB
    }
    delay(100);
 
    while (!e32ttl.begin()) {
            delay(2000); // wait for serial port to connect. Needed for native USB
        }
 
    e32ttl.setMode(MODE_1_WAKE_UP);
 
//  e32ttl.resetModule();
    // After set configuration comment set M0 and M1 to low
    // and reboot if you directly set HIGH M0 and M1 to program
    ResponseStructContainer c;
    c = e32ttl.getConfiguration();
    Configuration configuration = *(Configuration*) c.data;
    printParameters(configuration);
 
//  configuration.SPED.uartBaudRate = UART_BPS_9600;
//  configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
    configuration.ADDL = 0x01;
    configuration.ADDH = 0x00;
    configuration.CHAN = 0x04;
    configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
    configuration.OPTION.wirelessWakeupTime = WAKE_UP_750;
 
        configuration.OPTION.fec = FEC_1_ON;
        configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
        configuration.OPTION.transmissionPower = POWER_20;
 
        configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
        configuration.SPED.uartBaudRate = UART_BPS_9600;
        configuration.SPED.uartParity = MODE_00_8N1;
 
 
    e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
    printParameters(configuration);
    // ---------------------------
 
 
}
int i = 0;
// The loop function is called in an endless loop
void loop()
{
    i++;
    String mess = "Message to 00 03 04 deviceMessage to  ";
    String compMEss = mess+i;
 
    Serial.print(compMEss);
    Serial.print(" - ");
    ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, compMEss);
    Serial.println(rs.getResponseDescription());
 
    delay(8000);
 
}
 
void printParameters(struct Configuration configuration) {
    Serial.println("----------------------------------------");
 
    Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
    Serial.println(F(" "));
    Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);
    Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);
    Serial.print(F("Chan : "));  Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
    Serial.println(F(" "));
    Serial.print(F("SpeedParityBit     : "));  Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
    Serial.print(F("SpeedUARTDatte  : "));  Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
    Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
 
    Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
    Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
    Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
    Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
    Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
 
    Serial.println("----------------------------------------");
 
}

2. WeMos D1 mini 拓展板

我还创建了一个WeMos D1mini拓展板,非常有用地使用。

图 5LoRa E32-TTL-100和Wemos D1完全连接拓展板

 

 配置是这样的:

LoRa_E32 e32ttl(D3, D4, D5, D7, D6); 

你可以使用库中的所有例子,你可以使用D6和D7针脚来做一个完整的连接,或者禁用它们,用拨码开关把M0和M1放在你想要的地方。

图 6Milled WeMos D1 Shield LoRa EBYTE E32

 

 2.1.现在我们要进行焊接了

Ready to go

图 7WeMos D1miniLoRa E32拓展板开始焊接

 

图 8铣削WeMos D1拓展板LoRa EBYTE E32底部

 

图 9铣削WeMos D1拓展板LoRa EBYTE E32了

 Here the result of milled PCB

 

图 10铣削WeMos D1拓展板LoRa EBYTE E32安装

 Here the result with ordered PCB

 

图 11安装WeMos D1拓展板LoRa EBYTE E32

 

拓展板有一些跳线和拨码开关来配置M0和M1。

如果你想把M0和M1设置成一个固定的值,你必须把跳线放到F,如果你想通过引脚来控制,就把跳线放到P。

如果你设置为F,你必须把拨码开关放在属性值低或高。

 

图 12WeMos D1mini拓展板照片正面与描述

 2.2.购物清单

 

 你可以从这里获得pcb,而不需要额外的费用。 PCBWay

 

 这是我的圣诞礼物

图 13PCBWay圣诞礼盒

 

 

我选择这个制造商是因为在同样的成本下,它提供了优秀的质量,在第一个屏幕上,它可以做出无数的选择,适合每一个需求。

正如你在各种照片上看到的那样,这个板子非常漂亮,而且很容易焊接。

2.3.组装

Here the result

 

图 14安装WeMos D1拓展板的LoRa EBYTE E32

 

 3.Thanks

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WeMos D1 Wifi Arduino esp8266是一块基于esp8266芯片的Arduino开发用于开发智能家居、IoT等应用。下面是其使用步骤: 1. 安装驱动程序 在连接WeMos D1 Wifi Arduino esp8266到电脑上之前,需要安装它的CH340驱动程序,否则电脑无法识别该设备。 2. 连接到电脑 将WeMos D1 Wifi Arduino esp8266通过USB接口连接到电脑上,并选择正确的串口和波特率。 3. 安装Arduino IDE WeMos D1 Wifi Arduino esp8266可以通过Arduino IDE进行编程。在开始编程之前,需要先安装Arduino IDE。 4. 安装esp8266支持库 由于WeMos D1 Wifi Arduino esp8266基于esp8266芯片,所以需要安装esp8266支持库。在Arduino IDE中,点击工具->开发->Boards Manager,搜索esp8266,然后选择最版本进行安装。 5. 编写程序 在Arduino IDE中,选择WeMos D1 Wifi Arduino esp8266开发,并打开一个代码文件。然后就可以开始编写程序了。例如,可以通过WeMos D1 Wifi模块连接到无线网络,并通过网页服务器控制一个LED灯。 6. 上传程序 在编写好程序之后,就可以将程序上传到WeMos D1 Wifi Arduino esp8266中运行。点击Arduino IDE的“上传”按钮,即可将程序上传到WeMos D1 Wifi Arduino esp8266中。 7. 调试程序 在程序上传成功之后,可以通过串口监视器等方式进行调试,并查看程序的输出结果。如果需要修改程序,只需要重编辑代码,然后再次上传即可。 总之,WeMos D1 Wifi Arduino esp8266是一块非常方便的Arduino开发,使用它可以轻松实现智能家居、IoT等应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值