Skocz do zawartości

SIM800L - problem z komunikacją (Arduino/Putty)


frankmartin

Pomocna odpowiedź

Cytat

Pokazane na rysunku podłączenie pinów Tx,Rx do klasycznego Arduino niestety może spowodować  uszkodzenie delikatnego modułu sim800L, których logika Tx,Rx jest na poziomie 2,8V

Wyczuwam powolne odjeżdżanie od tematu. Czy możemy wrócić do tego cytowanego fragmentu? Bo w tym momencie nie wiem jak bezpiecznie podłączyć piny Tx i Rx do arduino.

  • Lubię! 1
Link do komentarza
Share on other sites

No dobra, powiedzmy że to co uzyskałem dzisiaj to postęp. Wstawiłem kondensator 1500uF/6.3V oraz dorzuciłem rezystor 10k na linii Rx. 

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  mySerial.println("AT+CREG?"); //Check whether it has registered in the network
  updateSerial();
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  }
}

1926835617_Zrzutekranu2022-09-26194550.thumb.jpg.f96aa91e7e3ecc005c89895df1228741.jpg

Ma ktoś pomysł co poprawić ? 

Link do komentarza
Share on other sites

Witam ponownie.

Jesli nic nie działa, trzeba chwilowo  odstawić Arduino na bok  i sprawdzić "terminalem - na piechotę" czy sprawny jest sam sim800l bo będziesz się kręcić w kółko i nie zrobisz żadnego kroku do przodu.

 

 1. Kup sobie konwerter FT232 np. z tej oferty z allegro - można wziąć od razu od niego z kablem USB.(najlepiej wyrzuć ten PL2303)

https://allegro.pl/oferta/konwerter-ft232rl-ttl-rs232-uart-programator-12528594069?snapshot=MjAyMi0wOC0yNlQwODo0Nzo0NC4zNzNaO2J1eWVyOzMyMDRiYzJhYzQwYzRmZmZkOWRkYWZiMzgxNDkzZDEzMDc5ZDQxYzJhMmJjZmFmNTZlMzk3ZDc4MGViMjY2MDc%3D

2. Sprawdż czy dobrze działa terminal z konwerterem, czy prawidłowo działają sterowniki(może konieczne zainstalowanie) oraz 

 zmiana prędkości  ( może być nawet ten z IDE Arduino.) Ustaw  zworką w konwerterze zakres na 3.3V. Ustaw CR, LF w terminalu.

3. Zrób dzielnik  rezystorowy jak napiszę dalej  dla zabezpieczenia poziomu 2.8V (Tx konwertera-> Rx sim800L).  Połączenie: Rx konwertera ->Tx sim800L bezpośrednio, jest pewne że konwerter "załapie" poziom 2,8V modułu.

Kolejne podłączenie: to dzielnik napięcia . Ma być : konwerter Tx-->2  kOhm -->połączenie z 10 kOhm -> podłączenie do  GND.  Środek dzielnika -czyli punkt połączenia 2kOhm z 10kOhm przyłącz do goldpinu Rx modułu sim800L

4. Przeczytaj jeszcze raz sobie koniecznie dobry przewodnik do sim800L którego link Ci wcześniej podesłałem. Nie zapomnij o wspólnym połączeniu GND konwertera  i modułu sim800L.

5. Dołącz sobie mikrofon elektretowy i głośniczek do modułu sim800L, będziesz mógł sobie nawet porozmawiać z modułem z komórki jako jeden z testów.

6. Reszta - tj. kondensator 1500uF, uwagi o zasilaniu modułu sim800L  (4,2V) - tak jak poprzednio.

7. Przygotuj  sobie na kartce, albo lepiej w Notatniku PC zestaw komend na podstawie "przewodnika" - testów do wykonania - będzie łatwiej wklejać do terminala

 ( możesz nie próbować testu wysyłki SMS - bo nie z każdego terminala da się wykonać ctrl-Z; to sobie zostaw na później z Arduino ).

8 Do dzieła, jak nie zadziała, kup sobie nowy sim800L z PEWNEGO żródła i powtórz testy.

--

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Podlewanie działki przez SIM800L i Arduino (Ledy- odpowiedniki zaworów do podlewania)

wyciąg z artykułu, komentarze przetłumaczyłem:

Krawczenko Wiktor

SIM800L GSM Moduł: Część 2 - Programowanie, Dzwonienie, Odbieranie / Wysyłanie SMS-ów, Zarządzanie SMS-ami

1129554195_podlewanie_dziaki_sim800l.thumb.png.2cea4984c7d34d5d553f98e6cd3f158b.pngRezystory do podłączenia diod LED 100 omów, do podłączenia modułu  Arduino Uno— 10 KΩ

Aby zademonstrować możliwości sterowania sprzężeniem zwrotnym, zostanie użyty następujący obwód z 3 diodami LED (j/w)

 

Polecenia będą składać się z dwóch cyfr - pierwsza cyfra wskaże numer diody LED (1-3), druga - jej stan (1 - włączony, 0 - wyłączony). Okazuje się, że dopuszczalne polecenia (kombinacje liczb) to tylko 6: 11, 10, 21, 20, 31, 30. Inne polecenia będą ignorowane. Informacje o stanie wykonania lub niepoprawności polecenia zostaną wyświetlone w terminalu. Szkic:

 

#include <SoftwareSerial.h>                                   // Biblioteka do programowej implementacji wymiany za pomocą protokołu UART
SoftwareSerial SIM800(8, 9);                                  // RX, TX

int pins[3] = {5, 6, 7};                                            // Piny z podłączonymi LEDami
String _response    = "";                                       // Zmienna do przechowywania odpowiedzi modułu  
long lastUpdate = millis();                                     // Czas ostatniej aktualizacji
long updatePeriod   = 60000;                                  // Sprawdzaj co minutę

String phones = "+48111111111, +48222222222, +48333333333";   // Lista (tutaj trzech) dozwolonych smartfonów (wpisać..właściwe)

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode(pins, OUTPUT);                                 // ustawiamy piny na OUTPUT
  }
  Serial.begin(9600);                                              // Szybkość wymiany danych z komputerem
  SIM800.begin(9600);                                           // Prędkość komunikacji modemowej
  Serial.println("Start!");

  sendATCommand("AT", true);                                  // Wysłano AT, aby dostosować szybkość transmisji
  //sendATCommand("AT+CMGDA=\"DEL ALL\"", true);              // Usuń wszystkie SMS-y, aby nie przepełnić pamięci
  // Команды настройки модема при каждом запуске
  //_response = sendATCommand("AT+CLIP=1", true);             // Włączamy CLIP
  //_response = sendATCommand("AT+DDET=1", true);             // Włączamy DTMF
  sendATCommand("AT+CMGF=1;&W", true);                        // Włączamy tekstowy tryb SMS (Text mode) i zapisujemy (AT&W)!
  lastUpdate = millis();                                                       // Zerowanie timera
}

String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                                                 // Zmienna do przechowywania wyniku
  Serial.println(cmd);                                               // Zduplikuj polecenie w monitorze portu
  SIM800.println(cmd);                                            // Wysyłanie polecenia do modułu
  if (waiting) {                                                          // Jeśli musisz poczekać na odpowiedź...
    _resp = waitResponse();                                      // ... czekam na wysłanie odpowiedzi
    // Jeśli tryb Echo jest wyłączony (ATE0), te 3 linie można zakomentować
    if (_resp.startsWith(cmd)) {                                  // Usuwanie duplikatu polecenia z odpowiedzi
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                                        // Zduplikuj odpowiedź w monitorze portu
  }
  return _resp;                                                     // Zwracamy wynik. Puste, jeśli problem
}

String waitResponse() {                                         // Czekam na odpowiedź i zwracam wynik
  String _resp = "";                                              // Zmienna do przechowywania wyniku
  long _timeout = millis() + 10000;                               // Zmienna śledzenia limitu czasu (10 sekund)
  while (!SIM800.available() && millis() < _timeout)  {};   // Czekamy na odpowiedź przez 10 sekund, jeśli nadejdzie odpowiedź lub nastąpi przekroczenie limitu czasu, to ...
  if (SIM800.available()) {                                       // Jeśli jest coś do przeczytania...
    _resp = SIM800.readString();                                  //... Przeczytaj i zapamiętaj
  }
  else {                                                          // W przypadku przekroczenia limitu czasu...
    Serial.println("Timeout...");                                 // ... poinformuj nas o tym i...
  }
  return _resp;                                                   // ... zwróć wynik. Puste, jeśli problem
}

