Sim900 hvószám azonosítás

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Chipkonzol
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2016. február 13. szombat, 14:00

Sim900 hvószám azonosítás

HozzászólásSzerző: Chipkonzol » 2016. szeptember 4. vasárnap, 19:14

Sziasztok!

Van egy SIM900 modulom melyet arra szeretnék használni, hogy a nyaralóban egy relét működtessen, és visszaküldje a relé állapotát SMS-ben.
De csak az én telefonszámommal kell hogy működjön.

Kód: Egész kijelölése

#include <SoftwareSerial.h>
SoftwareSerial SIM800(7, 8);

void setup()
{
  pinMode(6,OUTPUT);
  digitalWrite(6,LOW);
  SIM800.begin(57600);
  Serial.begin(57600);
}

void getRes(){
  while (SIM800.available()>0)
      Serial.write(SIM800.read());
}

void loop ()
{
  SIM800.println("AT+CSQ");
  delay(1000);
  getRes();
  SIM800.println("AT+COPS?");
  delay(1000);
  getRes();
  SIM800.println("AT+CLIP=1\r\n"); //
  delay(6000);
  getRes();
 }


a soros porton visszakapom a hívó számát:

Kód: Egész kijelölése

RING

+CLIP: "+36******915",145,"",0,"",0
ATH


OK
˙
AT+CSQ

+CSQ: 18,0

OK
AT+COPS?

+COPS: 0,0,"T-Mobile H"



Hogyan tudom ezt kezelhetővé tenni hogy egy összehasonlítással meg tudjam állapítani hogy az a szám hívta e aki be van állítva?
Nyilván be kell olvasni egy változóba a kapott sorosporti adatok de hogyan?
Ebben kérnék segítséget.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9860
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Robert » 2016. szeptember 4. vasárnap, 20:36

A kapott karakterláncot beolvasod stringbe (a sorvégi ENTER-ig).
A karakterlánc tartalmazza e a telefonszámodat -> igen/nem ág
http://www.tavir.hu - a gazda :)

Chipkonzol
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2016. február 13. szombat, 14:00

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Chipkonzol » 2016. szeptember 5. hétfő, 8:22

Köszönöm a Válaszod Robi.

A lényeget értem csak a programkód megírásával van problémám.

Kód: Egész kijelölése

char inData;
char inChar[20];

void setup()
{
  pinMode(6,OUTPUT);
  digitalWrite(6,LOW);
  SIM800.begin(57600);
  Serial.begin(57600);
  delay(10000);
  SIM800.println("AT+CSQ");
  delay(1000);
  SIM800.println("AT+COPS?");
  delay(1000);
 
}

void loop ()
{
  while (SIM800.available()>0)
      Serial.write(SIM800.read());
    inData = SIM800.read();
      inChar[20] = inData;
      Serial.print("Kapott adat: ");
      Serial.println(inChar); 
  delay(1000);
}



Erre a kódra ezt kapom:

Kód: Egész kijelölése

AT+CSQ

+CSQ: 17,0

OK
AT+COPS?

+COPS: 0,0,"T-Mobile H"
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:

RING

+CLIP: "+36******607",145,"",0,"",0
Kapott adat:
Kapott adat:
Kapott adat:
Kapott adat:

Avatar
csegebiga
Chipgyilok
Hozzászólások: 270
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: csegebiga » 2016. szeptember 5. hétfő, 10:44

szerintem rosszul értelmezted a példaprogramodat
mert mit is csiálsz most?

Kód: Egész kijelölése

void loop ()
{
  while (SIM800.available()>0)     //while ciklus eleje, fut, amíg van adat a sim900 felől
      Serial.write(SIM800.read()); //beolvas 1 karaktert, kiírja a sorosportra,
                                   // és a while ciklusnak vége    
    
    inData = SIM800.read();        //mindettől függetlenül a loop 1000 ms-onként olvas(na)
      inChar[20] = inData;         // és berkná az inchar tömb [20]as helyére
      Serial.print("Kapott adat: ");
      Serial.println(inChar); 
  delay(1000);
}

ezzel szemben neked az alábbi kellene:

Kód: Egész kijelölése

Ha van adat a sim900 felől
  kiüríted a stringváltozót
  ciklikusan, amíg van mit,
     olvasson be egy karaktert
    és fűzze hozzá a stringhez
  ciklus vége
  kiíratod, feldolgozod a stringet, amit akarsz
Feltétel vége
várakozás 1000 ms   


figyelmedbe ajánlom a String osztályt, lényegesen okosabb a string tipusnál.

Chipkonzol
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2016. február 13. szombat, 14:00

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Chipkonzol » 2016. szeptember 5. hétfő, 17:47

Köszönöm, igyekszem értelmezni. :D

Avatar
JKotesz
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2018. március 27. kedd, 8:49

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: JKotesz » 2018. március 27. kedd, 9:14

Sziasztok,

A témához kapcsolódó probléma miatt írok ebbe a topicba.
Adott egy Mini pro 328p MCU-val és egy SIM800l modul.
Mindkét eszköz alvó állapotban van, energiatakarékosság miatt. Akkumulátorról működik.
Egy DHT22 senzort szeretnék lekérdezni, hívás-azonosítással.
A hívásazonosítás a "+CLIP" működik kiolvasva a telefonszámot működik egészen addig míg a gsm modul nincs sleep módban.
Amint a modul hívásra kicseng, soros porton van kommunikáció éled a Mini pro is. Első 2-3 hívásnál tökéletesen azonosítható a hívó, de ezt követő hívásoknál a soros porton értelmezhetetlen adatok érkeznek, és nem lehet kiolvasni a telefonszámot.

Van erre valami megoldás?

Délután küldöm a kódot, még dolgozok.

Hátha valaki járt már hasonló módon.
Köszönöm

Avatar
JKotesz
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2018. március 27. kedd, 8:49

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: JKotesz » 2018. március 28. szerda, 8:45

Kód: Egész kijelölése

String buffer1;
unsigned int current_millis = 0;
String phone;
 
void setup() {
     buffer1.reserve(200);
     phone.reserve(20);
 
     Serial.begin(19200); //
     SIM800.begin(9600);
     delay(1000);
     SIM800.write("AT\r");
     delay(1000);
     SIM800.write("AT+IPR=9600\r");
     
     delay(1000);
     SIM800.write("AT+CMGF=1\r");
     delay(1000);
     SIM800.write("AT+CNMI=2,2,0,0,0\r");
     delay(1000);
     Serial.print(SIM800.readString());
     SIM800.write("AT+CLIP=1\r\n");
     delay(1000);
     SIM800.write("AT+SGPIO=0,7,1,0\r");
     delay(1000);
     SIM800.write("AT+CSCLK=2\r");
     delay(1000);
     current_millis = millis();
}
 
void loop() {
   
   if (SIM800.available() > 0) {
      buffer1 = SIM800.readStringUntil('\n');
           caller number from it
      Serial.println(buffer1);
      parse();
      current_millis = millis();
      }
 
    if ((millis() - current_millis) > 10000) {
       sleepNow();
       delay(1000);// tried many delays
       current_millis = millis();
     }
 
 }
 
void parse() {
    if (buffer1.indexOf("CLIP:") > 0) {
        phone = buffer1.substring(buffer1.indexOf("+CLIP: ") + 8,
        buffer1.indexOf("+CLIP: ") + 21);
        Serial.println(phone);
        SIM800.write("ATH\r");
        delay(500);
        SIM800.write("ATH\r");
        delay(500);
  }
 
}
 
void sleepNow() {
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);   
    sleep_mode();             
    sleep_disable();         
    }


Ez a kód amivel próbálkozok

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9860
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Robert » 2018. március 28. szerda, 11:21

A szoftveres sorosport _alkalmatlan_ az elvárt feladatra.
Csak HW sorosporton működik a sleep+jelfeldolgozás...
http://www.tavir.hu - a gazda :)

Avatar
JKotesz
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2018. március 27. kedd, 8:49

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: JKotesz » 2018. március 28. szerda, 13:44

Köszönöm Robi.

berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: berkesandor » 2018. április 2. hétfő, 19:50

Robert írta:A szoftveres sorosport _alkalmatlan_ az elvárt feladatra.
Csak HW sorosporton működik a sleep+jelfeldolgozás...


Ha átállítom a SIM kommunikációt a 0/1 portra, akkor már HW alapon megy a soros kommunikáció, vagy azt a használt könyvtár befolyásolja?
https://github.com/VittorioEsposito/Sim800L-Arduino-Library-revised Ezt használom.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9860
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Robert » 2018. április 3. kedd, 3:53

Ha átállítod, akkor a D0/D1 lábon ugyanúgy soros kommunikáció marad - szoftver alapon (a linkelt libraryban csak ez támogatott).
UNO esetén a D0/D1 a feltöltésre amúgy is foglalt.

Marad:
- Leonardo (USB és a D0/D1 UART külön van)
- Mega (Serial portból 4 van, abból az egyik foglalt USB feltöltésre)
- ProMini (A feltöltés után a soros-USB illesztő leköt, és vissza a helyére a SIM modul)
http://www.tavir.hu - a gazda :)

berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: berkesandor » 2018. április 3. kedd, 4:45

ProMini-t használok.
Magyarul, enélkül a könyvtár nélkül kellene használni a SIM modult, hogy HW alapon menjen a kommunikáció.
Elfelejteni a könyvtárat, és saját kútfőből megoldani?

Chipkonzol
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2016. február 13. szombat, 14:00

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Chipkonzol » 2018. április 3. kedd, 8:25

Nem kell hozzá library csak az AT parancsok.

berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: berkesandor » 2018. április 3. kedd, 8:38

Az AT parancsok azok rendben vannak hogy kellenek.
Akkor egyszerűen küldjek AT parancsokat, és olvassam a 0/1 lábat, és HW alapon fog működni?

Chipkonzol
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2016. február 13. szombat, 14:00

Re: Sim900 hvószám azonosítás

HozzászólásSzerző: Chipkonzol » 2018. április 3. kedd, 9:33

Ha az At parancsok rendben vannak akkor csak kiküldöd és működnie kell.


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: Bing [Bot] valamint 1 vendég