Existentiell nöd-telefon (25 / 26 steg)
Steg 25: Programmera Arduino
//**********************************************************************************
EXISTENTIELLA NÖDTELEFON
AV RANYDY SARAFAN
//
FÖR MER INFO:
//
BUFFRING KOD BASERAT PÅ:
http://jayeshprojects.blogspot.com/2010/04/Real-Time-Mobile-GPS-Tracker-with.html
//
ANVÄND DENNA KOD HUR DU VILL
//**********************************************************************************
#include < SoftwareSerial.h >
#define BUFFSIZ 90
char at_buffer [BUFFSIZ];
char buffidx;
int network_registered;
int network_AT_ready;
int firstTimeInLoop = 1;
Lista med telefonnummer att ringa
CONST char * telefonnummer [5] = {
"ATD2125551212",
"ATD2125551212",
"ATD2125551212",
"ATD2125551212",
"ATD2125551212",
};
Kommer att hålla det inkommande tecknet från serieporten.
char incoming_char = 0;
Skapa en "falsk" seriell port. Stift 2 är Rx pin, pin 3 är Tx PIN-koden.
SoftwareSerial cell(2,3);
för telefon modul - inställning Arduino stiften till variabler
int pulsePin = 7.
int ringModePin = 8;
int pickUpPin = 12;
int pickUpState = 0;
int pickedUp = 0;
int fastnat = 0;
int x;
Göra brett systeminitieringen här i denna funktion
void setup() {
för telefon modul - stift besläktade med ringmärkning
pinMode (pulsePin, produktionen);
pinMode (ringModePin, produktionen); Konfigurera i/o pins
för telefon modul - pin-besläktade handenhet switch med
pinMode (pickUpPin, ingång);
Initiera Arduino seriell port för felsökning.
Serial.BEGIN(9600);
Initiera virtuella seriella porten att prata med telefonen.
cell.BEGIN(9600);
Låt oss komma igång!
Serial.println ("Start SM5100B meddelande...");
Delay(1000);
/ * För närvarande nätverk registreras inte och AT inte är färdiga * /
network_registered = 0;
network_AT_ready = 0;
}
återställer Arduino när kallade
void(* resetFunc) (void) = 0; //declare återställa funktion på adress 0
/ * Läser på strängen från modulen SM5100B GSM/nätverk * /
void readATString(void) {
char c;
buffidx = 0; börja på begninning
för (x = 0; x < 10000; x ++) {
IF(cell.available() > 0) {
c=cell.Read();
om (c == -1) {
at_buffer [buffidx] = '\0';
hemkomst.
}
om (c == "\n") {
fortsätta;
}
om ((buffidx == BUFFSIZ - 1) || (c == '\r')) {
at_buffer [buffidx] = '\0';
hemkomst.
}
at_buffer [buffidx ++] = c;
}
}
}
/ * Bearbetar på strängen för att avgöra om nätverket är registrerat och AT är redo * /
void ProcessATString() {
om (strstr (at_buffer, "+ SIND: 8")! = 0) {
network_registered = 0;
Serial.println ("nät nätverk inte tillgänglig").
}
om (strstr (at_buffer, "+ SIND: 11")! = 0) {
network_registered = 1;
Serial.println ("nät rekommenderat").
}
om (strstr (at_buffer, "+ SIND: 4")! = 0) {
network_AT_ready = 1;
Serial.println ("nät på redo").
}
}
void loop() {
/ * Om kallas för första gången, loop tills nätverk och på är redo * /
IF(firstTimeInLoop == 1) {
firstTimeInLoop = 0;
medan (network_registered == 0 || network_AT_ready == 0) {
readATString();
ProcessATString();
}
}
getPhoneStatus();
readATString();
ringingRoutine();
checkPickup();
}
void getPhoneStatus() {
cell.println("at+CPAS");
Delay(500);
om (strstr (at_buffer, "+ CPA: 0")! = 0) {
fast = 0;
Serial.println("ready");
}
om (strstr (at_buffer, "+ CPA: 3")! = 0) {
fast = 0;
Serial.println("RINGING");
}
om (strstr (at_buffer, "+ CPA: 4")! = 0) {
fast = 0;
Serial.println ("pågår");
}
om inte i någon av de tre staterna efter 20 slingor
om ((strstr (at_buffer, "+ CPA: 0") == 0) & & (strstr (at_buffer, "+ CPA: 3") == 0) & & (strstr (at_buffer, "+ CPA: 4")) == 0) {
fast = fast + 1;
om (fast > 20) {
resetFunc(); Ring reset
}
}
}
CHECK FÖR INKOMMANDE SAMTAL
void ringingRoutine() {
om (strstr (at_buffer, "+ CPA: 3")! = 0) {
digitalWrite (ringModePin, hög);
för (int pulser = 0; pulser < 40; pulser ++) {
Ring för en sekund.
digitalWrite (pulsePin, hög); Växla forwardReverse vid 20hz (50 ms) att få standard USA-stil ringer.
Delay(25);
digitalWrite (pulsePin, låg);
Delay(25);
pickUpState = digitalRead(pickUpPin);
IF(pickUpState == 1) {
bryta;
}
}
digitalWrite (pulsePin, hög);
digitalWrite (ringModePin, låg); sluta ringa. Inaktivera ringMode.
}
}
KONTROLLERA OM LUREN PICKUP
OCH SVARAR PÅ TELEFON ELLER GÖRA SAMTAL
SEDAN HÄNGA
void checkPickup() {
pickUpState = digitalRead(pickUpPin);
endast om detta hade ringt!!!
IF(pickUpState == 1) {
IF(pickedUp == 0) {
om (strstr (at_buffer, "+ CPA: 3")! = 0) {
Svara i telefonen
cell.println("ATA");
pickedUp = 1;
}
om (strstr (at_buffer, "+ CPA: 0")! = 0) {
Ringa ett samtal
cell.println(phoneNumbers[random(5)]);
pickedUp = 1;
}
}
}
om handenheten placerad tillbaka på krok, sedan hänga.
IF(pickUpState == 0) {
IF(pickedUp == 1) {
cell.println("ATH");
pickedUp = 0;
}
}
}
Om du vill ändra vem som får kallas titta på där det står "//List med telefonnummer att ringa."