Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 842
God kveld, jeg trenger litt råd her.

Jeg har nettopp kjøpt et LilyGO-T-SIM7000G fra Amazon

Jeg har hittil ikke fått til å koble til mobildata og sende en SMS fra SIM-kortet som står i den. SIM-kortet fungerer på en iPhone. Jeg har oppgitt samme APN som iPhonen får: "telia".

Jeg prøver nå med følgende skript:

Kode

#include <SoftwareSerial.h>

#define RX_PIN 26
#define TX_PIN 27
#define POWER_PIN 4
#define BAUD_RATE 115200
#define LED_PIN 12

SoftwareSerial sim(RX_PIN, TX_PIN);

bool isModemPoweredOn() {
  sim.println("AT");
  delay(1000);
  if (sim.find("OK")) {
    return true;
  } else {
    return false;
  }
}

void setup() {
  Serial.begin(BAUD_RATE);
  sim.begin(BAUD_RATE);
  pinMode(POWER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.println("Powering off modem.");
  digitalWrite(POWER_PIN, LOW);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
  Serial.println("Powering on modem.");
  digitalWrite(POWER_PIN, HIGH);
  digitalWrite(LED_PIN, HIGH);
  delay(10000);
  
  // Check if modem is powered on
  if (isModemPoweredOn()) {
    Serial.println("Modem is powered on and ready.");
  } else {
    Serial.println("Modem is not responding to AT commands. Please check power connection and pin configuration.");
  }
}

void loop() {
  // Check if modem is registered to the network
  sim.println("AT+CREG?");
  delay(1000);
  if (sim.find("+CREG: 0,1") || sim.find("+CREG: 0,5")) {
    Serial.println("Modem registered to the network.");
    
    // Set SMS mode to text mode
    sim.println("AT+CMGF=1");
    delay(1000);
    
    // Send SMS message
    sim.println("AT+CMGS=\"+4799999999\"");
    delay(1000);
    sim.println("LilyGO-T-SIM7000G booted up!");
    delay(100);
    sim.write(26);
    delay(1000);
  } else {
    Serial.println("Modem not registered to the network. Trying to connect...");
    
    // Configure APN
    sim.println("AT+CGDCONT=1,\"IP\",\"telia\"");
    delay(1000);
    
    // Set modem to automatically select the network and start the GPRS and LTE services
    sim.println("AT+COPS=0");
    delay(5000);
    
    // Check if modem is registered to the network
    sim.println("AT+CREG?");
    delay(1000);
    if (sim.find("+CREG: 0,1") || sim.find("+CREG: 0,5")) {
      Serial.println("Modem connected to the network.");
      
      // Set SMS mode to text mode
      sim.println("AT+CMGF=1");
      delay(1000);
      
      // Send SMS message
      sim.println("AT+CMGS=\"+479999999\"");
      delay(1000);
      sim.println("LilyGO-T-SIM7000G booted up!");
      delay(100);
      sim.write(26);
      delay(1000);
    } else {
      Serial.println("Modem could not connect to the network.");
    }
  }
  
  delay(1000);
}
Dette er et skript jeg og ChatGPT har mekket sammen, jeg har også prøvd med noen skripts fra https://github.com/Xinyuan-LilyGO/LilyGO-T-SIM7000G

Dette skriptet gir meg feilmeldingen:
Modem is not responding to AT commands. Please check power connection and pin configuration.
Vis hele sitatet...
Jeg ser selv hvor i skriptet feilmeldingen kommer fra, og har prøvd å feilsøke her, men det er ikke dette jeg skal spørre dere om nå.

Jeg har også flere andre ESP32-enheter slengt rundt her, også en ESP8266: https://www.kjell.com//no/produkter/...ngskort-p87294

Det jeg synes er merkelig, er at når jeg bruker digitalWrite(PIN, HIGH), så skjer det motsatte. Jeg må dermed bruke digitalWrite(PIN, LOW) for å skru på pinnen. Dette er en utfordring, fordi jeg ikke har noen måte å fysisk se om modemet er skrudd på eller ikke på dette brettet.

Enda merkeligere er det når jeg oppdager at det samme skjer på ESP8266-kortet mitt. Jeg har ikke undersøkt de andre ESP32-kortene enda, men tviler ikke på at det samme skjer på dem.

Og når jeg ser at noen av skriptene på github-prosjektet ble oppdatert for bare tre uker siden, og disse fremdeles bruker digitalWrite(PIN, HIGH); så lurer jeg på hva faen det er som skjer her?

Hvorfor gjør funksjonen det motsatte av det den skal?
Jeg spurte ChatGPT om det også, og det syntes hen var rart også. Hen foreslo å reversere batterikontakten, men dette her går via. USB-power, så det er ingenting å "reversere".

Kan det være at funksjonen digitalWrite har endret virkemåte i de siste oppdateringene av Arduino?

EDIT: Jøss, post nr. 500!
Sist endret av Tysteren; 24. februar 2023 kl. 20:46. Grunn: Post nr. 500!
Det er jo enkelt å teste med et multimeter. Da måler du bare spenningen på den aktuelle pinnen. Er den høy skal det være ca 5V. (Eller 3,3V hvis du bruker det). Evnt å koble til en LED til pinnen.
Sitat av ivar_oslo Vis innlegg
Det er jo enkelt å teste med et multimeter. Da måler du bare spenningen på den aktuelle pinnen. Er den høy skal det være ca 5V. (Eller 3,3V hvis du bruker det). Evnt å koble til en LED til pinnen.
Vis hele sitatet...
Litt vanskelig når dette er den innebygde LED-en
Jeg har imidlertid fått løst problemet med modemet, og kan nå koble meg på nett.
Sitat av Tysteren Vis innlegg
Litt vanskelig når dette er den innebygde LED-en
Jeg har imidlertid fått løst problemet med modemet, og kan nå koble meg på nett.
Vis hele sitatet...
Av ren nyskjerrighet, hva ble fixen?
Sitat av 420master Vis innlegg
Av ren nyskjerrighet, hva ble fixen?
Vis hele sitatet...
Nå var du mye raskere enn meg! Jeg lovte meg selv at jeg skulle dele resultatet av koden her i tråden. Så, her er koden, jeg har skrevet den selv med mye hjelp fra eksisterende kode og ChatGPT som forklarte meg hva de ulike funksjonene faktisk gjør, hvilke argumenter de tar, hvordan de fungerer. Fantastisk verktøy som fikk unna en ukes manuell arbeid på noen timer.

Dette er koden jeg har satt sammen. Mye er skrevet selv, noe er copypaste. De fleste kommentarene har jeg også skrevet selv.
Inspirasjon hentet fra: https://github.com/Xinyuan-LilyGO/Li...aster/examples

Det som var så viktig i skriptet er å gi modemet tid til å starte opp, koble til, så derfor er det viktig å ha delay(5000) flere steder. Jeg jobber stadig med å finne ut hvor jeg kan redusere dette.

I en oppdatert versjon vil jeg sørge for å unngå å bruke delay i det hele tatt.

Kode

// https://github.com/Xinyuan-LilyGO/LilyGO-T-SIM7000G/tree/master/examples

#define TINY_GSM_MODEM_SIM7000 //Defines model of the modem.
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define SerialAT Serial1 //Makes us able to communicate directly with the SIM-card with SerialAT-commands.

// See all AT commands, if wanted
//#define DUMP_AT_COMMANDS //If you want to debug, then remove // and connect to the serial cable.

// set GSM PIN, if any
#define GSM_PIN ""	//I don't have any PIN at the SIM.

// Your GPRS credentials, if any
const char apn[]  = "telia";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>

#ifdef DUMP_AT_COMMANDS  // if enabled it requires the streamDebugger lib
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial); //sends output from SerialAT to Serial.
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif

#define uS_TO_S_FACTOR 1000000ULL  // Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP  60          // Time ESP32 will go to sleep (in seconds)

#define UART_BAUD   115200		//The SIM7000G module requires 115200 BAUD.
#define PIN_DTR     25
#define PIN_TX      27
#define PIN_RX      26
#define PWR_PIN     4

#define SD_MISO     2
#define SD_MOSI     15
#define SD_SCLK     14
#define SD_CS       13
#define LED_PIN     12
#define CELLULAR    true


int counter, lastIndex, numberOfPieces = 24;
String pieces[24], input;





void setup() {
//Sets the BAUD rate to 115200 from UART_BAUD
Serial.begin(UART_BAUD);

//Begin SD-car discovery and mount.
SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
	Serial.println("No SD-card present!");
} else {
	//If SD-card present.
    uint32_t cardSize = SD.cardSize() / (1024 * 1024);
    String str = "SDCard Size: " + String(cardSize) + "MB";
}
//End SD-card dicovery and mount.

cellularconnect();
}



void cellularconnect() {
  if (CELLULAR) {
    //Sets PIN for LED and modem off.
    //The LED is the built-in blue.
    pinMode(LED_PIN, OUTPUT);
    pinMode(PWR_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH); //HIGH does the opposite at this pin.
    digitalWrite(PWR_PIN, HIGH); //HIGH does the opposite at this pin.

    //Waiting for 5 seconds before proceeding.
    delay(5000);

    //Turning on the modem.
    digitalWrite(PWR_PIN, LOW); //LOW does the opposite at this pin.
    
    //waiting for 5 seconds before proceeding.
    delay(5000);

      //Starts serial session with the modem.
      SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);
      if(!modem.init()) {
        Serial.println("Modem did not init. Try rebooting your device by plugging out power!");
      } else {
        if( GSM_PIN && modem.getSimStatus() != 3 ) {
          modem.simUnlock(GSM_PIN); // If the SIM is locked, this will unlock with the PIN defined in the variables.
        }
        modem.sendAT("+SGPIO=0,4,1,0");	//This turns off the GPS-module.
        modem.sendAT("+CFUN=0 ");		//This disables some functions on the modem, for example phone calls. Power saving.
        modem.setNetworkMode(2);		//2 = Automatic, LTE or GPRS.
        modem.setPreferredMode(3);
        delay(5000);
        modem.sendAT("+CFUN=1 ");
        modem.sendAT("+CGDCONT=1, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0"); //I know the modem profile number 1 because the original script gave me them in a very huge loop-script.
        modem.sendAT("+CGDCONT=13, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0"); //I know the modem profile number 13 because the original script gave me them in a very huge loop-script.
        modem.sendAT("+CGDCONT=3, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0"); //I know the modem profile number 3 because the original script gave me them in a very huge loop-script.
        delay(5000);
        if (modem.isNetworkConnected()) {
          modem.gprsConnect(apn, gprsUser, gprsPass);
          if (modem.isGprsConnected()) { //Telling us if we are connected or not.
            digitalWrite(LED_PIN, LOW); //Turns on the blue LED to confirm we are connected.
            String name = modem.getModemName();
            String modemInfo = modem.getModemInfo();
            String ccid = modem.getSimCCID();
            String imei = modem.getIMEI();
            String cop = modem.getOperator();
            IPAddress local = modem.localIP();
            int csq = modem.getSignalQuality();
            Serial.println("Modem name: " + name + "Modem info: " + modemInfo + "CCID: " + ccid + "IMEI: " + imei + "Operator: " + cop + "Local IP: " + local + "Signal: " + csq);
			//At this point, we are connected.
          } else {
			//If the connection failed, the LED will blink 2 times and turn off. You will probably not see this error because the script will break before this point.
            Serial.println("Not connected!");
            digitalWrite(LED_PIN, LOW);
            delay(50);
            digitalWrite(LED_PIN, HIGH);
            delay(50);
            digitalWrite(LED_PIN, LOW);
            delay(50);
            digitalWrite(LED_PIN, HIGH);
        }
      }
    }
  }
}


