LORA SX1278做的收发设计 检测温湿度显示到oled

166 阅读3分钟

 

lora模块用的是E19-433M20S2,亿佰特家的,这款是没有固件的,芯片是SX1278方案,不带天线接口,画板时要把天线引脚引出来;

他家还有一款SX1278方案模块带固件,和之前用过的E22一样,可以直接通过串口进行透传、配置;

程序的话改造的是官网的程序,移植到自己的cubemx生成的工程里面,移植的时候注意修改引脚、去掉一些硬件切换收发模式的程序、修改SPI收发函数为hal库函数,目前用的这款可以配置寄存器切换收发;

有需要全部工程文件的可以私聊我

工程文件程序功能包括lora主板检测温湿度,显示在oled显示屏,超过阈值进行报警,oled显示报警的指标,按下按键后将数据发送到副板,指示灯提示,再按一下停止发送;副板解析数据打印到电脑串口

硬件包括上述软件对应的原理图和PCB,还包括一款市面常见的f103C8T6最小系统板的原理图pcb文件,花了不少积分才找到的;

中间碰见的小坑,DS18B20一直检测不到,因为家里没有示波器,搞半天其实是定时不准导致识别协议错误,另一个吊诡的地方是同样的程序必须在倍频72M情况下才能用,微妙延时会随着时钟改动,但是改动了也不行,猜测可能是hal库在切换引脚输入输出属性时还是要一定时间的,倍频越快,切换越快,对协议读取影响越小;另一个是这个项目本来要用LCD12864的,但是买成5V的,淘宝卖家说自己改造也改造不成3.3v的,时间紧张改成OLED了;选的LM2596 DC降压方案,自己把路走窄了,外围电路多,二极管封装还搞错了(客户要求全直插,二极管引脚孔小了),用个可调的LM317还是更方便,这一块客户没要求,用的最小板的AMS1117供电;

下述是亿佰特家提供的部分程序:

/* USER CODE BEGIN 0 */

void RF_Initial(uint8_t mode)  //0 rx  1 tx
{
    SX1276_Init(MODE_LORA);
    SX1276_LoRa_SetDataRate(2);
    SX1276_SetFreq(23);             //23,433Hz
    SX1276_SetPower(15, 1);         //20dBm
    SX1276_SetRxMode();          //
}

uint8_t RF_SendPacket(uint8_t *Sendbuffer, uint8_t length)
{
    uint8_t error = 0, i=0, ack_len=0, ack_buffer[65]= { 0 }, TxBuffer[100];

    SX1276_SendPacket(Sendbuffer, length);

    return (0);
}

void RF_RecvHandler(void)
{
    uint8_t error=0, i=0, length=0, recv_buffer[20]= { 0 };

    length = SX1276_ReceivePacket(recv_buffer);     //

    SX1276_SetRxMode();
    }
}
/* USER CODE END 0 */


===============================================================================
*Function:  SX1276_SendPacket( ) => Send a packet
*Input   :  buffer,  Buffer to store the array
            size, how many bytes should be sent
*Output  :  None
===============================================================================
*/
void SX1276_SendPacket( uint8_t *buffer, uint8_t size )
{
    if( ( SX1276.Mode_Lora_Fsk != MODE_FSK ) && ( SX1276.Mode_Lora_Fsk != MODE_LORA ) )
    { SX1276.Mode_Lora_Fsk = MODE_LORA; }

    if( SX1276.Mode_Lora_Fsk == MODE_LORA )
    {
        SX1276_LoRa_SendPacket( buffer, size );
    }
    else
    {
        SX1276_Fsk_SendPacket_Var( buffer, size );
    }
}

===============================================================================
*Function:  SX1276_ReceivePacket( ) => Receive a packet
*Input   :  buffer,  Buffer to store the array
*Output  :  received size
===============================================================================
*/
uint8_t SX1276_ReceivePacket( uint8_t *buffer )
{
    uint8_t RxLength = 0;
    if( SX1276.Mode_Lora_Fsk == MODE_LORA )
    {
        if( SX1276_LoRa_RxProcess( ) )
        {
            RxLength = SX1276_LoRa_GetRxPacket( buffer );
        }
    }
    else
    {
        if( SX1276_Fsk_RxProcess( ) )
        {
            RxLength = SX1276_Fsk_GetRxPacket( buffer );
        }
    }
    return RxLength;
}

 

 

创作打卡挑战赛

赢取流量/现金/CSDN周边激励大奖