Program test for Coragem

Dependencies:   SX1272 SPI_MX25R

Committer:
marcoantonioara
Date:
Wed Nov 13 16:42:06 2019 +0000
Revision:
4:05d5aa4d3f2d
Test version firmware Coragem using all sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcoantonioara 4:05d5aa4d3f2d 1 #include "SX1272.h"
marcoantonioara 4:05d5aa4d3f2d 2
marcoantonioara 4:05d5aa4d3f2d 3 InterruptIn dio0(P0_12);
marcoantonioara 4:05d5aa4d3f2d 4
marcoantonioara 4:05d5aa4d3f2d 5 //#define BAND868
marcoantonioara 4:05d5aa4d3f2d 6 #define MAX_DBM 14
marcoantonioara 4:05d5aa4d3f2d 7 #define DATA 0
marcoantonioara 4:05d5aa4d3f2d 8 #define PING 1
marcoantonioara 4:05d5aa4d3f2d 9 #define PONG 2
marcoantonioara 4:05d5aa4d3f2d 10
marcoantonioara 4:05d5aa4d3f2d 11
marcoantonioara 4:05d5aa4d3f2d 12 #define ADDRESS 10
marcoantonioara 4:05d5aa4d3f2d 13
marcoantonioara 4:05d5aa4d3f2d 14 const uint32_t DEFAULT_CHANNEL=CH_12_900;//915Mhz CH_12_900 =>0xE4C000;
marcoantonioara 4:05d5aa4d3f2d 15
marcoantonioara 4:05d5aa4d3f2d 16 ///////////////////////////////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 17 // CHANGE HERE THE LORA MODE, NODE ADDRESS
marcoantonioara 4:05d5aa4d3f2d 18 #define LORAMODE 1
marcoantonioara 4:05d5aa4d3f2d 19 #define node_addr 6
marcoantonioara 4:05d5aa4d3f2d 20 //////////////////////////////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 21
marcoantonioara 4:05d5aa4d3f2d 22 ///////////////////////////////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 23 // CHANGE HERE THE THINGSPEAK FIELD BETWEEN 1 AND 4
marcoantonioara 4:05d5aa4d3f2d 24 #define field_index 1
marcoantonioara 4:05d5aa4d3f2d 25 ///////////////////////////////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 26 #define DEFAULT_DEST_ADDR 6
marcoantonioara 4:05d5aa4d3f2d 27
marcoantonioara 4:05d5aa4d3f2d 28
marcoantonioara 4:05d5aa4d3f2d 29 ///////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 30 // Globals variables
marcoantonioara 4:05d5aa4d3f2d 31 ///////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 32
marcoantonioara 4:05d5aa4d3f2d 33 //___________SX1272____________________
marcoantonioara 4:05d5aa4d3f2d 34 int e;
marcoantonioara 4:05d5aa4d3f2d 35
marcoantonioara 4:05d5aa4d3f2d 36 //___________mensagem_____________________
marcoantonioara 4:05d5aa4d3f2d 37 uint8_t message[255];
marcoantonioara 4:05d5aa4d3f2d 38 uint8_t buffer[255];
marcoantonioara 4:05d5aa4d3f2d 39 uint8_t message_pong[]="Pong";
marcoantonioara 4:05d5aa4d3f2d 40 uint8_t message_ping[]="Ping";
marcoantonioara 4:05d5aa4d3f2d 41 uint8_t r_size;
marcoantonioara 4:05d5aa4d3f2d 42 uint8_t lora_mode_ant;
marcoantonioara 4:05d5aa4d3f2d 43 char float_temp[10];
marcoantonioara 4:05d5aa4d3f2d 44 char float_press[10];
marcoantonioara 4:05d5aa4d3f2d 45 char float_hum[10];
marcoantonioara 4:05d5aa4d3f2d 46 int cont =0;
marcoantonioara 4:05d5aa4d3f2d 47 int loraMode=LORAMODE;
marcoantonioara 4:05d5aa4d3f2d 48
marcoantonioara 4:05d5aa4d3f2d 49
marcoantonioara 4:05d5aa4d3f2d 50 ////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 51 // SETUP SX1272 initialisation
marcoantonioara 4:05d5aa4d3f2d 52 ////////////////////////////////////////
marcoantonioara 4:05d5aa4d3f2d 53 void lora_setup()
marcoantonioara 4:05d5aa4d3f2d 54 {
marcoantonioara 4:05d5aa4d3f2d 55
marcoantonioara 4:05d5aa4d3f2d 56
marcoantonioara 4:05d5aa4d3f2d 57 //printf("------Coragem LoRa temperature sensor-------------\n");
marcoantonioara 4:05d5aa4d3f2d 58 //sx1272.ON(); // Power ON the module
marcoantonioara 4:05d5aa4d3f2d 59
marcoantonioara 4:05d5aa4d3f2d 60 int error_config_sx1272=0;
marcoantonioara 4:05d5aa4d3f2d 61
marcoantonioara 4:05d5aa4d3f2d 62 // Set transmission mode and print the result
marcoantonioara 4:05d5aa4d3f2d 63 e = sx1272.setMode(loraMode);
marcoantonioara 4:05d5aa4d3f2d 64 //printf("Mode: %d\n",loraMode);
marcoantonioara 4:05d5aa4d3f2d 65 if (e) error_config_sx1272=1;
marcoantonioara 4:05d5aa4d3f2d 66 //printf("Setting Mode: state %d\n",e);
marcoantonioara 4:05d5aa4d3f2d 67
marcoantonioara 4:05d5aa4d3f2d 68 // enable carrier sense
marcoantonioara 4:05d5aa4d3f2d 69 sx1272._enableCarrierSense=true;
marcoantonioara 4:05d5aa4d3f2d 70
marcoantonioara 4:05d5aa4d3f2d 71 // for LOW POWER
marcoantonioara 4:05d5aa4d3f2d 72 sx1272._RSSIonSend=false;
marcoantonioara 4:05d5aa4d3f2d 73
marcoantonioara 4:05d5aa4d3f2d 74
marcoantonioara 4:05d5aa4d3f2d 75 // Select frequency channel
marcoantonioara 4:05d5aa4d3f2d 76 e = sx1272.setChannel(DEFAULT_CHANNEL);
marcoantonioara 4:05d5aa4d3f2d 77 if (e) error_config_sx1272=1;
marcoantonioara 4:05d5aa4d3f2d 78 //printf("Setting Channel: state %d\n",e);
marcoantonioara 4:05d5aa4d3f2d 79
marcoantonioara 4:05d5aa4d3f2d 80 // Select amplifier line; PABOOST or RFO
marcoantonioara 4:05d5aa4d3f2d 81 // #ifdef PABOOST
marcoantonioara 4:05d5aa4d3f2d 82 // printf("pabboost\n");
marcoantonioara 4:05d5aa4d3f2d 83 // sx1272._needPABOOST=true;
marcoantonioara 4:05d5aa4d3f2d 84 // // previous way for setting output power
marcoantonioara 4:05d5aa4d3f2d 85 // // powerLevel='x';
marcoantonioara 4:05d5aa4d3f2d 86 // #else
marcoantonioara 4:05d5aa4d3f2d 87 // // previous way for setting output power
marcoantonioara 4:05d5aa4d3f2d 88 // // powerLevel='M';
marcoantonioara 4:05d5aa4d3f2d 89 // #endif
marcoantonioara 4:05d5aa4d3f2d 90
marcoantonioara 4:05d5aa4d3f2d 91 // previous way for setting output power
marcoantonioara 4:05d5aa4d3f2d 92 // e = sx1272.setPower(powerLevel);
marcoantonioara 4:05d5aa4d3f2d 93
marcoantonioara 4:05d5aa4d3f2d 94 e = sx1272.setPowerDBM((uint8_t)MAX_DBM);
marcoantonioara 4:05d5aa4d3f2d 95 if (e) error_config_sx1272=1;
marcoantonioara 4:05d5aa4d3f2d 96 printf("Setting Power: state %d\n",e);
marcoantonioara 4:05d5aa4d3f2d 97
marcoantonioara 4:05d5aa4d3f2d 98 // Set the node address and print the result
marcoantonioara 4:05d5aa4d3f2d 99 e = sx1272.setNodeAddress(node_addr);
marcoantonioara 4:05d5aa4d3f2d 100 if (e) error_config_sx1272=1;
marcoantonioara 4:05d5aa4d3f2d 101 printf("Setting node addr: state %d\n",e);
marcoantonioara 4:05d5aa4d3f2d 102
marcoantonioara 4:05d5aa4d3f2d 103 // Print a success message
marcoantonioara 4:05d5aa4d3f2d 104 if (!error_config_sx1272) printf("SX1272 successfully configured\n");
marcoantonioara 4:05d5aa4d3f2d 105 else printf("ERROR CONFIGURATION SX1272\n");
marcoantonioara 4:05d5aa4d3f2d 106
marcoantonioara 4:05d5aa4d3f2d 107 wait_ms(400);
marcoantonioara 4:05d5aa4d3f2d 108 }
marcoantonioara 4:05d5aa4d3f2d 109 void lora_send_packet (uint8_t *payload, uint8_t length8) // envia pacote
marcoantonioara 4:05d5aa4d3f2d 110 {
marcoantonioara 4:05d5aa4d3f2d 111
marcoantonioara 4:05d5aa4d3f2d 112 //write on FIFO
marcoantonioara 4:05d5aa4d3f2d 113 sx1272.writeRegister(REG_IRQ_FLAGS,255);//clear flags
marcoantonioara 4:05d5aa4d3f2d 114 sx1272.writeRegister(REG_OP_MODE, LORA_STANDBY_MODE); // Stdby LoRa mode to write in FIFO
marcoantonioara 4:05d5aa4d3f2d 115 sx1272.writeRegister(REG_PAYLOAD_LENGTH_LORA, length8);
marcoantonioara 4:05d5aa4d3f2d 116 sx1272.writeRegister(REG_FIFO_TX_BASE_ADDR,0x00);
marcoantonioara 4:05d5aa4d3f2d 117 sx1272.writeRegister(REG_FIFO_ADDR_PTR,0x00);
marcoantonioara 4:05d5aa4d3f2d 118
marcoantonioara 4:05d5aa4d3f2d 119 for(unsigned int i = 0; i <= length8; i++) {
marcoantonioara 4:05d5aa4d3f2d 120 sx1272.writeRegister(REG_FIFO, payload[i]); // Writing the payload in FIFO
marcoantonioara 4:05d5aa4d3f2d 121 }
marcoantonioara 4:05d5aa4d3f2d 122
marcoantonioara 4:05d5aa4d3f2d 123 //________________Send Data__________________
marcoantonioara 4:05d5aa4d3f2d 124 sx1272.writeRegister(REG_IRQ_FLAGS,255);//clear flags
marcoantonioara 4:05d5aa4d3f2d 125 sx1272.writeRegister(REG_OP_MODE, LORA_TX_MODE); // LORA mode - Tx
marcoantonioara 4:05d5aa4d3f2d 126
marcoantonioara 4:05d5aa4d3f2d 127 unsigned long exitTime = millis()+1400;//2 segundos para sair do for
marcoantonioara 4:05d5aa4d3f2d 128 unsigned long Time= millis();
marcoantonioara 4:05d5aa4d3f2d 129 char value = sx1272.readRegister(REG_IRQ_FLAGS);
marcoantonioara 4:05d5aa4d3f2d 130
marcoantonioara 4:05d5aa4d3f2d 131 while ((bitRead(value, 3) == 0) && (Time < exitTime)) {
marcoantonioara 4:05d5aa4d3f2d 132 value=sx1272.readRegister(REG_IRQ_FLAGS);
marcoantonioara 4:05d5aa4d3f2d 133 Time= millis();
marcoantonioara 4:05d5aa4d3f2d 134 wait_ms(50);
marcoantonioara 4:05d5aa4d3f2d 135 }
marcoantonioara 4:05d5aa4d3f2d 136
marcoantonioara 4:05d5aa4d3f2d 137 wait_ms(50);
marcoantonioara 4:05d5aa4d3f2d 138
marcoantonioara 4:05d5aa4d3f2d 139 }
marcoantonioara 4:05d5aa4d3f2d 140
marcoantonioara 4:05d5aa4d3f2d 141 void lora_send_data(int mode) //data predefined
marcoantonioara 4:05d5aa4d3f2d 142 {
marcoantonioara 4:05d5aa4d3f2d 143 led1=1;
marcoantonioara 4:05d5aa4d3f2d 144 sx1272.writeRegister(REG_OP_MODE,129);//standby
marcoantonioara 4:05d5aa4d3f2d 145
marcoantonioara 4:05d5aa4d3f2d 146
marcoantonioara 4:05d5aa4d3f2d 147
marcoantonioara 4:05d5aa4d3f2d 148 if (mode == DATA ) {
marcoantonioara 4:05d5aa4d3f2d 149 #ifdef BME280
marcoantonioara 4:05d5aa4d3f2d 150 sprintf(float_temp,"%2.2f",getTemperature());
marcoantonioara 4:05d5aa4d3f2d 151 sprintf(float_press,"%04.2f",getPressure());
marcoantonioara 4:05d5aa4d3f2d 152 sprintf(float_hum,"%2.2f",getHumidity());
marcoantonioara 4:05d5aa4d3f2d 153
marcoantonioara 4:05d5aa4d3f2d 154 //============= internet of turtles =============
marcoantonioara 4:05d5aa4d3f2d 155 sprintf(float_breathing_time,"%04.2f", last_breathing_time);
marcoantonioara 4:05d5aa4d3f2d 156 sprintf(float_diving_time,"%04.2f", last_diving_time);
marcoantonioara 4:05d5aa4d3f2d 157 r_size=sprintf((char*)message,"\\!#Dt%04.2f_Bt%04.2f_%s°C_%shPa_%s%%",last_diving_time,last_breathing_time,float_temp,float_press,float_hum);
marcoantonioara 4:05d5aa4d3f2d 158 // ==============================================
marcoantonioara 4:05d5aa4d3f2d 159
marcoantonioara 4:05d5aa4d3f2d 160 //size=sprintf((char*)message,"\\!#%s°C_%shPa_%s%%",float_temp,float_press,float_hum);
marcoantonioara 4:05d5aa4d3f2d 161
marcoantonioara 4:05d5aa4d3f2d 162 lora_send_packet(message,r_size);
marcoantonioara 4:05d5aa4d3f2d 163 // sx1272.sendPacketTimeout(DEFAULT_DEST_ADDR,/* (uint8_t*)*/message, r_size);
marcoantonioara 4:05d5aa4d3f2d 164 printf("packet send :\n%s\nrsize=%d\n",message,r_size);
marcoantonioara 4:05d5aa4d3f2d 165 #endif
marcoantonioara 4:05d5aa4d3f2d 166
marcoantonioara 4:05d5aa4d3f2d 167 } else if (mode == PING ) {
marcoantonioara 4:05d5aa4d3f2d 168
marcoantonioara 4:05d5aa4d3f2d 169
marcoantonioara 4:05d5aa4d3f2d 170 //sx1272.sendPacketTimeout(DEFAULT_DEST_ADDR, message_ping, sizeof(message_ping));
marcoantonioara 4:05d5aa4d3f2d 171 lora_send_packet(message_ping,sizeof(message_ping));
marcoantonioara 4:05d5aa4d3f2d 172 printf("packet send :\n%s\n",message_ping);
marcoantonioara 4:05d5aa4d3f2d 173
marcoantonioara 4:05d5aa4d3f2d 174
marcoantonioara 4:05d5aa4d3f2d 175 } else if (mode == PONG ) {
marcoantonioara 4:05d5aa4d3f2d 176
marcoantonioara 4:05d5aa4d3f2d 177 //sx1272.sendPacketTimeout(DEFAULT_DEST_ADDR, message_pong, sizeof(message_pong));
marcoantonioara 4:05d5aa4d3f2d 178 lora_send_packet(message_pong,sizeof(message_pong));
marcoantonioara 4:05d5aa4d3f2d 179 printf("packet send :\n%s\n",message_pong);
marcoantonioara 4:05d5aa4d3f2d 180 }
marcoantonioara 4:05d5aa4d3f2d 181
marcoantonioara 4:05d5aa4d3f2d 182 wait_ms(300);
marcoantonioara 4:05d5aa4d3f2d 183
marcoantonioara 4:05d5aa4d3f2d 184 sx1272.writeRegister(REG_IRQ_FLAGS,255);//clear flags
marcoantonioara 4:05d5aa4d3f2d 185 sx1272.writeRegister(REG_OP_MODE,133); //leitura continua
marcoantonioara 4:05d5aa4d3f2d 186 cont++;
marcoantonioara 4:05d5aa4d3f2d 187 printf("number=%d\n",cont);
marcoantonioara 4:05d5aa4d3f2d 188
marcoantonioara 4:05d5aa4d3f2d 189 led1=0;
marcoantonioara 4:05d5aa4d3f2d 190 }
marcoantonioara 4:05d5aa4d3f2d 191
marcoantonioara 4:05d5aa4d3f2d 192
marcoantonioara 4:05d5aa4d3f2d 193 void lora_print_packet()
marcoantonioara 4:05d5aa4d3f2d 194 {
marcoantonioara 4:05d5aa4d3f2d 195
marcoantonioara 4:05d5aa4d3f2d 196 led2=1;
marcoantonioara 4:05d5aa4d3f2d 197 sx1272.writeRegister(REG_OP_MODE,129);//standby
marcoantonioara 4:05d5aa4d3f2d 198
marcoantonioara 4:05d5aa4d3f2d 199 uint8_t pac_size;
marcoantonioara 4:05d5aa4d3f2d 200
marcoantonioara 4:05d5aa4d3f2d 201 sx1272.writeRegister(REG_FIFO_ADDR_PTR,sx1272.readRegister(REG_FIFO_RX_CURRENT_ADDR));//set fifo pointer to read packet
marcoantonioara 4:05d5aa4d3f2d 202 pac_size = sx1272.readRegister(REG_RX_NB_BYTES);//read size of packet
marcoantonioara 4:05d5aa4d3f2d 203 for(int i =0 ; i<pac_size ; i++) { //print packet
marcoantonioara 4:05d5aa4d3f2d 204 buffer[i]=sx1272.readRegister(REG_FIFO);
marcoantonioara 4:05d5aa4d3f2d 205 if (buffer[i]== '\n') printf(" \\n");
marcoantonioara 4:05d5aa4d3f2d 206 if (buffer[i]== 0x0B) printf("tab");
marcoantonioara 4:05d5aa4d3f2d 207 printf("%c",buffer[i]);//print packet
marcoantonioara 4:05d5aa4d3f2d 208 }
marcoantonioara 4:05d5aa4d3f2d 209 printf("\n");
marcoantonioara 4:05d5aa4d3f2d 210
marcoantonioara 4:05d5aa4d3f2d 211
marcoantonioara 4:05d5aa4d3f2d 212 for(int i =0 ; i<pac_size ; i++) {
marcoantonioara 4:05d5aa4d3f2d 213 if ((buffer[i] =='P') && (buffer[i+1] =='i') && (buffer[i+2] =='n') && (buffer[i+3] =='g') ) { //look for Ping in packet
marcoantonioara 4:05d5aa4d3f2d 214 sx1272.writeRegister(0x12,255);//clear flags
marcoantonioara 4:05d5aa4d3f2d 215 lora_send_data(PONG);
marcoantonioara 4:05d5aa4d3f2d 216 i=pac_size;
marcoantonioara 4:05d5aa4d3f2d 217 }
marcoantonioara 4:05d5aa4d3f2d 218 if ((buffer[i] =='R') && (buffer[i+1] =='e') && (buffer[i+2] =='s') && (buffer[i+3] =='e') && (buffer[i+4] =='t') ) {// look reset
marcoantonioara 4:05d5aa4d3f2d 219 uint32_t *ptr;
marcoantonioara 4:05d5aa4d3f2d 220 ptr = (uint32_t *)1073743132;// endereço gpregret 0x4000051C
marcoantonioara 4:05d5aa4d3f2d 221 *ptr = 0xB1;//BOOTLOADER_DFU_START
marcoantonioara 4:05d5aa4d3f2d 222 NVIC_SystemReset();
marcoantonioara 4:05d5aa4d3f2d 223 }
marcoantonioara 4:05d5aa4d3f2d 224
marcoantonioara 4:05d5aa4d3f2d 225 }
marcoantonioara 4:05d5aa4d3f2d 226
marcoantonioara 4:05d5aa4d3f2d 227
marcoantonioara 4:05d5aa4d3f2d 228 wait_ms(30);
marcoantonioara 4:05d5aa4d3f2d 229 sx1272.writeRegister(REG_IRQ_FLAGS,255);//clear flags
marcoantonioara 4:05d5aa4d3f2d 230 sx1272.writeRegister(REG_OP_MODE,133); //leitura continua
marcoantonioara 4:05d5aa4d3f2d 231 led2=0;
marcoantonioara 4:05d5aa4d3f2d 232
marcoantonioara 4:05d5aa4d3f2d 233 }
marcoantonioara 4:05d5aa4d3f2d 234 void lora_sleep(){
marcoantonioara 4:05d5aa4d3f2d 235 lora_mode_ant = sx1272.readRegister(REG_OP_MODE);
marcoantonioara 4:05d5aa4d3f2d 236 sx1272.writeRegister(REG_OP_MODE,LORA_SLEEP_MODE); //leitura continua
marcoantonioara 4:05d5aa4d3f2d 237
marcoantonioara 4:05d5aa4d3f2d 238 }
marcoantonioara 4:05d5aa4d3f2d 239
marcoantonioara 4:05d5aa4d3f2d 240 int lora_wake(){
marcoantonioara 4:05d5aa4d3f2d 241 if (lora_mode_ant!= 0){
marcoantonioara 4:05d5aa4d3f2d 242 sx1272.writeRegister(REG_OP_MODE,lora_mode_ant); //leitura continua
marcoantonioara 4:05d5aa4d3f2d 243 return 0;
marcoantonioara 4:05d5aa4d3f2d 244 }
marcoantonioara 4:05d5aa4d3f2d 245 else return -1;
marcoantonioara 4:05d5aa4d3f2d 246 }