Hola MaestroLopez:
Te comento que actualmente estoy trabajando en un proyecto con el SIM808 de Elecrow. Este lo tengo configurado con los jumpers en SWserial, enviando los datos a través de los pines 7 y 8 del Arduino Uno (utilizando la librería SoftwareSerial.h).
Creo que no es correcto que utilices como referencia la placa de desarrollo de Elecrow para tu proyecto, ya que tiene varias diferencias con la tuya.
Por lo que estuve viendo en la información técnica de tu placa, además de conectar los pines de RX y TX, debes conectar el pin VMCU a un voltaje de referencia, el cual adaptará los niveles lógicos de entrada. El texto extraído de la documentación dice:
"5. TTL serial interface: a TTL level interface. Notice that: The pin of VMCU is used to
control the high level of TTL UART, so as to realize to match between 1.25V/3.3V /5V
systems. For example, if you want to use the 51 MCU to control this board, the pin of VMCU
should be connected the DC5V. And if use the STM32 MCU, the pin of VMCU should be
connected the DC3.3V. The pins of RXD is the RXD of SIM808 and the pins of TXD is the
TXD of SIM808. The pin of V_IN can connect the Power, the function of this pin has the
same function of DC044. "
Haciendo la comparación con la placa de Elecrow, dicho voltaje tiene conectado un Zener de 5.1 volts, por lo que te sugiero (a menos que alguien diga lo contrario) lo conectes a 5 volts.
En el siguiente link podrás descargar la información técnica de tu placa
Descargar información técnica aquí
Y en este otro link podrás descargar los archivos .brd y .sch para que hagas tu análisis (debes tener un programa como Eagle instalado):
Descargar aquí
Si logras comunicar la placa de desarrollo del SIM808 con el Arduino a través de los pines 7 y 8, puedes probar el siguiente sketch (a mi me funciona bien):
#include <SoftwareSerial.h>
int Powerkey = 9;
SoftwareSerial mySerial(7,8);
void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
if (! power()) {
Serial.println(F("SIM808 no puede ser energizado!!"));
while(1);
}
}
void loop()
{
//Aquí va tu programa
}
/***************************************************************/
/** POWER ON **/
/***************************************************************/
boolean power()
{
digitalWrite(Powerkey, HIGH);
delay(10);
digitalWrite(Powerkey,LOW);
delay(10);
digitalWrite(Powerkey, HIGH);
Serial.println(F("Intentando encender con comandos AT"));
int16_t timeout = 7000;
while (timeout > 0) {
while (mySerial.available()) mySerial.read();
if (sendATcommand("AT","ok",200) == 1)
break;
while (mySerial.available()) mySerial.read();
if (sendATcommand("AT","AT",200) == 1)
break;
delay(500);
timeout-=500;
}
if (timeout <= 0) {
Serial.println(F("Timeout: No responde a los comandos AT."));
sendATcommand("AT","ok",200);
delay(100);
sendATcommand("AT","ok",200);
delay(100);
sendATcommand("AT","ok",200);
delay(100);
}
// turn off Echo!
sendATcommand("ATE0","ok",100);
delay(100);
if (sendATcommand("ATE0","OK",100) != 1) {
return false;
}
delay(100);
flushInput();
return true;
}
/***************************************************************/
/** Send AT Command **/
/***************************************************************/
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0;
char response[100];
unsigned long previous;
memset(response, '\0', 100);
delay(100);
while( mySerial.available() > 0) mySerial.read();
mySerial.println(ATcommand);
delay (2000);
x = 0;
previous = millis();
do{
if(mySerial.available() != 0){
response[x] = mySerial.read();
x++;
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
}
while((answer == 0) && ((millis() - previous) < timeout));
return answer;
}
/***************************************************************/
/** Flush Input **/
/***************************************************************/
void flushInput() {
uint16_t timeoutloop = 0;
while (timeoutloop++ < 40) {
while(mySerial.available()) {
mySerial.read();
timeoutloop = 0;
}
delay(1);
}
}
Saludos!!!