Go Down

Topic: SD.begin() freeze my code  (Read 387 times) previous topic - next topic

Soja

Please i need your help, i am developing tracking system, which i want to store  NMEA sentences to my SD card, and upload it to my server using GSM module.

My code is freezing if i put the SD card code and GSM module code together, but if i separate SD card code and run it separately everything is working fine. What i observed it stop execution in SD.begin();

I need your help please.   

Thanks

Juraj

You can't write an Arduino sketch if you didn't learn programming. Not the language, but the concepts of programming - algorithms and data types.

Soja

Am using Arduino uno

The wiring are:

MOSI-> 11
MISO-> 12
SCK-> 13
CS-10

main.cpp file code

#include <Arduino.h>
#include<TinyGPS.h>
#include<SoftwareSerial.h>
#include <Adafruit_FONA.h>
#include "sd_card.h"

#define FONA_RX   A5
#define FONA_TX   A4
#define FONA_RST  A3

#define GPS_TX    8
#define GPS_RX    9
#define D_STATUS  4

String deviceID  ="199DHH34";

char http_cmd[128];
boolean gprs_on = false;
boolean tcp_on = false;
int net_status;

uint16_t statuscode;
int16_t length;
String response = "";
char buffer[512];

SoftwareSerial SIM800ss = SoftwareSerial(FONA_TX, FONA_RX);
Adafruit_FONA SIM800 = Adafruit_FONA(&SIM800ss, FONA_RST);


//SoftwareSerial mGsm(2 ,3);
SoftwareSerial mGps(GPS_RX, GPS_TX);


String mDEVICE_= "AX-88FUEJ90-JE";
float tmpSpd,tmpLat,tmpLng=0;
#define MAX_DISTANCE_COVERED 0

  float flon,flat,spd,dstBtw;
  boolean newdata=false;
  boolean isStart;

TinyGPS mGps_lib;
unsigned long age, date, time, chars = 0;

void blink_status()
{
  digitalWrite(D_STATUS,HIGH);
  delay(1000);
  digitalWrite(D_STATUS,LOW);
  delay(1000);
}

void __status()
{
  digitalWrite(D_STATUS,LOW);
  delay(500);
  digitalWrite(D_STATUS,HIGH);

}

static bool feedgps(long timeOut)
{
    unsigned long timeout = millis();
    mGps.listen();
    while(!mGps.available())
    if (millis() - timeout > timeOut)
    {
      Serial.println("Gps read time out");
      return false;
    }

    mGps.listen();
    while (mGps.available())
    {
      char rx=mGps.read();
    //  Serial.print(rx);
      if (mGps_lib.encode(rx))
      {
        blink_status();
        return true ;
      }
    }
    __status();
    return false;
}


void printSerialData()
{
    unsigned long timeout = millis();
    while(!SIM800ss.available())
    if (millis() - timeout > 50000)return;

    String cnt="";
     while(SIM800ss.available())
     {
      char rx=SIM800ss.read();
      cnt=cnt + rx;
      Serial.write(rx);
     
     }
   
}

void sync_data_to_server(String latitude,String longitude,String spd)
{
     SIM800ss.listen();
    SIM800ss.println("ATE0");
    delay(3000);
   
     SIM800ss.println("AT+CGATT=1");
     printSerialData();
     delay(3000);
     
     SIM800ss.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the SAPBR,connection type is GPRS
     printSerialData();
     delay(5000);
     
     SIM800ss.println("AT+SAPBR=3,1,\"APN\",\"\"");//setting the APN,2nd parameter empty works for all networks
     printSerialData();
   
     delay(3000);
      SIM800ss.println("AT+SAPBR=1,1");
      printSerialData();
      delay(1000);
 
      SIM800ss.println("AT+HTTPINIT"); //init the HTTP request
      printSerialData();

      delay(10000);
      String url="AT+HTTPPARA=\"URL\",\"http://kapichet-edu.com/track/index.php?tractorid="+deviceID+"&latitude="+latitude+"&longitude="+longitude+"&speed="+spd+"\"";
      SIM800ss.println(url);// setting the httppara,
      Serial.println(url ) ;
      //the second parameter is the website from where you want to access data
      printSerialData();

      delay(3000);
      SIM800ss.println();
      SIM800ss.println("AT+HTTPACTION=0");//submit the GET request
      printSerialData();

      delay(10000);
      SIM800ss.println("AT+HTTPREAD");// read the data from the website you access
      printSerialData();

      delay(2000);
      SIM800ss.println("AT+HTTPTERM");// terminate HTTP service
      printSerialData();
     
   
}





