Kimlorentz Skrevet 10. august 2014 Del Skrevet 10. august 2014 (endret) Jeg driver med å lage et program til en Arduino Mega 2560 som skal sende batteri spenning og styre en LED når den mottar en sms melding med ordet: "ditt passord" batt. "ditt passord" LEDON. "ditt passord" LEDOFF. Denne tekst meldingen gir arduinoen ordre og sende batteri spenningen til han som sendte meldingen. PS! "ditt password", her setter du noe du vil ha slik at andre ikke kan få dataen uten å skrive rett passord først. F.eks "karma batt". Her er koden så langt jeg har kommet til nå. og Motta SMS fra Arduinoen fungerer fint, å styre arduinoen via sms fungerer ikke. LED er koblet til pin 10 og analog spennings måler for batteri er på pin A0. // http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot#Purchasing_this_module #include <SoftwareSerial.h> SoftwareSerial Sim900Serial(2, 3); char inchar; int Data = 0; int DataSIM = 0; const int BUTTONA = 22; const int BUTTONB = 23; const int SIM = 40; // on current Sim900 card the PWM pin 7 controll the PWRKEY to SIM900 chip const int BUTTONC = 42; // Manual set SIM900 ON/OFF button const int LED = 10; // LED output, controlled by SMS boolean lastButtonA = LOW; boolean lastButtonB = LOW; boolean lastButtonC = LOW; boolean currentButtonA = LOW; boolean currentButtonB = LOW; boolean currentButtonC = LOW; void setup() { { pinMode (BUTTONA, INPUT); pinMode (BUTTONB, INPUT); pinMode (BUTTONC, INPUT); pinMode (LED, OUTPUT); pinMode (SIM, OUTPUT); } // Starting up SIM900 delay(2000); // Delay to give the SIM900 time to power up digitalWrite(SIM, HIGH); delay(3000); digitalWrite(SIM, LOW); delay(8000); // SIM900 setup Sim900Serial.begin(115200); // the GPRS baud rate delay(500); Sim900Serial.println("AT+IPR=19200"); delay(500); Sim900Serial.begin(19200); // the GPRS baud rate delay(1000); Sim900Serial.println("AT+CMGD=1,4"); // delete all SMS Serial.begin(115200); // the Hardware serial rate Serial.println("Please type '1 true 3' to send SMS"); } // Button A boolean debounce(boolean last) { boolean currenta = digitalRead(BUTTONA); if (last != currenta) { delay(5); currenta = digitalRead(BUTTONA); } return currenta; } // Button B boolean debounceb(boolean lastb) { boolean currentb = digitalRead(BUTTONB); if (lastb != currentb) { delay(5); currentb = digitalRead(BUTTONB); } return currentb; } // Button C - ON/OFF boolean debouncec(boolean lastc) { boolean currentc = digitalRead(BUTTONC); if (lastc != currentc) { delay(5); currentc = digitalRead(BUTTONC); } return currentc; } void loop() { Data=Serial.read(); // SMS code nr 1 if (Data==0x31) { SendTextMessage1(); } currentButtonA = debounce(lastButtonA); if (lastButtonA == LOW && currentButtonA == HIGH) { SendTextMessage1(); } lastButtonA = currentButtonA; // SMS code nr 2 if (Data==0x32) { SendTextMessage2(); } currentButtonB = debounceb(lastButtonB); if (lastButtonB == LOW && currentButtonB == HIGH) { SendTextMessage2(); } lastButtonB = currentButtonB; // SMS code nr 3 if (Data==0x33) { SendTextMessage3(); } // SIM ON/OFF BUTTON currentButtonC = debouncec(lastButtonC); if (lastButtonC == LOW && currentButtonC == HIGH) { digitalWrite (SIM, HIGH); delay(3000); digitalWrite (SIM, LOW); } lastButtonC = currentButtonC; if (Sim900Serial.available()) Serial.write(Sim900Serial.read()); } void SendTextMessage1() { Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.println("Hallo,1");//the content of the message delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println(); } void SendTextMessage2() { int sensor1 = analogRead(A0); float power = sensor1 * (5 / 1023.0) * 2; Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.print("Dette er en automatisk melding. "); Sim900Serial.println("Batteri spenningen er lav."); Sim900Serial.print("Battery spenning: "); Sim900Serial.print(power, 2); Sim900Serial.println(" Vdc"); delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println(); } void SendTextMessage3() { Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.println("Hallo,3");//the content of the message delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println(); } void ReceiveTextMessage1() { // Code here } void ReceiveTextMessage2() { // Code here } Endret 10. august 2014 av Kimlorentz Lenke til kommentar
Kimlorentz Skrevet 10. august 2014 Forfatter Del Skrevet 10. august 2014 Her er foto av oppkoblingen Lenke til kommentar
Lycantrophe Skrevet 12. august 2014 Del Skrevet 12. august 2014 (endret) Hvorfor har du så mange globale variabler? Hvorfor if-chain? Endret 12. august 2014 av Lycantrophe Lenke til kommentar
Kimlorentz Skrevet 12. august 2014 Forfatter Del Skrevet 12. august 2014 Det var noe jeg fant på nettet, veit ikke hvorfor de lagde den så vanskelig, men den funket. Har du noe bedre og lettere løsning? Jeg er ny i dette. Lenke til kommentar
Lycantrophe Skrevet 12. august 2014 Del Skrevet 12. august 2014 Jeg så ikke noe spørsmål der, men det er nå mange måter å forbedre det på. Button states kan for eksempel samles i en struct. Lenke til kommentar
Kimlorentz Skrevet 13. august 2014 Forfatter Del Skrevet 13. august 2014 Knappene skal bort. De er der bare i test fasen. Har gjort mye forbedringer på kodingen, men mangler fortsatt send sms ved mottatt sms til samme avsender. Har du noen eksempler på Arduino mottar sms: "passord ledpå" Arduino sender til avsender viss passord er rett og ordet ledpå ligger etterpå: "Led på" og slår på LED på pin f.eks 10. Arduino mottar sms: "passord ledav" Arduino sender til avsender viss passord er rett og ordet ledav ligger etterpå: "Led av" og slår av LED på samme pinne som ledpå. Lenke til kommentar
Kimlorentz Skrevet 13. august 2014 Forfatter Del Skrevet 13. august 2014 (endret) Her er nåværende kode // http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot#Purchasing_this_module // Code for using Hardware Serial, use 1 true 3, Arduino Mega2560/DUE #define Sim900Serial Serial1 // Code for using Software Serial, pin 2 RX and pin 3 TX //#include <SoftwareSerial.h> //SoftwareSerial Sim900Serial(2, 3); boolean LOWVOLT = true; // Used to stop arduino to send many sms during low voltage levels char inchar; int Data = 0; int DataSIM = 0; const int SIM = 40; // on current Sim900 card the PWM pin 7 controll the PWRKEY to SIM900 chip const int LED = 10; // LED output, controlled by SMS const int LED2 = 9; // LED output, controlled by SMS void setup() { { pinMode (LED, OUTPUT); pinMode (SIM, OUTPUT); } // Starting up SIM900 delay(2000); // Delay to give the SIM900 time to power up digitalWrite(SIM, HIGH); delay(3000); digitalWrite(SIM, LOW); delay(8000); // SIM900 setup Sim900Serial.begin(115200); // the GPRS baud rate delay(500); Sim900Serial.println("AT+IPR=19200"); delay(500); Sim900Serial.begin(19200); // the GPRS baud rate delay(1000); Sim900Serial.println("AT+CNMI=2,2,0,0,0\r"); delay(1000); Sim900Serial.println("AT+CMGD=1,4"); // delete all SMS Serial.begin(115200); // the Hardware serial rate Serial.println("Please type '1 true 3' to send SMS"); } void loop() { // This line is for debug, // out when not used if (Sim900Serial.available() >0) Serial.write(Sim900Serial.read()); Data=Serial.read(); if (Data==0x31) // type 1 on serial monitor { SendTextMessage1(); } if (Data==0x32) // Type 2 on serial monitor { SendTextMessage2(); } if (Data==0x33) // Type 3 on serial monitor { SendTextMessage3(); } ////// Battery monitor code ////// int sensor1 = analogRead(A0); float power = sensor1 * (5 / 1023.0) * 2; // When battery is lover then 7.00vdc if (power <= 7.00) { digitalWrite(LED, HIGH); if (LOWVOLT) SendTextMessage2(); LOWVOLT = false; } else { digitalWrite(LED, LOW); } // When the battery is above 9.00vdc Set LOWVOLT to True if (power >= 9.00) { if(!LOWVOLT) SendTextMessage3(); LOWVOLT = true; } ////// End of Battery monitor code ////// } void SendTextMessage1() { Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.println("Hallo,1");//the content of the message delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println("AT+CMGD=1,4"); } void SendTextMessage2() { Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.println("Batteri spenningen er lav. Vennligst lad din enhet"); delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println("AT+CMGD=1,4"); } void SendTextMessage3() { Sim900Serial.print("AT+CMGF=1\r"); //Sending the SMS in text mode delay(100); Sim900Serial.println("AT + CMGS = \"********\"");//The target phone number delay(100); Sim900Serial.println("Batteri pakken er ferdig ladet");//the content of the message delay(100); Sim900Serial.println((char)26);//the ASCII code of the ctrl+z is 26 delay(100); Sim900Serial.println("AT+CMGD=1,4"); } void ReceiveTextMessage1() { digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW); } void ReceiveTextMessage2() { digitalWrite (LED2, HIGH); delay(1000); digitalWrite (LED2, LOW); } void ReceiveTextMessage3() { digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW); delay(1000); digitalWrite (LED, HIGH); delay(1000); digitalWrite (LED, LOW); } Endret 13. august 2014 av Kimlorentz Lenke til kommentar
Kimlorentz Skrevet 19. august 2014 Forfatter Del Skrevet 19. august 2014 Hvordan kan jeg endre Data==0x31 til Data==SMS1? Lenke til kommentar
Lycantrophe Skrevet 19. august 2014 Del Skrevet 19. august 2014 static const unsigned int SMS1 = 0x31 /* other */ Data == SMS1; Jeg anbefaler en switch for å håndtere det: switch( Data ) { case SMS1: do1(); break; case SMS2: do2(); break; } Lenke til kommentar
Kimlorentz Skrevet 20. august 2014 Forfatter Del Skrevet 20. august 2014 Hvilken er best bruk av flære void eller bruk av switch case? Lenke til kommentar
Lycantrophe Skrevet 20. august 2014 Del Skrevet 20. august 2014 Dette er inne i loop(). Du lar hver av casene håndteres av hver sin funksjon. Lenke til kommentar
Kimlorentz Skrevet 20. august 2014 Forfatter Del Skrevet 20. august 2014 Her f.eks er en oppgave som skal gjøres. Hva passer så best, La den stå som den er eller bruk av switch case. og viss bruk av switch case, hvordan vil det se ut? int LOG1 = 100; // 100 = 1 seconds int LOG2 = 500; // 500 = 5 seconds int count = 0; int count2 = 0; const int LED = 10; const int LED2 = 9; void setup() { pinMode (LED, OUTPUT); pinMode (LED2, OUTPUT); digitalWrite(LED, LOW); digitalWrite(LED2, LOW); } void ledlog() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); count = 0; } void ledlog2() { digitalWrite(LED2, HIGH); delay(1000); digitalWrite(LED2, LOW); delay(1000); count2 = 0; } /******************** MAIN LOOP ******************************** ****************************************************************/ void loop() { if (count >= LOG1) { ledlog(); } count++; delay(10); if (count2 >= LOG2) { ledlog2(); } count2++; delay(10); } Lenke til kommentar
Lycantrophe Skrevet 20. august 2014 Del Skrevet 20. august 2014 Ikke bruk globale variabler. I det eksempelet er det greit som det er nå - ingen steder for switch. Lenke til kommentar
Kimlorentz Skrevet 27. august 2014 Forfatter Del Skrevet 27. august 2014 (endret) Ble en del bugs i det programmet jeg lagde, så startet fra en annen vinkel. Under her ser du så langt jeg har kommet til nå, det er kun gps loggingen som er i drift nå, den har ingen forsinkelse enda men det kommer. Arduinoen er satt opp til å skrive i 2 filer. Fil nr1 - logfile, den lagrer GGA og RMC raw data. Fil nr2 - logfileGPS, lagrer spesial oppsett som også passer for bruk til Excel. Analoge A0 pinnen er Power Voltage er inn spenningen til Arduinoen. Analog A1 pinnen er Battery Voltage er backup batteriet som er montert inn i GPS modulen. LINK TIL FIL: http://kimlorentz.com/arduino/GPSlogger.txt Filens størrelse på Arduinoen er(Arduino Mega 2560): 8% of program storage space 23% of dynamic storage space Endret 27. august 2014 av Kimlorentz Lenke til kommentar
Sceptic Skrevet 28. august 2014 Del Skrevet 28. august 2014 Hei Kimlorentz, Jeg har fulgt litt med på tråden her og er interessert i å anskaffe SIM900-modulen. Er denne å få kjøpt i norge eller skaffet du den via epalsite? Et annet spørsmål: Kan du beskrive bedre hva det er du prøver å oppnå med prosjektet ditt? Etter det jeg ser av koden du har lagt ut til nå, så varierer det veldig med hvilke komponenter du tar i bruk (GSM/GPRS, spenningsmåler, SD-kort, GPS). Skal du bruke alle komponentene i prosjektet ditt eller er det bare en måte å teste ut forskjellige teorier/metoder på? Sceptic Lenke til kommentar
Kimlorentz Skrevet 31. august 2014 Forfatter Del Skrevet 31. august 2014 Hei, koden varierer litt nå på grunn av testing. Jeg tester en og en del av koder og tester noen teorier før jeg setter det sammen til en kode. Prosjektet går ut på GPS tracking av hund, men muligheter til andre oppgaver også. Spenningsmålingen er for at programmet kan se at spenningen på halsbandet blir for lavt og gir deg beskjed via sms, du kan og spørre etter batteri spenningen via sms. SD kortet er et alternativ for de som ønsker å bruke halsbandet til tur logging og ikke kun gps tracking av hunden. Den kan og f.eks få i oppgave og logge hundens prosisjon hver time, en gang om dagen osv. Utstyr i bruk nå: SIM900 skaffet jeg fra ebay - SIM900 GSM GPS enheten skaffet jeg fra adafruit - Ultimate GPS SD kort enheten skaffet jeg fra adafruit - MicroSD Alt er styrt via: Arduino Mega2560 - Mega2560 eller Arduino DUE - DUE Jeg valgte disse komponentene på grunn av pris og god levering. Adafruit er ganske rask og veldig hjelpsome så det er vert å ta en titt der. Driver fortsatt med tester og for å få litt valg muligheter ser det ut som jeg kommer til å bruke DUE kortet på grunn av multitaskingen. Skal også endre mye av kodingen som sitter i SRAM til å bli flyttet over til Flash, dette er for å spare plass på SRAM som jeg trenger. Lenke til kommentar
Kimlorentz Skrevet 31. august 2014 Forfatter Del Skrevet 31. august 2014 (endret) Kommet veldig langt nå og mye fungerer. Men nå sitter jeg litt fast når det gjelder bruk av counters jeg gjør nok noe feil for jeg får ikke counter systemet til å fungere. Noen som kan litt om bruk av counters Her er koden - Denne ligger i void loop(); : if (GPSLOG = true); { readGPS(); if(GPS.fix==1) { //Only save data if we have a fix GPSlog(); GPSLOG = false; count = 0; } } if (count >= GPSLOGDATA) { GPSLOG = true; } count++; Har følgende oppsett ved oppstart av arduino kortet: GPSLAG = true; int GPSLOGDATA = 100000; int count = 0; Så hva er det jeg bommer på? Endret 31. august 2014 av Kimlorentz Lenke til kommentar
Lycantrophe Skrevet 31. august 2014 Del Skrevet 31. august 2014 Sikker på at du vil ha if( GPSLOG = true )? Lenke til kommentar
Kimlorentz Skrevet 31. august 2014 Forfatter Del Skrevet 31. august 2014 den er bare true første gang for å få GPS i fix. etter det går den i false og så må den vente på count har kommet opp til ønsket nivå før den utfører jobben igjen. Glemte å sette inn, etter GPSLOG = false i if GPS.fix skal den sende Standby code til GPS modulen. Og i count >= GPSLOGDATA skal jeg sette inn GPS awake code til GPS enhet og så fortsette med GPSLOG = true Lenke til kommentar
Lycantrophe Skrevet 31. august 2014 Del Skrevet 31. august 2014 (endret) Prøv == i stedet for =. Eventuelt fjern == true i det hele tatt, for det er verken bra stil eller nødvendig. Endret 31. august 2014 av Lycantrophe Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå