Gsm modul

Nezařaditelné
Karya
Příspěvky: 30
Registrován: pát srp 19, 2011 10:12 am

Gsm modul

Příspěvek od Karya »

Nevedel by mi niekdo poradit ako ovladat cez smsky arduino? Dakujem
8milan8
Příspěvky: 128
Registrován: čtv led 01, 2015 6:30 pm

Re: Gsm modul

Příspěvek od 8milan8 »

Něco jako http://tronixstuff.com/2014/01/08/tutor ... m-modules/ ? :)

Modulů je na internetu hodně. Takže stačí vybrat, naprogramovat a jede se. Levné moduly jsou třeba SIM800L - http://www.ebay.com/itm/1PCS-Smallest-S ... 2118758210
Karya
Příspěvky: 30
Registrován: pát srp 19, 2011 10:12 am

Re: Gsm modul

Příspěvek od Karya »

Dakujem ja som kupil . http://www.ebay.com/itm/252276576232?_t ... EBIDX%3AIT Mam aj k tomu program ale vykona mi 1 sms a druhu uz nespracuje. Nevedel by niekdo kde je chyba? Dik

Kód: Vybrat vše

//SMS procesor pro Arduino UNO - upraveno Roman Simku

#include <SoftwareSerial.h> //pridano Roman Simku
#define GSMReset 5
#define LED1 13
#define LED2 12
SoftwareSerial SIM800(2, 3); // RX, TX //pridano Roman Simku

String GSMsignal;

void setup()
{

  Serial.begin(19200);
  SIM800.begin(9600);
  delay(1000);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  digitalWrite(LED1,LOW);
  digitalWrite(LED2,LOW);
  restartSIMHW();
  SIM800Init();
  

}

void loop()
{

  //WDT_Restart(WDT);
  delay(1000);
  checkSMS();

}
void SIM800Init()
{

	while (Serial.available() > 0) Serial.read();
	Serial.println F("****************************************");
 Serial.println F("****cekam na odezvu GSM Modulu *********"); //pridano Roman Simku
	while (sendATcommand("AT","OK",2000) == 0);
	Serial.println F("SIM800 modul dostupny, cekam na registraci do site!"); //upraven text Roman Simku
	//otestuj registraci do site
	while ( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) ||
	sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );
	while (Serial.available() > 0) Serial.read();
	Serial.println F("SIM800 registrovan do site!");
	//nastaveni parametru pro obdrzen? casu ze site
	while( sendATcommand("AT+CLTS=1", "OK", 500) == 0 );
	while( sendATcommand("AT+CENG=3", "OK", 500) == 0 );
	while (Serial.available() > 0) Serial.read();
	Serial.print("Casova znacka:");
	Serial.println(timeStamp());
	//CSQ, pozice 4
	GSMsignal = sendATcommandResponse("AT+CSQ", "+CSQ:", 1000, 3);
	
	Serial.println("GSM kvalita signalu:"+GSMsignal);
	if (GSMsignal.length()==3) GSMsignal = GSMsignal.substring(1);
	String providerName = sendATcommandResponse("AT+COPS?","+COPS:",1000,20);
	uint8_t tempIndex = providerName.indexOf('"');
	providerName = providerName.substring(tempIndex+1);
	tempIndex = providerName.indexOf('"');
	providerName = providerName.substring(0,tempIndex);
	Serial.println("GSM operator:"+providerName);
	sendATcommand("AT+CMGF=1", "OK", 500);
  sendATcommand("AT+CMGF=1", "OK", 500);
	//zakaz indikace SMS
	sendATcommand("AT+CNMI=0,0", "OK",500);
	sendATcommand("AT+CLIP=1", "OK", 500);
	//smaz vsechny SMSky
	sendATcommand("AT+CMGD=1,4", "OK", 2000);
	sendATcommand("AT+CMGD=1", "OK", 2000);
	Serial.println F("Zakladni parametry nastaveny!");
  Serial.println F("Cekam na prikaz pres SMS, napr. prichozi sms ve tvaru LED1ON, LED1OFF , LED2ON , LED2OFF rozsviti LEDku!"); //pridano Roman Simku
 Serial.println F("****************************************"); //pridano Roman Simku
}

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
{

	//WDT_Restart(WDT);
	uint8_t x = 0,  answer = 0;
	char response[100];
	unsigned long previous;

	memset(response, '\0', 100);    // Initialize the string

	delay(100);

	//clrSIMbuffer();
	SIM800.println(ATcommand);    // Send the AT command
	//WDT_Restart(WDT);

	x = 0;
	previous = millis();

	// this loop waits for the answer
	do
	{
	//	WDT_Restart(WDT);
		if (SIM800.available() != 0) {
			// if there are data in the UART input buffer, reads it and checks for the asnwer
			response[x] = SIM800.read();
			x++;
			// check if the desired answer  is in the response of the module
			if (strstr(response, expected_answer) != NULL)
			{
				answer = 1;
			}
		}
		// Waits for the asnwer with time out
	}
	while ((answer == 0) && ((millis() - previous) < timeout));

	//clrSIMbuffer();
	return answer;
}

//AT prikaz s ocekavanou odpovedi a zbytkem
String sendATcommandResponse(char* ATcommand, char* expected_answer, unsigned int timeout, unsigned int buf)
{
	//WDT_Restart(WDT);
	uint8_t x = 0,  answer = 0;
	char response[150];
	unsigned long previous;
	String rest;

	memset(response, '\0', 100);    // Initialize the string

	delay(100);

	//clrSIMbuffer();
	SIM800.println(ATcommand);    // Send the AT command


	x = 0;
	previous = millis();
	//WDT_Restart(WDT);
	// this loop waits for the answer
	do
	{
		//WDT_Restart(WDT);
		if (SIM800.available() != 0) {
			// if there are data in the UART input buffer, reads it and checks for the asnwer
			response[x] = SIM800.read();
			x++;
			// check if the desired answer  is in the response of the module
			if (strstr(response, expected_answer) != NULL)
			{
				answer = 1;
			}
		}
		// Waits for the asnwer with time out
	}
	while ((answer == 0) && ((millis() - previous) < timeout));

	//p?e?ti zbytek - max 20 byte
	memset(response, '\0', buf);    // Initialize the string
	delay(100);
	for (x = 0; x < buf; x++) response[x] = SIM800.read();
	//clrSIMbuffer();
	for (x = 0; x < buf; x++) rest += char(response[x]);
	delay(100);
	return rest;

}

//Prijem SMS
void checkSMS()
{
	
	char g;
	String gcmd;
	String number;
	uint8_t gindex;
	clrSIMbuffer();
	SIM800.println("AT+CMGR=1");
	delay(100);
	//potla?en? echa
	while(SIM800.available()>0)
	{
		g=SIM800.read();
		gcmd += g;
		if (g=='\n')
		{
			gcmd = "";
			break;
		}
	}

	//na?ti prvn? ??dek odpov?di
	while(SIM800.available()>0)
	{
		g=SIM800.read();
		gcmd += g;
		if (g=='\n')
		{
			
			if (gcmd.substring(0,2)=="OK") return;
			if(gcmd.substring(0,5)=="+CMGR")
			{
				//Serial.println(gcmd);
				Serial.println("Nova SMSka!!!!");
				//prvni + "+CMGR"
				gindex = gcmd.indexOf('+');
				if(gindex < 0) return;
				//odsekni prvn? 
				gcmd = gcmd.substring(gindex+1);
				Serial.println(gcmd);
				//dal?? + - obsahuje ??slo odes?latele
				gindex = gcmd.indexOf('+');
				number = gcmd.substring(gindex+4,gindex+13);
				Serial.println("Od:" + number);
				//precti obsah SMS
				gcmd = "";
				delay(50);
				while (SIM800.available()>0)
				{
					g=SIM800.read();
					gcmd += g;
					if (g=='\n')
					{
						gcmd = gcmd.substring(0,gcmd.length()-2);
						Serial.println("Obsah SMS:" + gcmd);
						SMSparser(gcmd);
						sendSMS(number,"Vykonano!");
						gcmd = "";
						sendATcommand("AT+CMGD=1", "OK", 1000);
						sendATcommand("AT+CMGD=1,4", "OK", 1000);
						Serial.println("SMS smazana z pameti.");
            Serial.println("---------------------");
						return;
					}
				}
				gcmd="";
				sendATcommand("AT+CMGD=1", "OK", 1000);
				sendATcommand("AT+CMGD=1,4", "OK", 1000);
       sendATcommand("AT+CMGD=1,4", "OK", 1000);
				return;
			}
			
			
		}
	}
}

//Poslani SMS
void sendSMS(String number, String sms)
{
	Serial.println("SMS pro:"+number);
	Serial.println("Obsah:"+sms);
	delay(500);
	clrSIMbuffer();
	//number = "+420"+number;
	SIM800.println ("AT+CMGS=\""+number+"\"");
	delay(200);
	//toSerial();
	SIM800.println (sms);        // message to send
	delay(100);
	SIM800.write ((char) 26);	//CTRL+Z
	delay(100);
	SIM800.println();
	delay(100);
	sendATcommand("AT+CMGD=1", "OK", 2000);
	sendATcommand("AT+CMGD=1,4", "OK", 2000);
	delay(500);
	clrSIMbuffer();
	Serial.println("SMS odeslana!");
}

//Zpracovani SMS
void SMSparser(String command)
{
	if (command == "LED1ON")
	{
		digitalWrite(LED1,HIGH);
		return;
	}
	if (command == "LED1OFF")
	{
		digitalWrite(LED1,LOW);
		return;
	}

 if (command == "LED2ON")
 {
    digitalWrite(LED2,HIGH);
    return;
  }
  if (command == "LED2OFF")
  {
    digitalWrite(LED2,LOW);
    return;
  }
	Serial.println("Neznamy prikaz!");

}

String timeStamp()
{
	String ts="";
	ts = sendATcommandResponse("AT+CCLK?", "+CCLK: \"", 1000, 20);
	//13/11/04,15:23:19+04
	//return ("20"+ts.substring(0,2)+ts.substring(3,5)+ts.substring(6,8)+ts.substring(9,11)+ts.substring(12,14)+ts.substring(15,17));
	return ts;
}

void restartSIMHW()
{
	//HW restart
	digitalWrite(GSMReset,LOW);
	delay(400);
	digitalWrite(GSMReset,HIGH);
	delay(400);
}

void clrSIMbuffer()
{
	while(SIM800.available()>0)
	{
		delay(1);
		SIM800.read();
	}
}
8milan8
Příspěvky: 128
Registrován: čtv led 01, 2015 6:30 pm

Re: Gsm modul

Příspěvek od 8milan8 »

Takhle těžko říci. :/ Musel bych si to zkusit s tím modulem a ten znám zatím jen teoreticky. Co jsem to prolítl, tak v tom chybu nevidím. Jediný problém, který by tam mohl vznikat je to, že se používá software serial a tomu já nikdy moc nevěřím. Za mě tam může být problém v tom, že se tam někam zapadnou data... :) Kdybych to zkoušel, tak bych ten modem dal na HW serial a SW serial použil na debug přes nějaký další USB-RS232 převodník. Minimálně aspoň pro ověření, že SW serial dělá to samé co HW serial.

Když tak pošli výstup z terminálu, co ti to jak za sebou vypisuje. Aby člověk tušil jakými stavy to prochází.
Karya
Příspěvky: 30
Registrován: pát srp 19, 2011 10:12 am

Re: Gsm modul

Příspěvek od Karya »

Toto je uvodny vystup.

Obrázek

Od cervenej ciary sa to neustale opakuje

Obrázek

Obrázek

//WDT_Restart(WDT);
delay(1000);
checkSMS();

Toto mam v uvodzovkach ked to tam dam tak mi vypise chybu.

EasySMS_UNO:30: error: 'WDT' was not declared in this scope

WDT_Restart(WDT);

^

EasySMS_UNO:30: error: 'WDT_Restart' was not declared in this scope

WDT_Restart(WDT);
8milan8
Příspěvky: 128
Registrován: čtv led 01, 2015 6:30 pm

Re: Gsm modul

Příspěvek od 8milan8 »

Tak co tam tak vidím. Pokud nechceš echo příkazu z modemu, což většinou člověk nechce, tak stačí zavolat "ATE0", vypne to to echo a ATE1 zase zapne. Když si s tím hraješ na Arduinu, tak bych to hned v inicializaci vypnul. ATE1 je dobré když člověk zadává příkazy ručně.

Pak bych asi použil nějakou knihovnu, než si to psát ručně. Co jsem chvilku googlil, tak třeba https://github.com/vesteraas/Sim900 umí pěkně sms s callbackama, na tohle ideální. Ale je jich hromada dalších knihoven. Rozdíl mezi SIM900 a SIM800L není skoro žádný a v SMS snad naprosto žádný, takže se dají použít stejné knihovny. Pokud si s tím nechceš hrát a neřešíš každý bajt paměti, tak není co řešit.

Chybu vidím v tom, že ten SW serial má 64 byte buffer, takže je krásně vidět, jak ti to tu odpověď CMGR ořízne a tam je asi někde začátek konce (za těch 100ms, co tam čekáš ti to pošle 120 znaků při téhle rychlosti, takže se ten buffer prostě přeplní. A u toho mazání SMS si nejsem jist, jestli nejdříve není třeba vybrat nějakou paměť. Protože ono to interně může mít rozděleno do více pamětí a pak třeba neví kde má mazat. A podle manuálu by to tak asi mělo být (https://www.adafruit.com/datasheets/sim ... _v1.01.pdf), pokud chceš smazat jednu sms, tak "AT+CMGD=1,0" a pro všechny "AT+CMGD=1,4" A nastavil bych si "AT+CPMS=SM,SM,SM" někde v začátku. U těch AT+CMGD comandů píšou celkem dlouhé časy na smazání, otázka jaká je skutečnost.

Kdybych si to chtěl obsloužit sám, tak bych nejdříve celou odpověď na to CMGR (a jakýkoliv AT příkaz) načetl až do OK (popřípadě ERROR) někam do bufferu (dalo by se něco paměti ušetřit tím, že by jsi nějaké věci třeba zahazoval a zapisoval jen to co tě zajímá, každopádně nějaký 256 bytový buffer by na tohle stačil a vyhnul bych se používání String třídy, která je celkem nenasytná, ale zase hodně věcí ulehčuje, takže pokud neřešíš paměť, tak dobrý). Každopádně v té nečítací smyčce nevypisuj nic debugovacího, aby se to nezdržovalo. A poté bych v klidu tu odpověď rozparsoval.

To jsou věci, co v tom vidím já.
8milan8
Příspěvky: 128
Registrován: čtv led 01, 2015 6:30 pm

Re: Gsm modul

Příspěvek od 8milan8 »

Karya píše:
...
//WDT_Restart(WDT);
delay(1000);
checkSMS();

Toto mam v uvodzovkach ked to tam dam tak mi vypise chybu.
...
Ani se nedivím, je to nějaká funkce, která slouží asi k restartu watchdogu a nikde není definována.

  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek