source: trunk/Arduino/GSM/doms/doms.ino@ 20041

Last change on this file since 20041 was 17971, checked in by dneise, 10 years ago
new GSM features ... now binary will be too large for atmega328p manual linker call might help here.
File size: 7.0 KB
Line 
1/*
2
3 Testing of: Arduino for FACT
4
5 Gareth Hughes 2013-10-30
6 Dom Neise 2014-09
7
8 Using: Arduino Ethernet
9 GSM Overlay
10 LSM303: Magnetic field and accelerometer
11 YL-38: Light Sensor
12
13 Function: Will reply to an SMS stating the position, movement and light level.
14 If lighlevel gets above a certain threshold will send a warning SMS every 1 min.
15
16 Modifications by Dom:
17 - In order to find our why the resulting binary is soo large,
18 I enclosed most of the code in precompiler #ifdef-#endif constructs.
19 The 4 #define USE_<name> statements in the beginning can be commented
20 in and out in order to create a binary, that e.g. does not need
21 the GSM shield to be attached.
22
23 - printHelp function can now be given a reference to the EthernetClient
24 that should recieve the help message, that way to clients can be connected
25 and will not get their mutual help messages anymore.
26*/
27
28
29//#define USE_WIRE
30#define USE_ETH
31//#define USE_LSM
32#define USE_GSM
33
34#include <SPI.h>
35#include <Ethernet.h>
36
37#ifdef USE_GSM
38 #include <GSM.h>
39#endif
40
41#ifdef USE_WIRE
42 #include <Wire.h>
43#endif
44
45#ifdef USE_LSM
46 #include <LSM303.h>
47#endif
48
49
50
51#ifdef USE_ETH
52EthernetServer server = EthernetServer(23);
53#endif
54
55//bool sentHeader = false;
56
57// PIN Number for the SIM
58#define PINNUMBER ""
59#define NUMLEN 15
60
61
62
63char message[18]; // Array to hold SMS message
64char senderNumber[NUMLEN]; // Array to hold the number a SMS is retreived from
65
66// -------------- GSM stuff --------------------------------------------
67#ifdef USE_GSM
68 GSM gsmAccess;
69 GSM_SMS sms;
70 byte gsmStatus = -1; // -1 : unknown
71 bool use_gsm = false;
72#endif
73
74// -------------- Light sensor stuff -----------------------------------
75int iLight = 9999; // light level
76
77
78// -------------- Compass stuff ----------------------------------------
79#ifdef USE_LSM
80LSM303 compass;
81#endif
82int heading = -9999; // Continual heading reading
83float pitch = -9999.; // Pitch relative to horizon
84
85
86
87void setup()
88{
89 // this is to begin (ethz) ethernet
90 //Ethernet.begin(mac, ip, dnserver, gatew, smask);
91 // initialize serial communications and wait for port to open:
92 Serial.begin(9600);
93
94
95#ifdef USE_ETH
96 //ETH
97 byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xB5, 0xE3 };
98 byte ip[] = { 192, 33, 103, 241 };
99 //LA PALMA
100 //byte mac[] = { 0xFA, 0xC7, 0xBB, 0xFF, 0x33, 0x33 };
101 //byte ip[] = { 10, 0, 100, 202 };
102
103 Ethernet.begin(mac, ip);
104 server.begin();
105 Serial.print("Chat server address:");
106 Serial.println(Ethernet.localIP());
107#else
108 Serial.println("No ethernet this time :-(");
109#endif
110
111
112
113 // Start the Wire communication
114#ifdef USE_WIRE
115 Wire.begin();
116#endif
117
118 // Initialize the Compass
119#ifdef USE_LSM
120 compass.init();
121 compass.enableDefault();
122
123 // Calibration values. Use the Calibrate example program to get the values for your compass.
124 // ETH Calibration values
125 // compass.m_min.x = -700; compass.m_min.y = -695; compass.m_min.z = -635;
126 // compass.m_max.x = +293; compass.m_max.y = +551; compass.m_max.z = 606;
127 // La Palma calibration values
128 compass.m_min.x = -389; compass.m_min.y = -423; compass.m_min.z = -420;
129 compass.m_max.x = +510; compass.m_max.y = +420; compass.m_max.z = +315;
130#endif
131}
132
133
134void loop()
135{
136#ifdef USE_GSM
137 if (use_gsm && gsmStatus==GSM_READY)
138 {
139 // user wants us to use GSM, and GSM seems to be okay.
140 checkForSms();
141 } else if (use_gsm && gsmStatus!=GSM_READY)
142 {
143 // user wants us to use GSM, but it's not yet okay,
144 // so we try to connect to GSM network.
145 gsmStatus = gsmAccess.begin(PINNUMBER);
146 } else if (!use_gsm && gsmStatus!=-1)
147 {
148 // user does NOT want us to use GSM, but we seem to be connected,
149 // so let's shut it down.
150 gsmAccess.shutdown();
151 // since there is no dedicated 'GSM_SHUTDOWN' status, we simply use -1.
152 gsmStatus = -1;
153 } else
154 {
155 // user does NOT want us to use GSM and GSM seems to be down ..
156 // so we don't do anything.
157 }
158#else
159 checkForSms();
160#endif
161
162#ifdef USE_ETH
163 checkForEthernetClient();
164#endif
165
166}
167
168
169void checkForEthernetClient()
170{
171#ifdef USE_ETH
172 EthernetClient client = server.available();
173 if( !client ){
174 return;
175 }
176
177 if( client.available() )
178 {
179 //if(!sentHeader)
180 //{
181 //printHelp(client);
182 //sentHeader = true;
183 //}
184
185 int c = client.read();
186 switch( c )
187 {
188 case 'q':
189 //sentHeader = false;
190 delay(1); // give the web browser time to receive the data
191 client.stop(); // close the connection:
192 break;
193 case 'h':
194 printHelp(client);
195 break;
196 case 'd':
197 generateMessage();
198 client.println(message);
199 break;
200 case 'g':
201 use_gsm = true;
202 break;
203 case 'G':
204 use_gsm = false;
205 break;
206 case 's':
207 printStatus(client, true);
208 break;
209 //case 'p':
210 //digitalWrite(9, HIGH);
211 //server.println("Park");
212 //break;
213 }
214 }
215#endif
216}
217
218
219void printHelp(
220#ifdef USE_ETH
221 EthernetClient &c
222#endif
223 )
224{
225#ifdef USE_ETH
226 c.println();
227 c.println("FACT GSM");
228 c.println("h help");
229 c.println("q quit");
230 c.println("g/G en-/disable GSM");
231 c.println("s status");
232 c.println();
233 c.println("d direction");
234 //c.println("p Park Tel");
235 c.println();
236#endif
237}
238
239void printStatus(
240#ifdef USE_ETH
241 EthernetClient &c,
242#endif
243 bool print_via_serial
244 )
245{
246#ifdef USE_ETH
247 c.print("use_gsm: "); c.println(use_gsm);
248 c.print("gsmStatus: "); c.println(gsmStatus);
249#endif
250 if (print_via_serial)
251 {
252 Serial.print("use_gsm: "); Serial.println(use_gsm);
253 Serial.print("gsmStatus: "); Serial.println(gsmStatus);
254 }
255}
256
257
258void checkForSms()
259{
260#ifdef USE_GSM
261 if( sms.available() )
262 {
263 // Get remote number
264 sms.remoteNumber(senderNumber, NUMLEN);
265 if( sms.peek()=='P' )
266 {
267 Serial.println("I P");
268 generateMessage();
269 sendSMS();
270 }
271 sms.flush();
272 }
273#else
274 Serial.println("I *would* now check for SMS.");
275#endif
276}
277
278void sendSMS()
279{
280#ifdef USE_GSM
281 sms.beginSMS(senderNumber);
282 sms.print(message);
283 sms.endSMS();
284#endif
285}
286
287void get_heading_pitch()
288{
289#ifdef USE_LSM
290 compass.read();
291 heading = compass.heading((LSM303::vector<int>){0,-1,0}) - 90 - 24;
292 if( heading < 0 ) heading = heading + 360;
293
294 pitch = atan(compass.a.x/sqrt(pow(compass.a.y,2.)+pow(compass.a.z,2.)));
295 pitch *= 180.0/3.1415;
296 pitch += 13.;
297 pitch = 90. - pitch;
298#endif
299}
300
301
302// Generate SMS
303void generateMessage()
304{
305 get_heading_pitch();
306 // Read light level
307 iLight = analogRead(0);
308 // Setup message
309 sprintf(message,"%d %d %d\n",heading,(int)pitch,iLight);
310}
Note: See TracBrowser for help on using the repository browser.