bool hasmsg = false;                                              // Oznacz do usunięcia wiadomości
void loop() {
  if (lastUpdate + updatePeriod < millis() ) {                    // Czas sprawdzić, czy są nowe wiadomości
    do {
      _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Wysyłanie prośby o przeczytanie nieprzeczytanych wiadomości
      if (_response.indexOf("+CMGL: ") > -1) {                    // Jeśli jest co najmniej jeden, otrzymujemy jego indeks
        int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
        char i = 0;                                               // Deklaracja licznika prób
        do {
          i++;                                                    // Zwiększanie licznika
          _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true);  // Próbuję odebrać SMS-a z indeksu
          _response.trim();                                       // Usuń spacje na początku/końcu
          if (_response.endsWith("OK")) {                         // Jeśli odpowiedź kończy się na „OK”
            if (!hasmsg) hasmsg = true;                           // Ustaw flagę dla wiadomości do usunięcia
            sendATCommand("AT+CMGR=" + (String)msgIndex, true);   // Odczytywanie wiadomości
            sendATCommand("\n", true);                            // Reasekuracja - produkcja nowej linii
            parseSMS(_response);                                  // Wysyłanie tekstu wiadomości do przetworzenia
            break;                                                // Wyjdź z zadania{}
          }
          else {                                                  // Jeśli wiadomość nie kończy się na OK
            Serial.println ("Error answer");                      // Jakiś błąd
            sendATCommand("\n", true);                            // Wyślij nową linię i spróbuj ponownie
          }
        } while (i < 10);
        break;
      }
      else {
        lastUpdate = millis();                                    // Resetowanie timera
        if (hasmsg) {
          sendATCommand("AT+CMGDA=\"DEL READ\"", true);           // Usuń wszystkie przeczytane wiadomości
          hasmsg = false;
        }
        break;
      }
    } while (1);
  }

  if (SIM800.available())   {                               // Jeśli modem coś wysłał...
    _response = waitResponse();                       // Otrzymujemy odpowiedź z modemu do analizy
    _response.trim();                                      // Usuń dodatkowe spacje na początku i na końcu
    Serial.println(_response);                           // Jeśli to konieczne, wyślij do monitora portu
    if (_response.indexOf("+CMTI:")>-1) {             // Otrzymałem wiadomość SMS
      lastUpdate = millis() - updatePeriod;         // Teraz nie ma potrzeby przetwarzania tutaj SMS-ów, wystarczy
   }                                                              // zresetuj licznik autocheck i w kolejnym cyklu wszystko zostanie przetworzone
  }
  if (Serial.available())  {                                 // Oczekiwanie na polecenia przez port szeregowy...
    SIM800.write(Serial.read());                      // ...i wyślij otrzymane polecenie do modemu
  };
}

void parseSMS(String msg) {                                   // Parsowanie SMS
  String msgheader  = "";
  String msgbody    = "";
  String msgphone   = "";

  msg = msg.substring(msg.indexOf("+CMGR: "));
  msgheader = msg.substring(0, msg.indexOf("\r"));            // Wyciągamy telefon

  msgbody = msg.substring(msgheader.length() + 2);
  msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));  // Wyciąganie tekstu SMS
  msgbody.trim();

  int firstIndex = msgheader.indexOf("\",\"") + 3;
  int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  msgphone = msgheader.substring(firstIndex, secondIndex);

  Serial.println("Phone: " + msgphone);                       // Wyświetlanie numeru telefonu
  Serial.println("Message: " + msgbody);                      // Wyprowadź tekst SMS

  if (msgphone.length() > 6 && phones.indexOf(msgphone) > -1) { // Jeśli telefon znajduje się na białej liście, to...
    setLedState(msgbody, msgphone);                           // ...wykonaj polecenie
  }
  else {
    Serial.println("Unknown phonenumber");
    }
}

void setLedState (String result, String phone) {
  bool correct = false;                                       // Do optymalizacji kodu, zmienna poprawności poleceń
  String msgToSend = "";
  if (result.length() == 2) {
    int ledIndex = ((String)result[0]).toInt();               // Otrzymujemy pierwszą cyfrę polecenia - adres urządzenia (1-3)
    int ledState = ((String)result[1]).toInt();               // Otrzymujemy drugą cyfrę komendy - stan (0 - wył, 1 - zał)
    if (ledIndex >= 1 && ledIndex <= 3 && (ledState == 0 or ledState == 1)) { // Jeśli wszystko jest w porządku, wykonaj polecenie
      msgToSend = "LED:" + (String)ledIndex + " set to " + (ledState == 0 ? "OFF" : "ON"); // Status realizacji
      digitalWrite(pins[ledIndex - 1], ledState);             // Wykonujemy polecenie
      correct = true;                                         // Flaga prawidłowości polecenia
    }
  }
  if (!correct) {
    msgToSend = "Incorrect command: " + result;               // Status realizacji
  }
  Serial.println(msgToSend);                                  // Wyprowadzanie wyniku do terminala
}


void sendSMS(String phone, String message)
{
  sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Przełączanie na tryb wiadomości tekstowych
  sendATCommand(message + "\r\n" + (String)((char)26), true);   // Po tekście wyślij podział linii i Ctrl + Z
}

 

 

 

 

 

 

 

Link do komentarza
Share on other sites

Dnia 28.09.2022 o 02:53, wr90 napisał:

Jeszcze tu jest czteroczęściowy artykuł (po "kacapsku", ale jest dobry i można sobie poradzić.

Na pewno warto zobaczyć.

http://codius.ru/articles/GSM_модуль_SIM800L_часть_1

Ok, na tą chwilę daję sobie spokój z modułami sim do arduino. Kupiłem z polecanego wcześniej sklepu ABC-RC, polutowałem przewody zgodnie z "kacapskim" przewodnikiem. I co? I cztery litery. Z pozostałymi modułami potrafię już jako tako gadać ale nie sim800l. Dzięki za wszelkie uwagi i dotychczasowe komentarze.

Zrzut ekranu 2022-10-04 155613.jpg

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.