Skocz do zawartości

Ardu i SIM800l, ogólna dyskusja...


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ść...?

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ę...

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.

 

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

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

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

@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
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
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?

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
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ć..😜

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...