Esp32 + sim800l

Hallo wieder und schönen Abend,

zu meiner Frage diesmal:
Ich will meinen ESP32 D1 Mini Board mit einem SIM800L Modul verbinden.

Da ich aus dem Internet gesehen habe, dass das ESP32 d1 mini auch auf Pin 17&16 UART hat, habe ich dort meine SIM800L angeschlossen.
Ich weis auch das SIM800L Modul stabile Spannung benötig, hab aber jetzt nichts da somit habe ich es auf den 3,3V Pin vom ESP32 angeschlosse.

Es Blinkt mal im Sekundentakt, was laut internet bedeutet, das es Power hat aber keine Verbindung vorhanden ist.

Ich bekomme immer den Error:

#error "Please define GSM modem model"
.
.
.
Fehler beim Kompilieren für das Board NodeMCU-32S.

Jedoch habe ich meiner meinung nach mit

#define TINY_GSM_MODEM_SIM800 // SIM800 declared as a module
das Modem Modell definiert

Hier noch mein derzeitiger testcode:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"
#include <Wire.h>
#include <TinyGsmClient.h>
/*
  #define I2C_Freq 100000

  #define SDA_0 21
  #define SCL_0 22

  #define SDA_1 17
  #define SCL_1 16

  TwoWire I2C_0 = TwoWire(0);
  TwoWire I2C_1 = TwoWire(1);
*/
#define TINY_GSM_MODEM_SIM800 // SIM800 declared as a module

// Your GPRS credentials (leave empty, if not needed)
const char apn[]      = "internet.t-mobile.at"; // APN (example: internet.vodafone.pt) use https://wiki.apnchanger.org
const char gprsUser[] = "t-mobile"; // GPRS User
const char gprsPass[] = "tm"; // GPRS Password

// SIM card PIN (leave empty, if not defined)
const char simPIN[]   = "1079";
/*
  // TTGO T-Call pins
  #define MODEM_RST            5
  #define MODEM_PWKEY          4
  #define MODEM_POWER_ON       23
*/
#define MODEM_TX             17
#define MODEM_RX             16
#define SERIAL_8N1             115200

// Set serial for debug console (to Serial Monitor, default speed 115200)
#define SerialMon Serial
// Set serial for AT commands (to SIM800 module)
#define SerialAT Serial1

#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif

RTC_DS1307 rtc;
TinyGsmClient client(modem);


char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};


void setup () {
  Serial.begin(115200);
  SerialMon.begin(115200);

  //I2C_0.begin(SDA_0 , SCL_0 , I2C_Freq );
  //I2C_1.begin(SDA_1 , SCL_1 , I2C_Freq );
  /*
    // Set modem reset, enable, power pins
    pinMode(MODEM_PWKEY, OUTPUT);
    pinMode(MODEM_RST, OUTPUT);
    pinMode(MODEM_POWER_ON, OUTPUT);
    digitalWrite(MODEM_PWKEY, LOW);
    digitalWrite(MODEM_RST, HIGH);
    digitalWrite(MODEM_POWER_ON, HIGH);
  */
  // Set GSM module baud rate and UART pins
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  delay(3000);

  // Restart SIM800 module, it takes quite some time
  // To skip it, call init() instead of restart()
  SerialMon.println("Initializing modem...");
  modem.restart();
  // use modem.init() if you don't need the complete restart

  // Unlock your SIM card with a PIN if needed
  if (strlen(simPIN) && modem.getSimStatus() != 3 ) {
    modem.simUnlock(simPIN);
  }



  //#ifndef ESP8266
  //while (!Serial); // wait for serial port to connect. Needed for native USB
  //#endif

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    rtc.adjust(DateTime(2022, 07, 31, 21, 11, 0));
  }

  // When time needs to be re-set on a previously configured device, the
  // following line sets the RTC to the date & time this sketch was compiled
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // January 21, 2014 at 3am you would call:
  rtc.adjust(DateTime(2022, 07, 31, 21, 15, 0));
}

void loop () {

  SerialMon.print("Connecting to APN: ");
  SerialMon.print(apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    SerialMon.println(" fail");
  }
  else {
    SerialMon.println(" OK");

    modem.gprsDisconnect();
    SerialMon.println(F("GPRS disconnected"));
  }

  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}

Wie gesagt Pining:
SIM800L -> ESP32 d1 mini
Vcc _> 3,3V
GND -> GND
RXD -> GPIO17
TXD -> GPIO16

Hier der Link zum Pinout vom ESP32 d1 mini:
https://sthack.eu/wiki/wemos-mini-d1-esp32/

Hier das Datenblatt zum SIM800L:
SIM800L DE.pdf (3,5 MB)

Hab auch über die Lib GSMSim.h mit diesem Code versucht:

 /*
 * GSMSim Example
 * 
 * GSMSim_Module_Info.ino
 *
 * By Erdem ARSLAN
 * Version: v.2.0.1
 *
 * The MIT License (MIT)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
*/

#include <GSMSim.h>

// You can use any Serial interface. I recommended HardwareSerial. Please use the library with highiest baudrate.
// In examples, i used HardwareSerial. You can change it anymore.

#define RESET_PIN 34 // you can use any pin.
GSMSim gsm(Serial1, RESET_PIN);

void setup() {
	Serial1.begin(115200); // If you dont change module baudrate, it comes with auto baudrate.

	while(!Serial1) {
		; // wait for module for connect.
	}

	Serial.begin(115200); // Serial for debug...

	// Init module...
	gsm.init(); // use for reseting module. Use it if you dont have any valid reason.

	// Module Manifacturer
	Serial.print("Module Manifacturer... ");
	Serial.println(gsm.moduleManufacturer());
	delay(1000);

	// Module Manifacturer
	Serial.print("Module Model... ");
	Serial.println(gsm.moduleModel());
	delay(1000);

	// Module Manifacturer
	Serial.print("Module Revision... ");
	Serial.println(gsm.moduleRevision());
	delay(1000);

	// Module Manifacturer
	Serial.print("Module IMEI... ");
	Serial.println(gsm.moduleIMEI());
	delay(1000);

	// For other methods please look at readme.txt file.

}

void loop() {
	
	// Use your Serial interface...
	if(Serial1.available()) {
		Serial.println(Serial1.readString());
	}
	
	// put your main code here, to run repeatedly:
}

Module Manifacturer...
Module Model...
Module Revision...
Module IMEI...

Leider auch keinen erfolgt.

Vlt hat ja von euch Profis schon jemand damit Erfahrung und kennt die Probleme und wäre so nett sich die Zeit zu nehmen und mir zu helfen das mal zum laufen zu bringen.

Das versenden der daten danach, muss ich mir erst ansehen, aber wäre schon mal froh wenn es soweit funktioniert.

Danke

Lg

Ich zitiere mal SIM800L Modul • Wolles Elektronikkiste

" ...und aufgrund von Stromspitzen bis zu 2 Ampere, ist eine Spannungsversorgung über den Mikrocontroller nicht möglich. Geeignet sind Lithium-Ionen-Akkus, oder ihr setzt Schaltregler wie den LM2596 ein. Für Schaltregler braucht ihr dann aber auch ein Netzteil, das ausreichend Strom liefert."

Also erstmal um eine vernünftige Stromversorgung kümmern, sonst wirst Du auch mit funktionierendem Code nicht glücklich.

Das passt so auch nicht.

Ja, genauer UART2, was Du direkt mit Serial2.begin(115200); ansprechen kannst.

Die Pins von UART1 ausgerechnet auf die Pins von UART2 umzulegen, ist unglücklich und unnötig.

Die Minis sollen, so las ich, so schwache Spannungsregler verbaut haben, daß noch nichtmal Wifi ordentlich funktioniert. Da noch zusätzlich ein Funkmodul dranzuhängen, halte ich für keine gute Idee.

Ein Blick in die Beispiele offenbart, falsche Reihenfolge, so geht es:

#define TINY_GSM_MODEM_SIM800 // SIM800 declared as a module
#include <TinyGsmClient.h>
...
#define SerialAT Serial2
...
  SerialAT.begin(115200);

Wann soll das zur Wirkung kommen?
So wie es da steht: Niemals!

Du meinst:


#define TINY_GSM_MODEM_SIM800 // SIM800 declared as a module
#include <TinyGsmClient.h>

Genau in der Reihenfolge findet sich das auch in den Beispielen.

Tipp:
Gegen eigene Ideen ist nichts einzuwenden!
Außer, wenn sie nicht funktionieren.

Ok danke, ich hab das gelesen aber wollte es so versuchen,
Werd dann mal über Batterie und Spannungsteiler versuchen das zu lösen.

Lg

Hey, danke das du mir wieder hilfst,

Ok das bedeutet wenn ich mit UART2 arbeiten will, dann muss ich Serial2.begin() verwenden?
Das mit der Versorgung ändere ich jetzt dann

Danke wusste nicht das es zuerst sein muss, hab anscheinend zuweing darauf geachtet bzw. mir war nicht bewusst das es eine Rolle spielt.

Lg

Hey,

auch dir danke für die Antwort.
Wie schon gesagt wusste nicht das es eine Rolle spielt aber wenn man kurz drüber nachdenkt ist es logisch das es so nicht funktionieren kann.

Lg

Bitte DC-DC-Regler nutzen, gibt es in ganz unterschiedlichsten Arten, auch mit Anzeige.

Hab leider keinen und möchtes das aber gerne zuerst versuchen.

Gibt es keine andere möglichkeit?

Lg

LiPo Accu?

Was genau möchtest du zuerst versuchen ?

Ein belasteter Spannungsteiler geht nicht, weil sich der Lastwiderstand ständig ändert.

In meinem Bastelkeller haben sich unterschiedliche Dinge angesammelt, nur weiß ich nicht, was Du so rumliegen hast.

Hm hab auch vieles herumliegen jedoch keine ahnung was für die anwendung am besten funktionieren könnte?

Hättest du vlt vorschläge wie du es mit herumliegenden sachen machen würdest?

Vlt kann ich ja etwas nachbaun.

Also nur in stichworten keine anleitung, nur damit ich vlt eine idee bekomme...

Danke

Lg

Das mit dem spannungsteiler aber ja, der widerstand ist ein problem.

Lg

Widerstände in der Spannungsversorgung ist immer eine ganz schlechte Lösung, da bei höherem Strom der Spannungsabfall größer wird un deine nutzbare Spannung damit kleiner. Somit hast du nie eine stabile Spannung.
Dein Problem ist def. nur mit einem guten Spannungsregler bzw. Stepdown-Regler oder einem entsprechenden Akku zu lösen.

Wir wissen leider nicht, was du bei dir rumliegen hast.

Zunächst möchtest Du ja nur etwas Kommunizieren, da werden nicht gleich 2 A fließen. Hast Du einen UNO oder sowas mit 3,3 V Pin rumliegen?

Oder zwei 1,5 V Batterien.

Oder drei 1,2 V = 3,6 V (nachmessen!) mit fünf Dioden in Fließrichtung in Reihe (nachmessen!).

Ich befürchte, das siehst du falsch.
Die GSM-Module ziehen immer schon viel Strom ( ca. 2A) beim einbuchen. Steht der Strom dann nicht zur Verfügung, schlägt das Einbuchen schon fehl.

Doch das tun sie!
Nicht dauerhaft, aber schon solche Peaks.