void no_gps_network()
{  int latitude=1; int longitude=0; int spd=0;
     SIM800ss.listen();
    SIM800ss.println("ATE0");
    delay(3000);
   
     SIM800ss.println("AT+CGATT=1");
    printSerialData();
     delay(3000);
     
     SIM800ss.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the SAPBR,connection type is GPRS
     printSerialData();
     delay(5000);
     
     SIM800ss.println("AT+SAPBR=3,1,\"APN\",\"\"");//setting the APN,2nd parameter empty works for all networks
     printSerialData();
   
     delay(3000);
      SIM800ss.println("AT+SAPBR=1,1");
     printSerialData();
      delay(1000);
 
      SIM800ss.println("AT+HTTPINIT"); //init the HTTP request
     printSerialData();

      delay(10000);
      String url="AT+HTTPPARA=\"URL\",\"http://kapichet-edu.com/track/no_gps_network.php?tractorid="+deviceID+"&latitude="+latitude+"&longitude="+longitude+"&speed="+spd+"\"";
      SIM800ss.println(url);// setting the httppara,
      Serial.println(url) ;
      //the second parameter is the website from where you want to access data
      //printSerialData();
      printSerialData();

      delay(3000);
      SIM800ss.println();
      SIM800ss.println("AT+HTTPACTION=0");//submit the GET request
      printSerialData();

      delay(10000);
      SIM800ss.println("AT+HTTPREAD");// read the data from the website you access
      printSerialData();

      delay(2000);
      SIM800ss.println("AT+HTTPTERM");// terminate HTTP service
     
    printSerialData();
     
     
 
 
 } 





float latitude, longitude;
uint16_t res_code,max_len=64;

sd_cardcon sd_cardcon(true); //  Constructor



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mGps.begin(9600);
  pinMode(D_STATUS,OUTPUT);


 
  if (! SIM800.begin(4800)) {           
    Serial.println("Couldn't find SIM800L");
    while (1);
  }
 
  Serial.println("SIM800L is OK");
  delay(1000);


  Serial.println("Registering to home network!");
  net_status = SIM800.getNetworkStatus();
  while(net_status != 1){
     net_status = SIM800.getNetworkStatus();
     delay(2000);
  }

  char ccid;
  Serial.println("Registered to home network!");
  //if(SIM800.get(&ccid))
 // Serial.println(ccid);
 
  delay(2000);

  Serial.println("Initiating...");

}
  String jas="12346799 gas";
void loop() {

   
   sd_cardcon.getstring(jas);
  // put your main code here, to run repeatedly:
      tmpLat=flat;
      tmpLng=flon;
      dstBtw=0;

  unsigned long start = millis();
  String str="";
 
    while (millis() - start < 2000)if (feedgps(2000))newdata = true;

  mGps_lib.f_get_position(&flat, &flon, &age);
  spd=mGps_lib.f_speed_kmph();

  if((flat==TinyGPS::GPS_INVALID_F_ANGLE)|| (flon==TinyGPS::GPS_INVALID_F_ANGLE) ||(spd==TinyGPS::GPS_INVALID_F_SPEED)){

   no_gps_network();
 

  }
  else
  {
   // if(tmpLat!=0 && tmpLng!=0)  dstBtw=TinyGPS::distance_between(flat, flon, tmpLat, tmpLng);
   
   // str="{\"lat\":\""+ String (flat,6)+"\",\"lng\":\""+ String (flon,6)+"\", \"speed\":\""+String(spd,2)+" kmph\"}";
   // Serial.println(str);
   // Serial.print("Distance: "+ String(dstBtw));
   
   //if((dstBtw>=MAX_DISTANCE_COVERED)|| (isStart==true))
    //{
      sync_data_to_server(String (flat,7),String (flon,7),String (spd,4));
      tmpLat=flat;
      tmpLng=flon;
  //nas_sdcard.sd_card_send_data(spd);


     // isStart=false;
    //}
   
    //newdata=false;

  }


}







Juraj

#3
Apr 02, 2019, 02:15 pm Last Edit: Apr 02, 2019, 02:58 pm by Juraj
I don't see SD begin in your sketch.
the SD library default CS pins is 4 (for the Ethernet shield). you have something else on pin 4.
use SD.begin(10) if you wired CS to pin 10
You can't write an Arduino sketch if you didn't learn programming. Not the language, but the concepts of programming - algorithms and data types.

Soja

Am sorry

my header file code sd_card.h:

#ifndef sdrd
#define sdrd

#if (ARDUINO >=100)
#include "Arduino.h"
#else

#include  "WProgram.h"

#endif

class sd_cardcon
{
private:
    /* data */
public:
   // sd_card(/* args */);
    sd_cardcon(bool letsee=false);


   //Method
    void getstring(String datasend);



};

//extern sd_cardcon sd_card;

  #endif



my sd_card.cpp

#include <SD.h>
#include <SPI.h>
#include "sd_card.h"
File sdcard_file;
int CS_pin = 10;

sd_cardcon::sd_cardcon(bool letsee){


}


void sd_cardcon::getstring(String dataincome){
pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
if (SD.begin())
{
Serial.println("SD card is initialized and it is ready to use");
} else
{
Serial.println("SD card is not initialized");
return;
}


sdcard_file = SD.open("data.txt", FILE_WRITE); //Looking for the data.txt in SD card

if (sdcard_file) { //If the file is found
Serial.println("Writing to file is under process");
sdcard_file.println(dataincome); //Writing to file
sdcard_file.close(); //Closing the file
Serial.println("Done");
}
else {
Serial.println("Failed to open the file");
}





}



neiklot

the SD library default CS pins is 4
Not as far as I can see, looking through the SD library source. It explicitly says it's SS which is 10.

Then the SD card examples all explicitly use 4 (presumably to accommodate the Ethernet shield using 10 for itself and giving 4 to the SD), and they wouldn't need to do that if it was already 4 in the source.


Juraj

#6
Apr 02, 2019, 03:01 pm Last Edit: Apr 02, 2019, 03:01 pm by Juraj
@neiklot thank you for correcting me

@Soja call SD.begin() in setup()
You can't write an Arduino sketch if you didn't learn programming. Not the language, but the concepts of programming - algorithms and data types.

neiklot

@neiklot thank you for correcting me
I think I read the source right, right? ;)






Soja

@neiklot thank you for correcting me

@Soja call SD.begin() in setup()
Ok, let me try it.

Thanks

Soja

@neiklot thank you for correcting me

@Soja call SD.begin() in setup()
Is still freezing..........

This is what is displaying to me nothing else.



> Executing task: C:\Users\user\.platformio\penv\Scripts\platformio.exe device monitor <

--- Miniterm on COM17  9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
 

Geek Emeritus

when I had this problem the sketch I was running was too big for the UNO. it ran out of memory and got twitchy when I added SD. it had nothing top do with SsD, it just happened when I tried to add it.

Soja, please read How to use this forum

pay particular attention to 7. If you are posting code or error messages, use "code" tags
All PMs will be deleted unopened due to arrogant argumentative pot stirring Malfoys.
 If you have not read "How to use this forum - please read", in particular: "7. If you are posting code or error messages, use "code" tags":  expect rude responses

Soja

when I had this problem the sketch I was running was too big for the UNO. it ran out of memory and got twitchy when I added SD. it had nothing top do with SsD, it just happened when I tried to add it.

Soja, please read How to use this forum

pay particular attention to 7. If you are posting code or error messages, use "code" tags

I am new here, that is why.

Thank you very much.

Juraj

what memory usage prints IDE after compiling the sketch?
You can't write an Arduino sketch if you didn't learn programming. Not the language, but the concepts of programming - algorithms and data types.

Soja

You know am using Arduino Uno which is

Flash  32k bytes
SRAM   2k bytes
EEPROM 1k byte

neiklot

#14
Apr 03, 2019, 05:59 am Last Edit: Apr 03, 2019, 06:01 am by neiklot
what memory usage prints IDE after compiling the sketch?
Juraj means what does the IDE say after compiling?

This info here:




Go Up