Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define TINY_GSM_MODEM_SIM800
- #include <TinyGsmClient.h>
- #include <ArduinoHttpClient.h>
- #include <LowPower.h>
- #include <RTClib.h>
- #include <EEPROM.h>
- #define LED true
- #define T(x) ((x[0]-'0')*1000 + (x[1]-'0')*100 + (x[3]-'0')*10 + x[4]-'0')
- const int DEV_NUM = 1;
- const int MOS_RTC = 4;
- const int MOS_GSM = 5;
- const int RST_GSM = 7;
- const int MOS_SONIC = 6;
- const int MOS_ARDUINO = 8;
- const int LED_PIN = 13;
- const int BATTERY1_PIN = A2;
- const int BATTERY2_PIN = A3;
- const int ECHO_PIN = 2;
- const int TRIG_PIN = 3;
- const int EEPROM_START_ADDRESS = 100;
- const char *apn = "internet";
- const char *user = "internet";
- const char *pass = "internet";
- String server = "testakcelero.cba.pl";
- const int port = 80;
- // format czasu "HH:MM"
- const uint16_t measureHours[] = {
- T("19:25"),
- T("19:27")
- };
- const uint16_t numberOfMeasureH = sizeof(measureHours)/sizeof(measureHours[0]);
- const uint32_t BAUD = 115200;
- RTC_DS3231 rtc;
- void signalLED(uint32_t num, boolean longTime = false) {
- if (!LED)
- return;
- if (longTime) {
- digitalWrite(LED_PIN, 1);
- delay(num);
- digitalWrite(LED_PIN, 0);
- } else {
- for (int i = 0; i < num; i++) {
- digitalWrite(LED_PIN, 1);
- delay(600);
- digitalWrite(LED_PIN, 0);
- delay((i == num - 1) ? 0 : 300);
- }
- }
- }
- float bat(int pin) {return (map(analogRead(pin), 0, 1023, 0, 500) / 100.0);}
- DateTime getNow() {
- digitalWrite(MOS_RTC, 1);
- delay(100);
- Serial.println("RTC start");
- if (!rtc.begin()){
- Serial.println("problem with RTC 1");
- exit(1);
- }
- DateTime now = rtc.now();
- Serial.println("RTC finish");
- digitalWrite(MOS_RTC, 0);
- return now;
- }
- boolean setRTCByGSM() {
- // inicjalizacja potrzebnych obiektów
- Serial.println("GSM start");
- digitalWrite(MOS_GSM, 0);
- digitalWrite(RST_GSM, 0);
- delay(1000);
- digitalWrite(RST_GSM, 1);
- delay(1500);
- TinyGsm modem(Serial);
- modem.restart();
- boolean problem = true;
- // czekanie na sieć GSM
- if (modem.waitForNetwork()) {
- signalLED(5);
- // czekanie na internet
- if (modem.gprsConnect(apn, user, pass)) {
- signalLED(7);
- // nie ma tego w bibliotece więc trzeba było samemu to obsłużyć
- // jest to zapytanie sieci o czas w sim800
- String buf;
- modem.sendAT(GF("+CIPGSMLOC=2,1"));
- modem.waitResponse(10000L, GF(GSM_NL "+CIPGSMLOC:"));
- buf = modem.stream.readStringUntil('\n');
- // modem.gprsDisconnect();
- buf.trim();
- digitalWrite(MOS_GSM, 1);
- // przykładowa odpowiedz:
- // 0,2018/04/16,15:31:24
- digitalWrite(MOS_RTC, 1);
- delay(300);
- if (!rtc.begin()) {
- Serial.println("Problem with connect to RTC");
- }
- delay(100);
- Serial.println(buf);
- int year_, month_, day_, hour_, minute_, sec_;
- if(7 == sscanf(buf.c_str(), "%d,%d/%d/%d,%d:%d:%d", NULL, &year_, &month_, &day_, &hour_, &minute_, &sec_)) {
- signalLED(4);
- // nowa zmienna przechowujaca date
- DateTime date(year_, month_, day_, hour_, minute_, sec_);
- // jak trzeba było w jakis sposob wyrownac godzinę z racji przesunięcia czasu to tu jest gotowych mechanizm
- int hour_delay = 2;
- date = DateTime(date.unixtime() + hour_delay * 3600L);
- Serial.println(date.unixtime());
- rtc.adjust(date);
- problem = false;
- }
- digitalWrite(MOS_RTC, 0);
- } else {
- Serial.println("Problem with connect to GPRS");
- }
- } else {
- Serial.println("Problem with connect to network");
- }
- // modem.gprsDisconnect();
- digitalWrite(MOS_GSM, 1);
- return !problem;
- }
- boolean sendData(String getData) {
- // Serial.println("wysylanie danych: " + getData);
- // return true;
- digitalWrite(MOS_GSM, 0);
- digitalWrite(RST_GSM, 0);
- delay(1000);
- digitalWrite(RST_GSM, 1);
- delay(1500);
- TinyGsm modem(Serial);
- modem.restart();
- TinyGsmClient client(modem);
- HttpClient http(client, server, port);
- signalLED(2);
- bool problem = false;
- if (!modem.waitForNetwork()) {
- Serial.println("can not connect to GSM");
- problem = true;
- } else {
- signalLED(3);
- if(!modem.gprsConnect(apn, user, pass)) {
- Serial.println("can not connect to GPRS");
- problem = true;
- } else {
- signalLED(10);
- getData += "&sig=" + String(modem.getSignalQuality());
- int error;
- if (error = http.get("/?" + getData)) {
- Serial.println("can not connect to server " + String(error));
- problem = true;
- } else {
- signalLED(5);
- if (!http.responseStatusCode()) {
- Serial.println("status code error");
- }
- }
- }
- }
- http.stop();
- // modem.gprsDisconnect();
- digitalWrite(MOS_GSM, 1);
- Serial.println("GSM finish");
- return !problem;
- }
- uint32_t measureDistance() {
- digitalWrite(MOS_SONIC, 0);
- delay(2000);
- uint32_t distance = 401;
- for (int x = 0; x < 10; x++) {
- digitalWrite(TRIG_PIN, LOW);
- delayMicroseconds(2);
- digitalWrite(TRIG_PIN, HIGH);
- delayMicroseconds(10);
- digitalWrite(TRIG_PIN, LOW);
- distance = pulseIn(ECHO_PIN, HIGH) / 81;
- //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)
- //jest to potrzebne ze względu na to, że moduł ten posiada zakłucenia przez które czasem podaje kosmiczne odległości
- if (distance < 400)
- break;
- delay(500);
- }
- digitalWrite(MOS_SONIC, 1);
- Serial.println("SONAR finish " + String(distance));
- return distance;
- }
- void sleep_for(int hour_, int minute_) {
- Serial.println("sleep start");
- Serial.println("Czas pomiaru - " + String(hour_) + ":" + String(minute_));
- DateTime d = getNow();
- while (d.hour() != hour_ || (d.hour() == hour_ && d.minute() != minute_)) {
- Serial.println("current time " + String(d.hour()) + ":" + String(d.minute()) + ":" + String(d.second()));
- Serial.println("waiting for time " + String(hour_) + ":" + String(minute_));
- Serial.flush();
- delay(100);
- for (int x = 0; x < 5; x++) {
- LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
- }
- d = getNow();
- }
- Serial.println("sleep stop");
- }
- String getRaport(float battery1_level, float battery2_level, int day_, int month_, int year_) {
- String ret = "dev_id=" + String(DEV_NUM);
- ret += "&date=" + String(day_) + "-" + String(month_) + "-" + String(year_);
- for (int i = 0; i < numberOfMeasureH; i++) {
- String time_ = String(measureHours[i]);
- String value = String((int)eeprom_read_dword(EEPROM_START_ADDRESS + (i * 4)));
- ret += "&time_" + time_ + "=" + value;
- }
- ret += "&battery1=" + String(battery1_level);
- ret += "&battery2=" + String(battery2_level);
- return ret;
- }
- DateTime now;
- int hour_;
- int minute_;
- int getNextMeasureIndex() {
- DateTime d = getNow();
- Serial.print(d.year(), DEC);
- Serial.print('/');
- Serial.print(d.month(), DEC);
- Serial.print('/');
- Serial.print(d.day(), DEC);
- Serial.println();
- Serial.print(d.hour());
- Serial.print(":");
- Serial.println(d.minute());
- for (int i = 0; i < numberOfMeasureH; i++) {
- hour_ = measureHours[i] / 100;
- minute_ = measureHours[i] % 100;
- Serial.println(String(d.hour()) + " " + String(hour_) + " & " + String(d.minute()) + " " + String(minute_));
- if(d.hour() < hour_ || (hour_ == d.hour() && d.minute() <= minute_)) {
- return i;
- }
- }
- return 0;
- }
- void setup() {
- Serial.begin(BAUD);
- // ustawienie pinów do mosfetów jako wyjścia
- pinMode(LED_PIN, OUTPUT);
- pinMode(RST_GSM, OUTPUT);
- pinMode(MOS_GSM, OUTPUT);
- pinMode(MOS_RTC, OUTPUT);
- pinMode(MOS_SONIC, OUTPUT);
- pinMode(TRIG_PIN, OUTPUT);
- pinMode(ECHO_PIN, INPUT);
- // wyłączenie modułów
- digitalWrite(MOS_GSM, 1);
- digitalWrite(MOS_SONIC, 1);
- digitalWrite(MOS_RTC, 0);
- Serial.println("start");
- signalLED(3);
- while(!setRTCByGSM()) signalLED(10);
- signalLED(3000, true);
- }
- void loop() {
- Serial.println("loop start");
- for (int i = getNextMeasureIndex(); i < numberOfMeasureH; i++) {
- hour_ = measureHours[i] / 100;
- minute_ = measureHours[i] % 100;
- sleep_for(hour_, minute_);
- eeprom_write_dword(EEPROM_START_ADDRESS + (i * 4), measureDistance());
- now = getNow();
- while (i == numberOfMeasureH - 1 && hour_ == now.hour() && minute_ == now.minute()) {
- for (int x = 0; x < 5; x++) {
- LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
- }
- now = getNow();
- }
- }
- now = getNow();
- String raport = getRaport(bat(BATTERY1_PIN), bat(BATTERY2_PIN), now.day(), now.month(), now.year());
- for (int i = 0; i < 20; i++) {
- if (sendData(raport)) {
- signalLED(3000, true);
- break;
- } else {
- signalLED(10);
- }
- delay(1000);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement