Adafruit Fona 32u4 with example code error


#1

Hi Guys

I bought an Adafruit fona 32u4 and I loaded the example code from here:

I have setup the IDE and got the example code working from Adafruit (Successful AT commands), but I cannot get the example code to run. It does seem to be communicating but all I get is errors.

From serial window:

Attempting to open comm with ATs
Response of FONA:

Error
Response of FONA:
OK

Call Ready

SMS Ready

Error
Response of FONA:
OK

*PSUTTZ: 2018,11,23,14,18,50,"+8",0

DST: 0

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Timeout: No response to AT... last ditch attempt.
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Response of FONA:
OK

Error
Couldn't find FONAERROR
ERROR
ERROR
ERROR
ERROR
ERROR


My Code:
/********************************
 * Libraries included
 *******************************/
#include <SoftwareSerial.h>
#include <stdlib.h>
#include "Arduino.h"
 
/********************************
 * Constants and objects
 *******************************/
 
#define DEFAULT_BUFFER_SIZE      64

#define FONA_RX  9
#define FONA_TX  8
#define FONA_RST 4

#define SERVER "translate.ubidots.com"
#define PORT "9012"

#define APN  "internet"  // The APN of your operator
#define USER ""  // if your apn doesnt have username just leave it ""
#define PASS ""  // if your apn doesnt have password just leave it ""
#define TOKEN "mytoken"  // Replace it with your Ubidots token
#define METHOD "POST"
#define USER_AGENT  "adafruit"
#define VERSION  "1.0"
#define DEVICE_LABEL  "feather-fona"
#define VARIABLE_LABEL  "temperature"


bool _debug = true; 
char buffer[DEFAULT_BUFFER_SIZE];
 
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);

/********************************
 * Main Functions
 *******************************/
void setup() {
    Serial.begin(115200);
    pinMode(A0, INPUT);
    delay(2000);
    while(!setApn(APN, USER, PASS));
}

void loop() {
    char* request = (char *) malloc(sizeof(char) * 300);
    char str_val[15];
    
    float sensor_value = analogRead(A0);

    dtostrf(sensor_value, 4, 2, str_val);
    sprintf(request, "%s/%s|%s|%s|%s=>%s:%s|end", USER_AGENT, VERSION, METHOD, TOKEN, DEVICE_LABEL, VARIABLE_LABEL, str_val);
    //sprintf(request, "%s|%s|%s","adafruit/1.0|POST", TOKEN, "fona=>test:17.00|end");
    sendToUbidots(request);
    free(request);
}

/********************************
 * Auxiliar Functions
 *******************************/
bool sendMessageAndwaitForOK(char* message, uint16_t timeout = 4000) {
    fonaSS.println(message);
    if (strstr(readData(timeout), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error"));
        }
            return false;
        }
    return true;
}

bool setApn(char* apn, char* user, char* pwd) {
    checkFona();
    fonaSS.println(F("AT"));
    if (strstr(readData(2000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT"));
        }
        return false;
    }
    fonaSS.println(F("AT+CREG?"));
    if (strstr(readData(2000), "+CREG:") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT"));
        }
        return false;
    }
    fonaSS.println(F("AT+CSQ"));
    if (strstr(readData(2000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CSQ"));
        }
        return false;
    }
    fonaSS.println(F("AT+CGATT?"));
    if (strstr(readData(10000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CGATT"));
        }
        return false;
    }
    fonaSS.println(F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""));
    if (strstr(readData(10000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR CONTYPE"));
        }
        return false;
    }
    fonaSS.print(F("AT+SAPBR=3,1,\"APN\",\""));
    fonaSS.print(apn);
    fonaSS.println(F("\""));
    if (strstr(readData(3000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR APN"));
        }
        return false;
    }
    fonaSS.print(F("AT+SAPBR=3,1,\"USER\",\""));
    fonaSS.print(user);
    fonaSS.println(F("\""));
    if (strstr(readData(10000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR USER"));
        }
        return false;
    }
    fonaSS.print(F("AT+SAPBR=3,1,\"PWD\",\""));
    fonaSS.print(pwd);
    fonaSS.println("\"");
    if (strstr(readData(3000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR PASSWORD"));
        }
        return false;
    }
    fonaSS.println(F("AT+SAPBR=1,1"));
    if (strstr(readData(4000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR=1,1 Connection ip"));
        }
        return false;
    }
    fonaSS.println(F("AT+SAPBR=2,1"));
    if (strstr(readData(4000), "+SAPBR:") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+SAPBR=2,1 no IP to show"));
        }
        return false;
    }
    return true;
}

bool module_begin() {
    pinMode(FONA_RST, OUTPUT);
    digitalWrite(FONA_RST, HIGH);
    delay(500);
    digitalWrite(FONA_RST, LOW);
    delay(500);
    digitalWrite(FONA_RST, HIGH);
    delay(500);
    Serial.println(F("Attempting to open comm with ATs"));
    int16_t timeout = 10000;
    while (timeout > 0) {
        if (sendMessageAndwaitForOK("AT"))
            break;
        delay(500);
        timeout -= 500;
    }
    if (timeout <= 0) {
        Serial.println(F("Timeout: No response to AT... last ditch attempt."));
        sendMessageAndwaitForOK("AT");
        delay(100);
        sendMessageAndwaitForOK("AT");
        delay(100);
        sendMessageAndwaitForOK("AT");
        delay(100);
        return false;
    }
    sendMessageAndwaitForOK("ATE0");
    delay(100);
    return true;
}

bool sendToUbidots(char* request) {
  
    fonaSS.println(F("AT+CIPMUX=0"));
    if (strstr(readData(4000), "OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CIPMUX"));
        }
        return false;
    }
    fonaSS.print(F("AT+CIPSTART=\"TCP\",\""));
    fonaSS.print(SERVER);
    fonaSS.print(F("\",\""));
    fonaSS.print(PORT);
    fonaSS.println(F("\""));
    if (strstr(readData(4000), "CONNECT OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CIPSTART"));
        }
        return false;
    }
    fonaSS.print(F("AT+CIPSEND="));
    fonaSS.println(dataLen(request));
    if (strstr(readData(4000), ">") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CIPSEND"));
        }
        return false;
    }
    fonaSS.write(request);
    if (strstr(readData(4000), "SEND OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error sending variables"));
        }
        return false;
    }
    fonaSS.println(F("AT+CIPCLOSE"));
    if (strstr(readData(4000), "CLOSE OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CIPCLOSE"));
        }
        return false;
    }
    fonaSS.println(F("AT+CIPSHUT"));
    if (strstr(readData(4000), "SHUT OK") == NULL) {
        if (_debug) {
            Serial.println(F("Error with AT+CIPSHUT"));
        }
        return false;
    }
    return true;
}

int dataLen(char* variable) {
  uint8_t dataLen = 0;
  for (int i = 0; i <= 250; i++) {
    if (variable[i] != '\0') {
      dataLen++;
    } else {
      break;
    }
  }
  return dataLen;
}

bool checkFona() {
    fonaSS.begin(4800);
    delay(2000);
    module_begin();
    if (!sendMessageAndwaitForOK("ATE0", 6000)) {
        Serial.print("Couldn't find FONA");
        while (1) {
            Serial.println("ERROR");
        }
        return false;
    }
    return true;
}

char* readData(uint16_t timeout) {
    uint16_t replyidx = 0;
    char replybuffer[254];
    int secconds = 0;
    while (!fonaSS.available() && secconds < timeout) {
        secconds++;
    }
    while (timeout--) {
        if (replyidx >= 254) {
            break;
        }
        while (fonaSS.available()) {
            char c =  fonaSS.read();
            if (c == '\r') continue;
            if (c == 0xA) {
                if (replyidx == 0)   // the first 0x0A is ignored
                    continue;
            }
            replybuffer[replyidx] = c;
            replyidx++;
        }
        while (!fonaSS.available() && timeout > 0) {
            timeout--;
            delay(1);
        }

        if (timeout == 0) {
            if (fonaSS.available()) {
                timeout = 1000;
            } else {
                break;
            }
        }
    }
    replybuffer[replyidx] = '\0';  // null term
    if (_debug) {
        Serial.println("Response of FONA:");
        Serial.println(replybuffer);
    }
    return replybuffer;
}


#2

Greetings, from this line

Error
Timeout: No response to AT... last ditch attempt.

It seems that you are not reaching a response from the server, have you tried to make a http request to another site like google.com to discard hardware or communication issues?

All the best


#3

Hi there
Using the test code from Adafruit I have successfully made an http request to another site. It just doesn’t seem to work with the example code from Ubidots.

Matt


#4

Greetings, your error seems related with the checkFona() method, unfortunately, I do not have a Fona with me for testing so I advise you to edit the actual script that is working for you to send the payload that is actually being built in the main loop() of the example:

char* request = (char *) malloc(sizeof(char) * 300);
char str_val[15];
    
float sensor_value = analogRead(A0);

dtostrf(sensor_value, 4, 2, str_val);
sprintf(request, "%s/%s|%s|%s|%s=>%s:%s|end", USER_AGENT, VERSION, METHOD, TOKEN, DEVICE_LABEL, VARIABLE_LABEL, str_val);
//sprintf(request, "%s|%s|%s","adafruit/1.0|POST", TOKEN, "fona=>test:17.00|end");
sendToUbidots(request);
free(request);

Also, please check if both Rx and Tx Fona pins are correct for your hardware wiring.

All the best