SIM800L data ze sériové linky

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

SIM800L data ze sériové linky

Příspěvek od epzlin » 31 led 2022, 15:54

Jakým způsobem převedu informaci o síle signálu do proměnné "silaSignalu"?

Kód: Vybrat vše

#define PIN_TX 3
#define PIN_RX 2
#include <SoftwareSerial.h>
SoftwareSerial VIRTUAL_UART(PIN_TX, PIN_RX);

char serialBuffer[100];
unsigned long cas;
byte silaSignalu;


void setup(){
  Serial.begin(9600);
  VIRTUAL_UART.begin(9600);
}

void loop(){
  if( millis() >= cas+1000){
        cas = millis();
        VIRTUAL_UART.println("AT+CSQ");
        getResponse();
        }   
}

void getResponse(){
  uint8_t var;
  var = VIRTUAL_UART.available();
  if (0 < var){
  VIRTUAL_UART.readBytes(serialBuffer, var);
  Serial.write(serialBuffer, var);
  }
}

void kontrolaSignalu(){
Serial.println("Kontrola sily signalu.");
VIRTUAL_UART.println("AT+CSQ");
getResponse();
}
Na sériové lince dostávám toto:
OK
AT+CSQ

+CSQ: 28,0

OK
AT+CSQ

+CSQ: 28,0

OK
AT+CSQ

+CSQ: 28,0

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: SIM800L data ze sériové linky

Příspěvek od jankop » 31 led 2022, 17:38

Tady je to dobře popsáno a mohlo by to i platit
https://m2msupport.net/m2msupport/atcsq-signal-quality/

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: SIM800L data ze sériové linky

Příspěvek od epzlin » 09 úno 2022, 12:31

Tak toto mi vůbec nepomohlo. Používám teď tuto knihovnu
https://github.com/Seeed-Studio/GPRS_SIM900

#include <GPRS_Shield_Arduino.h>

ve které by mělo být zakomponované to získání signálu.

Kód: Vybrat vše

    bool getSignalStrength(int* buffer);

    /** Send USSD Command Synchronously (Blocking call until unsolicited response is received)
        @param
     *		*ussdCommand string command UUSD, ex: *123#
     *		*resultCode	char Result Code, see AT+CUSD command
     *		*response	string response
     *		*cellBroadcast	int Cell Broadcast Data Coding Scheme
        @returns
            true on success
            false on error
    */

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}
Jakým příkazem a jak si z toho dokážu zjistit tu sílu signálu?

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: SIM800L data ze sériové linky

Příspěvek od jankop » 09 úno 2022, 16:26

Je to velmi jednoduché a pochybuji, že změnou knihovny něco vyřešíš. Ten odkaz, který jsem ti dal, je prakticky vyčerpávající. Příkaz AT+CSQ ti vrátí dvě hodnoty. Pravděpodobně dva stringy oddělené čárkou. Ty vezmeš tu první hodnotu, převedeš ji na číslo. Čtyřmi podmínkami vyhodnotíš stavy 0,1,31 a 99 a hodnoty 2 - 30 přemapuješ třeba polem o 29 prvcích. Za příkaz map() bych v tomto případě ruku do ohně nedal. Hledáš vědu, kde není. Ve svém původním programu vytvoř proměnnou integer CSQ a najdi způsob, jak do ní uložit tu část odpovědi 28 z celé odpovědi +CSQ: 28,0. Prostě vezmeš náležitou část řetězce a uděláš konverzi na integer. Protože údaj v dBm je pro mnoho lidí matoucí, je možné udělat ještě další konverzi na procenta síly signálu.
SIM800L.png
Na druhé straně tohle pravděpodobně vraci přímo hodnotu RSSI i když pro mě je to poněkud nepřehledné.

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: SIM800L data ze sériové linky

Příspěvek od epzlin » 13 úno 2022, 14:18

Stále tápu. Jak tato funkce může vrátit sílu signálu, když je typu boolean?

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: SIM800L data ze sériové linky

Příspěvek od jankop » 13 úno 2022, 15:16

Parametr je ovšem typu ukazatel. Pročpak tam asi je? Funkci je možné parametry hodnoty předat a funkce může také hodnoty prostřednictvím parametrů vracet.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů