Skocz do zawartości

Ardu i SIM800l, ogólna dyskusja...


farmaceuta

Pomocna odpowiedź

17 minut temu, ethanak napisał:

To popatrz na kod, bo Twoje pobożne życzenia niewiele mają wspólnego z rzeczywistościa.

Patrzyłem już wiele razy i nie widzę jakiegoś wielkiego błędu...możesz trochę rozjaśnić temat? Bo ja naprawdę nic tu nie widzę...przecież kiedy coś tam wykonuje, i przyjdą nowe dane to one siedział w buforze uarta i czekają aż je pobiore...no chyba że chodzi Ci o to że jeśli już mam coś w buforze i nie zdążę tego pobrać to kolejne dane usunął to co było w tym buforze i stracę jedna wiadomość...?

Link do komentarza
Share on other sites

6 godzin temu, SOYER napisał:

@farmaceuta fajnie, że czyścisz bufor, ale pokaż mi jakie to ma znaczenie w funkcji wjazdSIM(). Ty sprawdzasz co siedzi w zmiennej dane1. Jeśli raz tam coś wsadzisz to z każdym uruchomieniem wjazdSIM któryś if sie wykona. Nie uzależniasz if-a od tego czy przyszło coś nowego...

 

Wkleiłem jeszcze raz mojego posta...

Teraz Ty wklej CAŁY swój szkic proszę...

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

Być może zmienna dane1 wcale nie jest globalna, być może funkcja wjazdSIM jest w innej funkcji którą też sprawdzasz bufor i tam zadeklarowałeś dane1. Raczej  nie, bo ten kod byłby jeszcze bardziej bez sensu, ale nie udowodnisz, że sie mylimy, jak nie wkleisz kompletnego szkicu.

 

Link do komentarza
Share on other sites

15 minut temu, SOYER napisał:

Wkleiłem jeszcze raz mojego posta...

Teraz Ty wklej CAŁY swój szkic proszę...

#include <string.h>
#include <SoftwareSerial1.h>



//SoftwareSerial1 Serial2(A0, A1);
//SoftwareSerial1 Serial1(RX1, TX1);

#define ILOSC_NR 30
#define pin_brama 15

uint32_t baza_nr[ILOSC_NR];
uint32_t EEMEM epr_nr[ILOSC_NR];

int indeks = 0;
String numerS = "";
String dane1 = "";
uint32_t czas_sygnal1 = 0;

uint32_t czas_sygnal2 = 0;

String dane2 = "";

String haslo = "1bd5a7"; //tutaj haslo dla administratora

#define SW_DOWN 2       // pin krancowki dolnej
#define SW_UP  3        // pin krancowki gornej

#define RELAY_G_OUT 4   // przekaznik zielone zewnatrz
#define RELAY_G_IN 5    // przekaznik zielone wewnatrz
#define RELAY_R_OUT 6   // przekaznik czerwone zewnatrz
#define RELAY_R_IN 7    // przekaznik czerwone wewnatrz

#define WJAZD 10        // pin sygnalu wjazdu do garazu  10
#define WYJAZD 11       // pin sygnalu wyjazdu z garazu  11

#define ON 0
#define OFF 1

bool stan = 0;
bool stan2 = 1;

bool wjazd_flaga = 0;
bool wyjazd_flaga = 0;
bool mig = 0;
bool tim = 1;
bool tim2 = 1;

byte stan_wjazd = 0;
byte stan_wyjazd = 0;


uint32_t czas = 0;
uint32_t czas_migaj = 0;

uint32_t last = 0;
bool sta = 0;

void setup()
{
  delay(30000);

  pinMode(RELAY_G_OUT, OUTPUT);
  pinMode(RELAY_G_IN, OUTPUT);
  pinMode(RELAY_R_OUT, OUTPUT);
  pinMode(RELAY_R_IN, OUTPUT);

  pinMode(SW_DOWN, INPUT_PULLUP);
  pinMode(SW_UP, INPUT_PULLUP);

  pinMode(WJAZD, INPUT_PULLUP);
  pinMode(WYJAZD, INPUT_PULLUP);

  digitalWrite(RELAY_G_OUT, HIGH);
  digitalWrite(RELAY_G_IN, HIGH);
  digitalWrite(RELAY_R_OUT, HIGH);
  digitalWrite(RELAY_R_IN, HIGH);


  pinMode(pin_brama, OUTPUT);
  digitalWrite(pin_brama, HIGH);

  //Serial1.begin(9600);


  Serial2.begin(9600);
  delay(500);
  Serial2.println("AT+CLIP=1");


  Serial1.begin(9600);
  delay(500);
  Serial1.println("AT+CLIP=1");
  delay(50);
  Serial1.println("AT+CMGF=1");
  delay(50);
  Serial1.println("AT+CNMI=1,2,0,0,0");


  eeprom_write_dword(&epr_nr[20], 0);   // tu mozesz wpisac nr z kompa
  eeprom_write_dword(&epr_nr[21], 0);
  eeprom_write_dword(&epr_nr[22], 0);
  eeprom_write_dword(&epr_nr[23], 0);
  eeprom_write_dword(&epr_nr[24], 0);
  eeprom_write_dword(&epr_nr[25], 0);
  eeprom_write_dword(&epr_nr[26], 0);
  eeprom_write_dword(&epr_nr[27], 0);
  eeprom_write_dword(&epr_nr[28], 0);
  eeprom_write_dword(&epr_nr[29], 123456789);

  eeprom_read_block(&baza_nr, &epr_nr, sizeof(baza_nr));
  for (int x = 0; x < ILOSC_NR; x++) {
   // Serial1.println(baza_nr[x]);
  }
}

void loop() {

  wjazdSIM();
  dane1 = "";
  wyjazdSIM();
  dane2 = "";
  semaf();


}



void wjazdSIM() {

  uint32_t numer_adm = 0;
  uint32_t numer = 0;
  uint32_t admin = 0;
  String nr_adminS = "";
  bool flaga = 0;


  while (Serial1.available()) {
    delay(10);
    dane1 = Serial1.readString();
    //Serial1.println(dane1);
  }

  if (dane1.indexOf("+CMT:") != -1) {         //czy odebrano sms
    nr_adminS = dane1.substring(12, 21);
    numer_adm = atol(nr_adminS.c_str());
    if (numer_adm == baza_nr[0]) {
      flaga = 1;
    } else {
      flaga = 0;
    }
  }

  if (dane1.indexOf(haslo) != -1) {           //zapisanie nr administratora
    numer = nr(haslo, 10, 1);
    eeprom_write_dword(&epr_nr[0], numer);
    baza_nr[0] = numer;
    wyslij_sms("ZAPISANO NR ADMINISTRATORA");
  }

  if (dane1.indexOf("ZAPISZ") != -1 && flaga == 1) {   //zapisanie nr do bazy
    numer = nr("ZAPISZ", 10, 1);
    for (int x = 1; x < ILOSC_NR; x++) {
      if (baza_nr[x] == numer) {
        return;
      }
    }
    for (int x = 1; x < ILOSC_NR; x++) {
      if (baza_nr[x] == 0) {
        eeprom_write_dword(&epr_nr[x], numer );
        baza_nr[x] = numer;
        wyslij_sms("ZAPISANO NUMER");
        break;
      }
    }
  }

  if (dane1.indexOf("USUN") != -1 && flaga == 1) {   //usuniecie nr z bazy
    numer = nr("USUN", 10, 1);
    for (int x = 1; x < ILOSC_NR; x++) {
      if (baza_nr[x] == numer) {
        eeprom_write_dword(&epr_nr[x], 0);
        baza_nr[x] = 0;
        wyslij_sms("USUNIETO NUMER");
        break;
      }
    }
  }

  if (dane1.indexOf("+CLIP:") != -1) {            //sprawdzenie czy dzwoni
    numerS = dane1.substring( 21, 30);
    numer = atol(numerS.c_str());
    // Serial1.println(numer);

    for (int x = 0; x < ILOSC_NR; x++) {
      if (baza_nr[x] == numer) {
        if (wyjazd_flaga == 0) {
          wjazd_flaga = 1;
          digitalWrite(pin_brama, LOW);
          delay(1000);
          digitalWrite(pin_brama, HIGH);
        }
        Serial1.println("ATH");
        delay(100);
        return;
      }
    }
  }
  if (dane1.indexOf("+CREG") != -1) {                            //sprawdzenie czy jest polaczenie z siecia
    if (dane1.indexOf("1") == -1 && dane1.indexOf("5") == -1) {
      Serial1.println("AT+CFUN=0");
      delay(2000);
      Serial1.println("AT+CFUN=1");
    }
  }
  if (millis() - czas_sygnal1 > 60000UL) {          //sprawdzanie polaczenia co 60s
    czas_sygnal1 = millis();
    Serial1.println("AT+CREG?");
    delay(10);
  }

}
uint32_t nr(String str, int a, int b) {                //funkcja zwracajaca liczbe/nr
  indeks = dane1.indexOf(str);
  numerS = dane1.substring(indeks - a, indeks - b);
  return atol(numerS.c_str());
}

void wyslij_sms(String str) {                       //wysylanie sms
  String nr = (String)baza_nr[0];
  Serial1.println("AT+CMGS=\"+48" + nr + "\"");
  Serial1.println(str);
  delay(2000);
  Serial1.write(26);



}


void wyjazdSIM() {


  String numerSS = "";
  uint32_t numerr = 0;

  while (Serial2.available()) {
    delay(10);
    dane2 = Serial2.readString();
    // Serial1.println(dane2);
  }

  if (dane2.indexOf("+CLIP:") != -1) {
    numerSS = dane2.substring(21, 30);
    numerr = atol(numerSS.c_str());
    for (int x = 0; x < ILOSC_NR; x++) {
      if (baza_nr[x] == numerr) {
        if (wjazd_flaga == 0) {
          wyjazd_flaga = 1;
          digitalWrite(pin_brama, LOW);
          delay(1000);
          digitalWrite(pin_brama, HIGH);
        }
        Serial2.println("ATH");
        delay(100);
        return;

      }
    }
  }

  if (dane2.indexOf("+CREG") != -1) {
    if (dane2.indexOf("1") == -1 && dane2.indexOf("5") == -1) {
      Serial2.println("AT+CFUN=0");
      delay(2000);
      Serial2.println("AT+CFUN=1");
    }
  }
  if (millis() - czas_sygnal2 > 60000UL) {
    czas_sygnal2 = millis();
    Serial2.println("AT+CREG?");
    delay(10);
  }
}

void semaf() { 
if (digitalRead(WJAZD) == LOW && wyjazd_flaga == 0) {
    wjazd_flaga = 1;
    czas = millis();
  }
  if (digitalRead(WYJAZD) == LOW && wjazd_flaga == 0) {
    wyjazd_flaga = 1;
    czas = millis();
  }


  if (wjazd_flaga == 1) {
    if (digitalRead(SW_DOWN) == LOW && digitalRead(SW_UP) == HIGH) {
      stan = 1;
    }
    if (digitalRead(SW_DOWN) == HIGH && digitalRead(SW_UP) == HIGH) {
      migaj_swiatla();                       //semafor(OFF, OFF, ON, ON);
      stan = 0;
      czas = millis();
    } else if (digitalRead(SW_DOWN) == HIGH && digitalRead(SW_UP) == LOW) {
      semafor(ON, OFF, OFF, ON);
    }
  }


  if (wyjazd_flaga == 1) {
    if (digitalRead(SW_DOWN) == LOW && digitalRead(SW_UP) == HIGH) {
      stan = 1;
    }
    if (digitalRead(SW_DOWN) == HIGH && digitalRead(SW_UP) == HIGH) {
      migaj_swiatla();                                                    // semafor(OFF, OFF, ON, ON);
      stan = 0;
      czas = millis();
    } else if (digitalRead(SW_DOWN) == HIGH && digitalRead(SW_UP) == LOW) {
      semafor(OFF, ON, ON, OFF);

    }
  }

  if (millis() - czas > 5000UL && stan == 1) {  //gdy brama sie zamknie to swiatla swieca jeszcze przez 3s...(3000UL = 3s (czas w ms))
    stan = 0;
    stan2 = 1;
    semafor(OFF, OFF, OFF, OFF);
    wyjazd_flaga = 0;
    wjazd_flaga = 0;

  }

}

