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;
}