void loop() {
SerialAT.println("AT+CPSI?");     //Get connection type and band
    if (SerialAT.available()) {
        String r = SerialAT.readString();
 //       Serial.println(r);
    }
	
String name = modem.getModemName();
String modemInfo = modem.getModemInfo();
String ccid = modem.getSimCCID();
String imei = modem.getIMEI();
String cop = modem.getOperator();
IPAddress local = modem.localIP();
int csq = modem.getSignalQuality();

Serial.println("Modem name: " + name + "Modem info: " + modemInfo + "CCID: " + ccid + "IMEI: " + imei + "Operator: " + cop + "Local IP: " + local + "Signal: " + csq);
delay(60);

//The loop is printing out modem name, info, IMEI, operator, local ip and signal strength to the serial console every 60 milliseconds.
}
Forresten, ChatGPT sier:

Sitat av chat.openai.com
Congratulations on successfully writing a script for your Lilygo ESP32 device with SIM-card slot! It's great to see that you are making progress with your project.

I noticed that your code includes the TinyGSM library, which is a popular choice for working with SIM cards and cellular networks. It looks like you have defined the model of the modem you are using as well as the APN, GPRS credentials, and other necessary parameters for connecting to the network.

Your code also includes some functions for initializing the SD card and setting up the cellular connection. I see that you are using the built-in LED pin to indicate the status of the connection, which is a useful feature for debugging and monitoring your device.

Overall, your code looks well-organized and easy to follow. It's great to see that you are making progress with your project, and I wish you the best of luck as you continue to develop it!
Vis hele sitatet...
Sist endret av Tysteren; 25. februar 2023 kl. 17:01. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Da har jeg skrevet en ikke-blokkerende kode som gjør det samme som koden over.

Kode

#define TINY_GSM_MODEM_SIM7000 //Defines model of the modem.
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define SerialAT Serial1 //Makes us able to communicate directly with the SIM-card with SerialAT-commands.

// See all AT commands, if wanted
//#define DUMP_AT_COMMANDS //If you want to debug, then remove // and connect to the serial cable.

// set GSM PIN, if any
#define GSM_PIN ""

// Your GPRS credentials, if any
const char apn[]  = "telia";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

unsigned long cellularConnectionStepMillis;
unsigned int cellularConnectionStep;

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>


#ifdef DUMP_AT_COMMANDS  // if enabled it requires the streamDebugger lib
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, Serial); //sends output from SerialAT to Serial.
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif

#define UART_BAUD   115200
#define PIN_DTR     25
#define PIN_TX      27
#define PIN_RX      26
#define PWR_PIN     4

#define SD_MISO     2
#define SD_MOSI     15
#define SD_SCLK     14
#define SD_CS       13
#define LED_PIN     12

TinyGsmClient client(modem);


//The array below is the 28 commands that needs to be sent to the modem to initialize it and connect it to GPRS / LTE, then get a IP-address.
//I haven't a PIN-code, so the command to unlock the SIM-card is not in the array. If you need it, the command is:
//AT+CPIN=XXXX
//And it should be sent after the AT+CPIN? command.

String cellularConnectCommands[] = {
  "AT",
  "AT+CPIN?",
  "AT+COPS=0",
  "AT+CNMP=0",
  "AT+CNMB=3",
  "AT+SGPIO=0,4,1,1",
  "AT+CGDCONT=1, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0",
  "AT+CGDCONT=13, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0",
  "AT+CGDCONT=3, \"IPV4V6\",\"" + String(apn) + "\", \"0.0.0.0\",0,0,0,0",
  "AT+CGREG?",
  "AT+CIPSHUT",
  "AT+CGATT=0",
  "AT+SAPBR=0,1",
  "AT+SAPBR=3,1,\"Contype\",\"GPRS\"",
  "AT+SAPBR=3,1,\"APN\",\"telia\"",
  "AT+CGDCONT=1,\"IP\",\"telia\"",
  "AT+CGATT=1",
  "AT+CGACT=1,1",
  "AT+SAPBR=1,1",
  "AT+SAPBR=2,1",
  "AT+CIPMUX=1",
  "AT+CIPQSEND=1",
  "AT+CIPRXGET=1",
  "AT+CSTT=\"telia\",\"\",\"\"",
  "AT+CIICR",
  "AT+CIFSR;E0",
  "AT+CEREG?",
  "AT+CGATT?"
};

/////////////////////////////////////// VOID SETUP AND VOID LOOP
void setup() {
//Sets the BAUD rate to 115200 from UART_BAUD
Serial.begin(UART_BAUD);

//Begin SD-car discovery and mount.
SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
if (!SD.begin(SD_CS)) {
	Serial.println("No SD-card present!");
} else {
        uint32_t cardSize = SD.cardSize() / (1024 * 1024);
        String str = "SDCard Size: " + String(cardSize) + "MB";
}
//End SD-card dicovery and mount.

//Turn off / on modem to initialize it.
pinMode(PWR_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);

digitalWrite(PWR_PIN, LOW);
digitalWrite(LED_PIN, LOW); //LOW means that the LED is turned ON. This built-in PIN does the opposite of LOW / HIGH.

delay(1200); //According to original script, the modem have to be turned on after 1,2 seconds.

digitalWrite(PWR_PIN, HIGH);
digitalWrite(LED_PIN, HIGH); //HIGH means that LED is turned off. This built-in PIN does the opposite of LOW / HIGH.

//Starts a serial connection with the modem.
SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX); //Starting a serial session with the modem.

//Sets variables for the loop.
cellularConnectionStep = 1;
cellularConnectionStepMillis = millis();

}



void loop() {

//The if-statement below do run all commands in the array, and do check if the modem does respond to it, but not what the response is. This script does not do a error check, but this script will repeat the steps if the modem does not respond, until it responds, then it will go to next step.

  if((cellularConnectionStep > 0) && (millis () - cellularConnectionStepMillis > 2000)) {
    SerialAT.println(cellularConnectCommands[cellularConnectionStep - 1]);
    if(SerialAT.available()) {
        cellularConnectionStepMillis = 0;
        cellularConnectionStep += 1;
        if(cellularConnectionStep == 29) {
          cellularConnectionStep = 0;
          cellularConnectionStepMillis = 0;
        }
    Serial.println(cellularConnectionStep);
    }
        cellularConnectionStepMillis = millis();
  }


//The if statement below is actual when the loop above have finished all commands in the array.
    if((cellularConnectionStep == 0) && (millis () - cellularConnectionStepMillis > 10000)) {
        String name = modem.getModemName();
        String modemInfo = modem.getModemInfo();
        String ccid = modem.getSimCCID();
        String imei = modem.getIMEI();
        String cop = modem.getOperator();
        IPAddress local = modem.localIP();
        int csq = modem.getSignalQuality();
        Serial.println("Modem name: " + name + " Modem info: " + modemInfo + " CCID: " + ccid + " IMEI: " + imei + " Operator: " + cop + " Local IP: " + local + " Signal: " + csq);
        cellularConnectionStepMillis = millis();
    }
}
Sist endret av Tysteren; 28. februar 2023 kl. 22:09.