void semafor(byte green_out, byte green_in, byte red_out, byte red_in) {

  digitalWrite(RELAY_G_OUT, green_out);
  digitalWrite(RELAY_G_IN, green_in);
  digitalWrite(RELAY_R_OUT, red_out);
  digitalWrite(RELAY_R_IN, red_in);

}

void migaj_swiatla() {
  if (millis() - czas_migaj > 500UL) {
    mig = !mig;
    if (mig) {
      semafor(OFF, OFF, ON, ON);
    } else {
      semafor(OFF, OFF, OFF, OFF);
    }
    czas_migaj = millis();
  }


}



  

dane1 jest globalna i po kazdym wyjsciu z funkcji jest czyszczona wiec zaden if nie moze sie wykonac dwa razy na tej sames wiadomosci z sim...

Link do komentarza
Share on other sites

1 godzinę temu, farmaceuta napisał:
 while (Serial1.available()) {
    delay(10);
    dane1 = Serial1.readString();
    //Serial1.println(dane1);
  }

W przełożeniu na język zrozumiały dla pospólstwa:

Sprawdzam czy coś przyszło. Jeśli nic nie przyszło, to sprawdzam co jest w tym co nie przyszło. Jeśli natomiast przyszło, to chwilkę muszę odpocząć, a potem sprawdzam czy coś przyszło; jeśli przyszło, to zapominam o tym co przyszło i znów muszę chwilkę odpocząć...

 

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

8 minut temu, ethanak napisał:

W przełożeniu na język zrozumiały dla pospólstwa:

Ja chyba stoję jeszcze niżej w tej hierarchii bo dalej nie rozumiem...😅 Ten opis był do tego jak jest u mnie? Czy jak powinno być? ...no u mnie sprawdzam czy coś przyszło..jeśli nie to gonię dalej z kodem, jeśli przyszło to czekam 10ms i do bufora ładuje Stringa...

Link do komentarza
Share on other sites

No dobrze...a taka wersja jest lepsza? 


    String str;

    while(this->SoftwareSerial::available())
    {
        if (this->SoftwareSerial::available()>0)
        {
            str += (char) this->SoftwareSerial::read();
        }
    }

    return str;

Wyciągnięte z biblioteki do SIM'a jako funkcja czytająca to co na serial przyszło...

Ja się nie drażnie z Tobą @ethanak 😉 poważnie nie dostrzegam tego co chcesz mi tu pokazać...🤔 być może czegoś do końca nie zrozumiałem w przeszłości, i stąd moje zle rozumowanie...

Link do komentarza
Share on other sites

@farmaceuta

35 minut temu, ethanak napisał:

W przełożeniu na język zrozumiały dla pospólstwa:

Sprawdzam czy coś przyszło. Jeśli nic nie przyszło, to sprawdzam co jest w tym co nie przyszło. Jeśli natomiast przyszło, to chwilkę muszę odpocząć, a potem sprawdzam czy coś przyszło; jeśli przyszło, to zapominam o tym co przyszło i znów muszę chwilkę odpocząć...

 

Tutaj kolega napisał co robi twój szkic.

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

7 minut temu, farmaceuta napisał:

Wyciągnięte z biblioteki do SIM'a jako funkcja czytająca to co na serial przyszło...

A widzisz różnicę między read i readString?

A widzisz różnicę między operatorami = i += na ten przykład?

22 minuty temu, farmaceuta napisał:

Ten opis był do tego jak jest u mnie?

Tak, do tego jak jest u Ciebie.

24 minuty temu, farmaceuta napisał:

jeśli nie to gonię dalej z kodem

Po chu... znaczy się cholerę? 

24 minuty temu, farmaceuta napisał:

jeśli przyszło to czekam 10ms i do bufora ładuje Stringa...

A potem znowu od razu sprawdzasz co przyszło i jak przyszło to zapominasz o tym co przyszło wcześniej.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

2 minuty temu, ethanak napisał:

A widzisz różnicę między read i readString?

No tak..read czyta pojedynczy bajt...readString czyta Stringa aż napotka znak zakończenia linii

4 minuty temu, ethanak napisał:

A widzisz różnicę między read i readString?

A widzisz różnicę między operatorami = i += na ten przykład?

No jasne...w przypadku z plusem dodaje nowy bajt do tego co już wcześniej odczytałem 

5 minut temu, ethanak napisał:

Po chu... znaczy się cholerę? 

To też racja,,, zupełnie nie potrzebnie..(doda się jakiegoś returna😜

 

7 minut temu, ethanak napisał:

A potem znowu od razu sprawdzasz co przyszło i jak przyszło to zapominasz o tym co przyszło wcześniej.

No chyba że ja źle rozumiem działanie readStringa...no ja uważałem że gdy pojawią się jakieś dane (choćby jeden bajt) to po wywołaniu readString siedzę w nim do czasu aż pojawi się znak zakończenia linii, czyli mam cały komunikat...źle myślę pewnie tak?

Link do komentarza
Share on other sites

Przed chwilą, farmaceuta napisał:

chyba że ja źle rozumiem działanie readStringa...

Na to wygląda...

1 minutę temu, farmaceuta napisał:

po wywołaniu readString siedzę w nim do czasu aż pojawi się znak zakończenia linii

Nie. Do tego służy readStringUntil a nie readString

Pytanie: do czego jest ten delay?

Poza tym wyjaśnij dlaczego tam jest while i dlaczego w związku z tym jeśli przyjdzie więcej niż jeden komunikat to będziesz analizować tylko ostatni. W ogóle rozumiesz co robi while i czym się różni od if czy trzeba wytłumaczyć?

Wyjaśnij jeszcze, dlaczego dane1 to zmienna globalna.

 

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

7 minut temu, ethanak napisał:

Nie. Do tego służy readStringUntil a nie readString

I chciałem nawet użyć odrazu tego Until ale SoftwareSerial nie posiada go "na stanie" a od tego zaczynałem testy.. 

9 minut temu, ethanak napisał:

Pytanie: do czego jest ten delay?

Dałem go po to żeby gdy pojawi się jakieś dane to chwilka odczekania żeby cały String dotarł...(pewnie dzięki temu delayowi w większości komunikaty docierały całe) 

11 minut temu, ethanak napisał:

Wgóle rozumiesz co robi while i czym się różni od if czy trzeba wytłumaczyć?

Nie trzeba tłumaczyć wiem jak działają😜 dałem while żeby odczytać dane za jednym razem, a nie latać po całym kodzie co chwilę gdyby był if' (co trochę zaprzecza temu jak postrzegałem readString😉 bo jak by działał tak jak zakładałem to mógłby być if) 

15 minut temu, ethanak napisał:

Wyjaśnij jeszcze, dlaczego dane1 to zmienna globalna.

Była lokalna, ale postanowiłem zrobić osobna funkcję wysyłania sms która również z dane1 korzysta, a nie chciało mi się dodatkowego argumentu tworzyć..😜

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.