I have scheduled 3 different process to run at every 10s, 1min and 1 min respectively using FreeRTOS. However I relized that the timing is totally off and some processes do not even run as well. Below is my code. Am I doing something wrong here. This is my first tiime using any RTOS.
#include <Arduino_FreeRTOS.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
TaskHandle_t smsChecker_Handler;
TaskHandle_t toggleLED_Handler;
TaskHandle_t readGPS_Handler;
int n = 0;
String lon;
String lat;
byte c;
byte ch;
String recvMsgs = "";
String recvMsg;
String sdata = "";
byte Rx = 10;
byte Tx = 11;
//float readings[4];
SoftwareSerial gpsmodule(Rx,Tx);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.begin();
Serial.begin(115200);
gpsmodule.begin(115200);
pinMode(13,OUTPUT);
pinMode(9,OUTPUT);
digitalWrite(13,LOW);
digitalWrite(9,LOW);
// Giving time for GSM/GPS module to lock onto a network
delay(2000);
xTaskCreate(readGPS, "Task1", 100, NULL, 1, &readGPS_Handler);
xTaskCreate(toggleLED, "Task2", 100, NULL, 1, &toggleLED_Handler);
xTaskCreate(smsChecker, "Task3", 100, NULL, 2, &smsChecker_Handler);
//xTaskCreate(MyIdleTask, "IdleTask", 100, NULL, 0, NULL);
}
void loop(){
//do nothing
}
void readGPS(void* pvParameters){
TickType_t getTick1;
getTick1 = xTaskGetTickCount();
lcd.clear();
gpsmodule.print("AT+GPS=1\r");
delay(1000);
while (gpsmodule.available() > 0){
Serial.write(gpsmodule.read());
}
gpsmodule.print("AT+LOCATION=2\r");
delay(5000);
while (gpsmodule.available() > 0){
c = gpsmodule.read();
sdata+=(char)c;
}
delay(10);
lat = sdata.substring(16,23);
lon = sdata.substring(25,31);
lcd.setCursor(0,0);
lcd.print("Lat: ");
lcd.print(lat);
lcd.setCursor(0,1);
lcd.print("Lon: ");
lcd.print(lon);
//coordinates = sdata.substring(16,32);
//Serial.println(coordinates);
//vTaskDelay(60000/portTICK_PERIOD_MS);
vTaskDelayUntil(&getTick1,60000/portTICK_PERIOD_MS);
}
void toggleLED(void* pvParameters){
TickType_t getTick2;
getTick2 = xTaskGetTickCount();
Serial.println(n);
if (n % 2 == 0){
digitalWrite(13,LOW);
digitalWrite(9,HIGH);
} else {
digitalWrite(13,HIGH);
digitalWrite(9,LOW);
}
n++;
vTaskDelayUntil(&getTick2,60000/portTICK_PERIOD_MS);
}
void smsChecker(void* pvParameters){
TickType_t getTick3;
getTick3 = xTaskGetTickCount();
lcd.clear();
gpsmodule.print("AT+CMGF=1\r");
delay(500);
while (gpsmodule.available() > 0){
Serial.write(gpsmodule.read());
}
gpsmodule.print("AT+CNMI=2,2,0,0,0\r");
delay(2000);
while (gpsmodule.available() > 0){
ch = gpsmodule.read();
recvMsgs+=(char)ch;
}
delay(10);
//recvMsg = recvMsgs.substring();
lcd.setCursor(0,0);
lcd.print(recvMsgs);
Serial.println(recvMsgs);
//vTaskDelay(10000/portTICK_PERIOD_MS);
vTaskDelayUntil(&getTick3,10000/portTICK_PERIOD_MS);
}
