Advertisement
Guest User

Untitled

a guest
May 2nd, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.77 KB | None | 0 0
  1. #define TINY_GSM_MODEM_SIM800
  2. #include <TinyGsmClient.h>
  3. #include <ArduinoHttpClient.h>
  4. #include <LowPower.h>
  5. #include <RTClib.h>
  6. #include <EEPROM.h>
  7.  
  8. #define LED true
  9. #define T(x) ((x[0]-'0')*1000 + (x[1]-'0')*100 + (x[3]-'0')*10 + x[4]-'0')
  10.  
  11. const int DEV_NUM = 1;
  12.  
  13. const int MOS_RTC = 4;
  14. const int MOS_GSM = 5;
  15. const int RST_GSM = 7;
  16. const int MOS_SONIC = 6;
  17. const int MOS_ARDUINO = 8;
  18. const int LED_PIN = 13;
  19.  
  20. const int BATTERY1_PIN = A2;
  21. const int BATTERY2_PIN = A3;
  22. const int ECHO_PIN = 2;
  23. const int TRIG_PIN = 3;
  24. const int EEPROM_START_ADDRESS = 100;
  25.  
  26. const char *apn = "internet";
  27. const char *user = "internet";
  28. const char *pass = "internet";
  29. String server = "testakcelero.cba.pl";
  30. const int port = 80;
  31. // format czasu "HH:MM"
  32. const uint16_t measureHours[] = {
  33. T("19:25"),
  34. T("19:27")
  35. };
  36. const uint16_t numberOfMeasureH = sizeof(measureHours)/sizeof(measureHours[0]);
  37. const uint32_t BAUD = 115200;
  38. RTC_DS3231 rtc;
  39.  
  40. void signalLED(uint32_t num, boolean longTime = false) {
  41. if (!LED)
  42. return;
  43. if (longTime) {
  44. digitalWrite(LED_PIN, 1);
  45. delay(num);
  46. digitalWrite(LED_PIN, 0);
  47. } else {
  48. for (int i = 0; i < num; i++) {
  49. digitalWrite(LED_PIN, 1);
  50. delay(600);
  51. digitalWrite(LED_PIN, 0);
  52. delay((i == num - 1) ? 0 : 300);
  53. }
  54. }
  55. }
  56.  
  57. float bat(int pin) {return (map(analogRead(pin), 0, 1023, 0, 500) / 100.0);}
  58.  
  59. DateTime getNow() {
  60. digitalWrite(MOS_RTC, 1);
  61. delay(100);
  62. Serial.println("RTC start");
  63. if (!rtc.begin()){
  64. Serial.println("problem with RTC 1");
  65. exit(1);
  66. }
  67. DateTime now = rtc.now();
  68. Serial.println("RTC finish");
  69. digitalWrite(MOS_RTC, 0);
  70. return now;
  71. }
  72.  
  73.  
  74. boolean setRTCByGSM() {
  75. // inicjalizacja potrzebnych obiektów
  76. Serial.println("GSM start");
  77. digitalWrite(MOS_GSM, 0);
  78. digitalWrite(RST_GSM, 0);
  79. delay(1000);
  80. digitalWrite(RST_GSM, 1);
  81. delay(1500);
  82. TinyGsm modem(Serial);
  83. modem.restart();
  84.  
  85. boolean problem = true;
  86. // czekanie na sieć GSM
  87. if (modem.waitForNetwork()) {
  88. signalLED(5);
  89. // czekanie na internet
  90. if (modem.gprsConnect(apn, user, pass)) {
  91. signalLED(7);
  92. // nie ma tego w bibliotece więc trzeba było samemu to obsłużyć
  93. // jest to zapytanie sieci o czas w sim800
  94. String buf;
  95. modem.sendAT(GF("+CIPGSMLOC=2,1"));
  96. modem.waitResponse(10000L, GF(GSM_NL "+CIPGSMLOC:"));
  97. buf = modem.stream.readStringUntil('\n');
  98. // modem.gprsDisconnect();
  99. buf.trim();
  100. digitalWrite(MOS_GSM, 1);
  101. // przykładowa odpowiedz:
  102. // 0,2018/04/16,15:31:24
  103. digitalWrite(MOS_RTC, 1);
  104. delay(300);
  105. if (!rtc.begin()) {
  106. Serial.println("Problem with connect to RTC");
  107. }
  108. delay(100);
  109. Serial.println(buf);
  110. int year_, month_, day_, hour_, minute_, sec_;
  111. if(7 == sscanf(buf.c_str(), "%d,%d/%d/%d,%d:%d:%d", NULL, &year_, &month_, &day_, &hour_, &minute_, &sec_)) {
  112. signalLED(4);
  113. // nowa zmienna przechowujaca date
  114. DateTime date(year_, month_, day_, hour_, minute_, sec_);
  115. // jak trzeba było w jakis sposob wyrownac godzinę z racji przesunięcia czasu to tu jest gotowych mechanizm
  116. int hour_delay = 2;
  117. date = DateTime(date.unixtime() + hour_delay * 3600L);
  118. Serial.println(date.unixtime());
  119. rtc.adjust(date);
  120. problem = false;
  121. }
  122. digitalWrite(MOS_RTC, 0);
  123. } else {
  124. Serial.println("Problem with connect to GPRS");
  125. }
  126. } else {
  127. Serial.println("Problem with connect to network");
  128. }
  129. // modem.gprsDisconnect();
  130. digitalWrite(MOS_GSM, 1);
  131. return !problem;
  132. }
  133.  
  134. boolean sendData(String getData) {
  135. // Serial.println("wysylanie danych: " + getData);
  136. // return true;
  137. digitalWrite(MOS_GSM, 0);
  138. digitalWrite(RST_GSM, 0);
  139. delay(1000);
  140. digitalWrite(RST_GSM, 1);
  141. delay(1500);
  142. TinyGsm modem(Serial);
  143. modem.restart();
  144. TinyGsmClient client(modem);
  145. HttpClient http(client, server, port);
  146. signalLED(2);
  147. bool problem = false;
  148. if (!modem.waitForNetwork()) {
  149. Serial.println("can not connect to GSM");
  150. problem = true;
  151. } else {
  152. signalLED(3);
  153. if(!modem.gprsConnect(apn, user, pass)) {
  154. Serial.println("can not connect to GPRS");
  155. problem = true;
  156. } else {
  157. signalLED(10);
  158. getData += "&sig=" + String(modem.getSignalQuality());
  159. int error;
  160. if (error = http.get("/?" + getData)) {
  161. Serial.println("can not connect to server " + String(error));
  162. problem = true;
  163. } else {
  164. signalLED(5);
  165. if (!http.responseStatusCode()) {
  166. Serial.println("status code error");
  167. }
  168. }
  169. }
  170. }
  171. http.stop();
  172. // modem.gprsDisconnect();
  173. digitalWrite(MOS_GSM, 1);
  174. Serial.println("GSM finish");
  175. return !problem;
  176. }
  177.  
  178. uint32_t measureDistance() {
  179. digitalWrite(MOS_SONIC, 0);
  180. delay(2000);
  181. uint32_t distance = 401;
  182. for (int x = 0; x < 10; x++) {
  183. digitalWrite(TRIG_PIN, LOW);
  184. delayMicroseconds(2);
  185. digitalWrite(TRIG_PIN, HIGH);
  186. delayMicroseconds(10);
  187. digitalWrite(TRIG_PIN, LOW);
  188. distance = pulseIn(ECHO_PIN, HIGH) / 81;
  189. //jeżeli odległość będzie poprawna (mniejsza niż 400) to wyjdzie z pętli, a jeżeli nie, to powtórzy to (maksymalnie 3 razy)
  190. //jest to potrzebne ze względu na to, że moduł ten posiada zakłucenia przez które czasem podaje kosmiczne odległości
  191. if (distance < 400)
  192. break;
  193. delay(500);
  194. }
  195. digitalWrite(MOS_SONIC, 1);
  196. Serial.println("SONAR finish " + String(distance));
  197. return distance;
  198.  
  199. }
  200.  
  201. void sleep_for(int hour_, int minute_) {
  202. Serial.println("sleep start");
  203. Serial.println("Czas pomiaru - " + String(hour_) + ":" + String(minute_));
  204. DateTime d = getNow();
  205. while (d.hour() != hour_ || (d.hour() == hour_ && d.minute() != minute_)) {
  206. Serial.println("current time " + String(d.hour()) + ":" + String(d.minute()) + ":" + String(d.second()));
  207. Serial.println("waiting for time " + String(hour_) + ":" + String(minute_));
  208. Serial.flush();
  209. delay(100);
  210. for (int x = 0; x < 5; x++) {
  211. LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  212. }
  213. d = getNow();
  214. }
  215. Serial.println("sleep stop");
  216. }
  217.  
  218. String getRaport(float battery1_level, float battery2_level, int day_, int month_, int year_) {
  219. String ret = "dev_id=" + String(DEV_NUM);
  220. ret += "&date=" + String(day_) + "-" + String(month_) + "-" + String(year_);
  221. for (int i = 0; i < numberOfMeasureH; i++) {
  222. String time_ = String(measureHours[i]);
  223. String value = String((int)eeprom_read_dword(EEPROM_START_ADDRESS + (i * 4)));
  224. ret += "&time_" + time_ + "=" + value;
  225. }
  226. ret += "&battery1=" + String(battery1_level);
  227. ret += "&battery2=" + String(battery2_level);
  228. return ret;
  229. }
  230.  
  231. DateTime now;
  232. int hour_;
  233. int minute_;
  234.  
  235. int getNextMeasureIndex() {
  236. DateTime d = getNow();
  237. Serial.print(d.year(), DEC);
  238. Serial.print('/');
  239. Serial.print(d.month(), DEC);
  240. Serial.print('/');
  241. Serial.print(d.day(), DEC);
  242. Serial.println();
  243. Serial.print(d.hour());
  244. Serial.print(":");
  245. Serial.println(d.minute());
  246. for (int i = 0; i < numberOfMeasureH; i++) {
  247. hour_ = measureHours[i] / 100;
  248. minute_ = measureHours[i] % 100;
  249. Serial.println(String(d.hour()) + " " + String(hour_) + " & " + String(d.minute()) + " " + String(minute_));
  250. if(d.hour() < hour_ || (hour_ == d.hour() && d.minute() <= minute_)) {
  251. return i;
  252. }
  253. }
  254. return 0;
  255. }
  256.  
  257.  
  258. void setup() {
  259. Serial.begin(BAUD);
  260. // ustawienie pinów do mosfetów jako wyjścia
  261. pinMode(LED_PIN, OUTPUT);
  262. pinMode(RST_GSM, OUTPUT);
  263. pinMode(MOS_GSM, OUTPUT);
  264. pinMode(MOS_RTC, OUTPUT);
  265. pinMode(MOS_SONIC, OUTPUT);
  266. pinMode(TRIG_PIN, OUTPUT);
  267. pinMode(ECHO_PIN, INPUT);
  268. // wyłączenie modułów
  269. digitalWrite(MOS_GSM, 1);
  270. digitalWrite(MOS_SONIC, 1);
  271. digitalWrite(MOS_RTC, 0);
  272. Serial.println("start");
  273. signalLED(3);
  274.  
  275. while(!setRTCByGSM()) signalLED(10);
  276. signalLED(3000, true);
  277. }
  278.  
  279. void loop() {
  280. Serial.println("loop start");
  281. for (int i = getNextMeasureIndex(); i < numberOfMeasureH; i++) {
  282. hour_ = measureHours[i] / 100;
  283. minute_ = measureHours[i] % 100;
  284. sleep_for(hour_, minute_);
  285. eeprom_write_dword(EEPROM_START_ADDRESS + (i * 4), measureDistance());
  286. now = getNow();
  287. while (i == numberOfMeasureH - 1 && hour_ == now.hour() && minute_ == now.minute()) {
  288. for (int x = 0; x < 5; x++) {
  289. LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  290. }
  291. now = getNow();
  292. }
  293. }
  294. now = getNow();
  295. String raport = getRaport(bat(BATTERY1_PIN), bat(BATTERY2_PIN), now.day(), now.month(), now.year());
  296. for (int i = 0; i < 20; i++) {
  297. if (sendData(raport)) {
  298. signalLED(3000, true);
  299. break;
  300. } else {
  301. signalLED(10);
  302. }
  303. delay(1000);
  304. }
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement