• Localization

GSM900 modulis

Prietaisų valdymas, stebėjimas nuotoliniu būdu, jų būklės stebėjimas ir valdymas interneto pagalba jau nieko nestebina. Taigi sukurpiau tokią bandymų plokštę su GSM900 moduliu arba gsm telefoną. Kurio pagalba galima skambinti, siųsti sms, jungtis prie interneto ir t.t .

Plokštė maitinama 4,1V įtampa gali būti iki 4,7V (skaityti GSM900 modulio techninę dokumentaciją) .

Pirmą kartą plokštę prijungus prie kompiuterio reikia ją sukonfiguruoti. Plokštę aš jungiu per usb/com konverterį trim laidais- gnd, Rx, Tx. Nežinantiems – konverterio Rx sujungiamas su gsm plokštės Tx ir konverterio Tx  sujungiamas su gsm plokštės Rx.

Jei plokštė maitinama didesne nei 3.0V įtampa Rx,Tx signalams perduoti reikia suderinti jų įtampų lygius, kitaip galite sugadinti GSM900 modulį. Mano darytoje plokštėje jau yra lygių suderinimas.

Naudoju Terminal v1.9b programą (galima naudoti bet kokią programą susijungimui per com jungtį)

Taigi reikia sukonfiguruoti gsm modulį. Konfiguruoti reikia jei kortelė turi pin kodą.  Prisijungus per Terminal programą prie com jungties, palaukiame 2,3 sekundes, tada siunčiame “AT” komandą (būtinai didžiosiomis raidėmis). Jei teisingai parinktas com jungties greitis Terminal programoje gausime tokį atsakymą:

RDY

+CFUN:1

+CPIN: READY  jei kortelė neturi pin kodo

+CPIN: SIM PIN jei kortelė turi pin kodą, reikia įvesti tokią komandą AT+CPIN=****  vietoj **** įrašome pin kodą.

Jei viskas tvarkoje pasirodo užrašas:

Call Ready

Padeda mirksėti LED diodas, jei mirksi be pauzių vadinasi neprisijungė prie tinklo, jei mirksi su 3-4 sekundžių pauzėmis, vadinasi prisijungė prie tinklo.

Trumpas video parodantis LED diodo būsenas jungiantis prie tinklo.

GSM plokštę naudoju kartu su Arduino plokšte stebėti namo karšto vandens boilerio temperatūrą interneto pagalba .

 

/*
Galimybės:
Skambinti // per terminal siunčiame d komandą
Siųsti sms // per terminal siunčiame t komandą
Padėti ragelį // per terminal siunčiame h komandą
Siųsti duomenis į Emoncms serverį // per terminal siunčiame i komandą
Išjungti/įjungti modulį // per terminal siunčiame p komandą
*/

#include
#include
#include #define APIKEY "ęąčęąęąčęąčęąčęąčęąčęąęąęąęąč" // API raktas iš Emoncms serverio
#define NUMBER "\"+370*********\"" // mobilaus telefono numeris į kurį skambinama arba siunčiama sms
#define ThermistorPIN 0 // Analog Pin 0
#define ThermistorPIN1 1 // Analog Pin 1
#define ThermistorPIN2 2 // Analog Pin 2

SoftwareSerial mySerial(7, 8); //Rx,Tx arba atvirkščiai 🙂

char buffer[12];

float vcc = 4.94; // arduino plokštės arba maitinimo šaltinio įtampa prijungta prie termovaržų
float pad = 10000; // varža omais, pirmo rezistoriaus
float pad1 = 10000; // varža omais, antro rezistoriaus
float pad2 = 10000; // varža omais, trečio rezistoriaus
float thermr = 10000; //varža omais, termorezistoriaus

///////////////////////////
// pirmas daviklis temp //
///////////////////////////
float Thermistor(int RawADC) {
long Resistance;
float Temp; // Dual-Purpose variable to save space.

Resistance=((1024 * pad / RawADC) - pad);
Temp = log(Resistance); // Saving the Log(resistance) so not to calculate it 4 times later
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15; // Convert Kelvin to Celsius
return Temp; // Return the Temperature
}

///////////////////////////
// antras daviklis temp1      //
///////////////////////////
float Thermistor1(int RawADC1) {
long Resistance1;
float Temp1;

Resistance1=((1024 * pad1 / RawADC1) - pad1);
Temp1 = log(Resistance1); // Saving the Log(resistance) so not to calculate it 4 times later
Temp1 = 1 / (0.001129148 + (0.000234125 * Temp1) + (0.0000000876741 * Temp1 * Temp1 * Temp1));
Temp1 = Temp1 - 273.15; // Convert Kelvin to Celsius
return Temp1; // Return the Temperature
}
////////////////////////////
// trečias daviklis temp2        //
////////////////////////////
float Thermistor2(int RawADC2) {
long Resistance2;
float Temp2;

Resistance2=((1024 * pad2 / RawADC2) - pad2);
Temp2 = log(Resistance2); // Saving the Log(resistance) so not to calculate it 4 times later
Temp2 = 1 / (0.001129148 + (0.000234125 * Temp2) + (0.0000000876741 * Temp2 * Temp2 * Temp2));
Temp2 = Temp2 - 273.15; // Convert Kelvin to Celsius
return Temp2; // Return the Temperature
}

void setup()
{
mySerial.begin(19200); // the GPRS baud rate
Serial.begin(19200); // the Serial port of Arduino baud rate.
delay(500);
}

void loop()
{
if (Serial.available())
switch(Serial.read())
{
case 'h': //padėti ragelį
DialHold();
break;
case 'd': //skambinti
DialVoiceCall();
break;
case 't': //sms
SendTextMessage();
break;
case 'i': //siųsti duomenis į Emoncms serverį
SubmitHttpRequest();
break;
case 'p': //išjungti/įjungti modulį
powerUpOrDown();
break;

}
if (mySerial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook
Serial.write(mySerial.read()); // write it to the GPRS shield
}

void DialVoiceCall()
{
mySerial.println("ATD + "NUMBER";");//mobilaus numeris į kurį skambinama
delay(100);
mySerial.println();
}
void SendTextMessage()
{
mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode
delay(100);
mySerial.println("AT + CMGS = "NUMBER");//send sms message, be careful need to add a country code before the cellphone number
delay(100);
mySerial.println("A test message!");//the content of the message
delay(100);
mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
mySerial.println();

}
void SubmitHttpRequest()
{
tcp:
delay(30000);

float temp;
float temp1;
float temp2;

temp=Thermistor(analogRead(ThermistorPIN));
temp1=Thermistor1(analogRead(ThermistorPIN1));
temp2=Thermistor2(analogRead(ThermistorPIN2));

String temp_0=itoa(temp,buffer,10);
String temp_1=itoa(temp1,buffer,10);
String temp_2=itoa(temp2,buffer,10);

Serial.print("Daviklis temp: ");
Serial.println(temp,1);
delay(100);
Serial.print("Daviklis temp1: ");
Serial.println(temp1,1);
delay(100); // display Celsius
Serial.print("Daviklis temp2: ");
Serial.println(temp2,1);
delay(100); // display Celsius

Serial.println("");
delay(5000);
mySerial.println("AT+CSQ");
delay(100);
ShowSerialData();// this code is to show the data from gprs shield, in order to easily see the process of how the gprs shield submit a http request, and the following is for this purpose too.
mySerial.println("AT+CGATT?");
delay(100);
ShowSerialData();
mySerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the SAPBR, the connection type is using gprs
delay(1000);
ShowSerialData();
mySerial.println("AT+SAPBR=3,1,\"APN\",\"CMNET\"");//setting the APN, the second need you fill in your local apn server
delay(4000);
ShowSerialData();
mySerial.println("AT+SAPBR=1,1");//setting the SAPBR, for detail you can refer to the AT command mamual
delay(2000);
ShowSerialData();
mySerial.println("AT+HTTPINIT"); //init the HTTP request
delay(4000);
ShowSerialData();
mySerial.println("AT+HTTPPARA=\"URL\",\"http://giedriausweb.lt/monitoringas/api/post?apikey="APIKEY"&json={boil.in.temp:"+temp_0+",boil.out.temp:"+temp_1+",boil.inside.temp:"+temp_2+"}\""); //http://.... reikėtų pasikeisti į savo serverio nuorodą arba užsiregistruoti ir naudotis www.giedriausweb.lt/monitoringas vieta.
ShowSerialData();
delay(4000);
ShowSerialData();
delay(100);
mySerial.println("AT+HTTPACTION=0");//submit the request
delay(10000);//the delay is very important, the delay time is base on the return from the website, if the return datas are very large, the time required longer.
//while(!mySerial.available());
ShowSerialData();
mySerial.println("AT+HTTPREAD");// read the data from the website you access
delay(300);
ShowSerialData();
mySerial.println("");
delay(60000);

{goto tcp;} //ciklas pradedams išnaujo užtrunka apie 130sek.

}

void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}

void DialHold()
{
mySerial.println("ATH");//dial the number
delay(100);
mySerial.println();
}
void ShowSerialData()
{
while(mySerial.available()!=0)
Serial.write(mySerial.read());
}

 

 

 

Informacijos šaltiniai:

http://we.easyelectronics.ru/part/gsm-gprs-modul-sim900.html

http://www.seeedstudio.com/wiki/index.php?title=GPRS_Shield_v0.9b čia rasite ir techninę doumentaciją.

http://arduino.cc/playground/ComponentLib/Thermistor2

[stextbox id=”download” caption=”Atsisiųsti” collapsing=”true”]Eagle failai[/stextbox]

Tagged , , . Bookmark the permalink.

4 Responses to GSM900 modulis

  1. mindogas says:

    Turiu pasiklausima SIM900 tema 🙂 Pirmiausiai tai kam reikalinga baterija? Gal kartais SIM900 turi savyje laikrodi koki ar ką panašaus? Šiaipp mačiau kelis tokius įrenginius jungiamus be baterijos tai gal čia ji nebūtina?

    • admin says:

      Taip, Tu visiškai teisus. SIM900 turi RTC laikrodį, vietoj baterijos galima jugti kondensatorių. Nors šiuo metu nesinaudoju laikrodžio galimybėmis, bet gal kada prireiks.

      • mindogas says:

        Tik po to kai paklausiau parsisiunciau tavo schema ir pamačiau kad batareika eina i VRTC. Kažkaip logiška 😀
        Šiaip durniausia žiuriu su tuo pagrindiniu matinimu.. Na kodel jam netinka +3,3V ar +5V.. Dabar verčia mane turetu dvi power linijas ir dar ta viena 4V tokia issipletusi. Galiu zinoma Atmega uzmaitinti is 4V, tada dar galeciau dirbti 16MHz greiciu, bet tada jo visi IO isigimsta truputi..

        Beje ziuri planavai panaudoti SIM900 duodamus IO kad isvedei prievadus?

        • admin says:

          Tas tai jo, dabar ir aš naudoju du maitinimo šaltinius. Vienas Arduino kitas GSM moduliui (temperatūros stebėjimui). Dar turi būti suderintos rx/tx linijos įtampos, moduliui reik kad būtų 3v. Plokštę dariau kaip maketinę, velnias žino ko prireiks ateityje. p.s spūstelėk skype ikonėlę viršuje, per skype greičiau pasikeisim info.

Leave a Reply

Your email address will not be published. Required fields are marked *