Skocz do zawartości

Problem z odczytem danych z softwareSerial


northrop

Pomocna odpowiedź

Czołem, trafiłem na problem nie do przejścia. Próbuję odczytać dane z portu D6 w arduino Nano, są tam nadawane dane co 1 sekundę w takim formacie:

PID	0xA057

FW	164

SER#	HQ242166E9E

V	20220

I	0

VPV	23880

PPV	0

CS	3

MPPT	2

OR	0x00000000

ERR	0

LOAD	OFF

H19	0

H20	0

H21	0

H22	0

H23	0

HSDS	3

Checksum	{

Program wygląda następująco:

#include <SoftwareSerial.h>
SoftwareSerial Sim800L(2, 3);
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DHT.h"

#define DHTPIN 4
#define DHTTYPE DHT22 
#define ONE_WIRE_BUS 12
DHT dht(DHTPIN, DHTTYPE); 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int rxPin = 6; // Pin D6 jako odbiornik (RX)
const int txPin = 7; //Opcjonalnie, jeżeli potrzebny (nieużywany w VE. Direct)
SoftwareSerial veSerial(rxPin, txPin);
long Napiecie = 0;
long Napiecie2 = 0;

String Script_ID="Tutaj ID skryptu";

void setup()
{
  veSerial.begin(19200);
  Serial.begin(9600);  
  sensors.begin();
  
  
  
  Sim800L.begin(9600);  // Sim800L 9600   for A9 moudle 115200
  Serial.println("Initializing...");
  delay(1000);

  Sim800L.println("AT"); //Once the handshake test is successful, it will back to OK
  delay(500);
  updateSerial();
  Sim800L.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  delay(500);
  updateSerial();
  Sim800L.println("AT+CBC"); //Signal quality test, value range is 0-31 , 31 is the best
  delay(500);
  updateSerial();  
  GPRS_Connection();
  delay(2000);
  updateSerial();
  
  dht.begin();

   
}

void loop()
{
  if (veSerial.available())
  {
    String line = veSerial.readStringUntil('\n');
    veSerial.flush();
    Serial.println(line);
    if (line.startsWith("V\t"))
    {
      Napiecie = line.substring(2).toInt();
    } else if (line.startsWith ("VPV\t"))
    {
      Napiecie2 = line.substring(4).toInt();
    }
    }
  Serial.println(Napiecie);
  
  
  float h = dht.readHumidity();
   float t = dht.readTemperature();
   if (isnan(h) || isnan(t) ) 
   {
    Serial.println(F("Failed to read from DHT sensor!"));
    h=random(999,999);
    t=random(999,999);
  }
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
  
Serial.println("Temperatura[BOX]: "+String(t)+"\t Wilgotność[BOX]: "+String(h)+"\t Temperatura[Kontener): "+String(temperatureC)+"\t Napiecie: "+String(Napiecie));

String url="script.google.com/macros/s/"+Script_ID+"/exec?value1="+String(t)+"&value2="+String(h)+"&value3="+String(temperatureC);

Serial.println("AT+HTTPINIT");
Sim800L.println("AT+HTTPINIT");
delay(500);
updateSerial();

Serial.println("AT+HTTPSSL=1");
Sim800L.println("AT+HTTPSSL=1");
delay(500);
updateSerial();

Serial.println("AT+HTTPPARA=\"CID\",1");
Sim800L.println("AT+HTTPPARA=\"CID\",1");
delay(500);
updateSerial();

Serial.println("AT+HTTPPARA=\"URL\","+url);
Sim800L.println("AT+HTTPPARA=\"URL\","+url);
delay(500);
updateSerial();

Serial.println("AT+HTTPACTION=0");
Sim800L.println("AT+HTTPACTION=0");
delay(200);
updateSerial();
delay(2000);
updateSerial();

Serial.println("AT+HTTPREAD");
Sim800L.println("AT+HTTPREAD");
delay(500);
updateSerial();

Serial.println("AT+HTTPTERM");
Sim800L.println("AT+HTTPTERM");
delay(2000);
updateSerial();



}
void updateSerial()
{
  while(Sim800L.available())    { parseData(Sim800L.readString());  }
  while (Serial.available())    { Sim800L.write(Serial.read());     }
}

void GPRS_Connection()
{
  Sim800L.println("AT+CGATT=1");
  delay(100);
  Sim800L.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(100);
  Sim800L.println("AT+SAPBR=3,1,\"APN\",\"internet\"");
  delay(100);
  Sim800L.println("AT+SAPBR=1,1");
  delay(100);
  Sim800L.println("AT+SAPBR=2,1");
  
  
}

void parseData(String buff)
{
  unsigned int len, index;
  index = buff.indexOf("\r");
  buff.remove(0, index+2);
  Serial.println("Buff:"+String(buff));
  buff.trim();
   
  
    if(buff.indexOf("+HTTPACTION:")>-1)
    {
      index = buff.indexOf(":");
      String HTTPACTION_code= buff.substring(index+4,index+7);
      HTTPACTION_code.trim();
      Serial.println("HTTPACTION_code:"+String(HTTPACTION_code));
      if(HTTPACTION_code=="601")
      {
        Serial.println("Restart GPRS Connection");
        GPRS_Connection();
      }
    
    }
    
  
}

Program wysyła dane na serwer do dokumentów google. Wszystko działa dobrze, tylko nie mogę odczytać wartości napięcia z softwareSerial (port D6). Jeżeli zakomentuję linię Sim800L.begin(9600); to od czasu do czasu pojawia się wartość napięcia. Natomiast po uruchomieniu połączenia z sim800l wartość napięcia zawsze wynosi 0. Wydaje mi się że program nie nadąża zapisywać danych z portu D6 oraz że jest jakieś zakłócenie po rozpoczęciu komunikacji z sim800l. Bardzo proszę o pomoc

Link do komentarza
Share on other sites

Niestety nadal nie udało mi się rozwiązać tego problemu, jeżeli ktoś mógłby mnie naprowadzić na rozwiązanie to będę ogromnie wdzięczny 🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.