Передача данных на Thingspeak через GPRS shield

Тема в разделе "Проводная и беспроводная связь", создана пользователем lengast, 17 авг 2019.

  1. lengast

    lengast Нуб

    Здравствуйте.
    Мне необходимо отслеживать состояние 2х датчиков и при срабатывании отправлять время срабокти на thingspeak.
    Но записать данные получается очень редко. На 30 попыток может произойти 1 передача.
    Передача данных проивзодится по GPRS используя GPRS-shield от Амперки, на борту которого SIM800C.
    При запуск модуль включается, получает IP сети. Настройки интернета выставлены верно.
    Прошу подсказать где я допустил ошибку.
    Мучаюсь уже 2й день, буду признателен за любой совет.
    Полная версия кода во вложении
    Участвующие в передаче данных ниже:
    Код (C++):
    #include <TroykaRTC.h>
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>
    #include <Wire.h>
    #define SIM900_TX_PIN 4
    #define SIM900_RX_PIN 5
    #define SIM900_POWER_PIN 9
    #define SIM900_BAND 9600
    #define SENSOR_1_PIN 2
    #define SENSOR_2_PIN 8
    #define MIN_SEND_INTERVAL 22    // Максимальная частота отправки запросов на сайт (ограничение thingspeak)
    #define SENSOR_ACTIVE_STATE HIGH //Состояние выхода датчика при сработке
    #define H08M00_H19M30 15    // Интервал 08:00-19:30
    #define H19M30_H22M30 15    // Интервал 19:31-22:30
    #define H22M30_H06M00 60    // Интервал 22:31-06:00
    #define H06M00_H08M00 15    // Интервал 06:01-07:59
    RTC clock;
    String time;
    String date;
    String weekDay;
    // Адрес сайта (не менять)
    char gprs_server[] = "api.thingspeak.com";

    // Ключ для записи на сайт
    String API = "***KWQ1DU3A5KBJE";

    // ВАШ НОМЕР ТЕЛЕФОНА ДЛЯ ЗВОНКОВ
    char phone[] = "+79****";

    //Служебные флаги
    bool vypis = 0;
    bool need_send_info_1 = false;
    bool need_send_info_2 = false;
    bool check1 = false;
    bool check2 = false;
    bool Sensor1State = false;
    bool lastSensor1State = false;
    int SensorCounter1 = 0;
    bool Sensor2State = false;
    bool lastSensor2State = false;
    int SensorCounter2 = 0;

    // Переменная, которая хранит максимальное время между сработками (если за это время датчик не сработал, будет звонок)
    unsigned long max_send_interval = 900;

    // Временная метка последнего звонка
    unsigned long timestamp_call = 0;

    // Служебные флаги
    bool need_calling = false;
    bool block_calling = false;


    GPRS sim900(SIM900_TX_PIN, SIM900_RX_PIN, SIM900_BAND);

    void send_info()
    {
        static unsigned long send_timestamp = millis();

        // Проверка, что шлем не слишком часто и что надо отправлять
        if ((millis() - send_timestamp > MIN_SEND_INTERVAL * 1000) & (need_send_info_1 || need_send_info_2))
        {
            Serial.print("TIMESTAMP ");
            Serial.println(send_timestamp);
            if (!sim900.connect(TCP, gprs_server, 80))
            {
                Serial.println("Connect to server error");
                delay(5000);
            }
            else
            {
                Serial.print("-> Connect to ");
                Serial.print(gprs_server);
                Serial.println(" OK!");
                String url = "GET /update?api_key=";
                Serial.println(url);
                url += API;
                if (need_send_info_1 && need_send_info_2)
                {
                    url += "&field1=1";
                    url += "&field2=1";          
                }
                else if (need_send_info_1)
                {
                    url += "&field1=1";
                }
                else if (need_send_info_2)
                {
                    url += "&field2=1";
                }
                else
                {
                    return;
                }
                url += " HTTP/1.0\r\n\r\n";
                char urlChar[url.length() + 1];
                url.toCharArray(urlChar, url.length() + 1);
                sim900.send(urlChar, url.length());
                char odpoved[512];        
                while (true)
                {          
                    int znaky = sim900.recv(odpoved, sizeof(odpoved) - 1);
                    if (znaky <= 0)
                    {
                        if (vypis)
                        {
                            Serial.println("-> End answer.");
                        }
                        break;
                    }
                    odpoved[znaky] = '\0';
                    if (vypis)
                    {
                        Serial.print("Get: ");
                        Serial.print(znaky);
                        Serial.print(" byte: ");
                        Serial.println(odpoved);
                    }
                }
                sim900.close();
                sim900.disconnect();
                if (need_send_info_1 && need_send_info_2)
                {
                    need_send_info_1 = false;
                    need_send_info_2 = false;
                    timestamp_call = millis();
                    block_calling = false;
                }
                else if (need_send_info_1)
                {
                    need_send_info_1 = false;
                    timestamp_call = millis();
                    block_calling = false;
                }
                else if (need_send_info_2)
                {
                    need_send_info_2 = false;
                }
                send_timestamp = millis();
                Serial.println("-> Disconnect");
             
            }
         
        }
     
    }
    void setup()
    {
        Serial.begin(9600); // Скорость обмена данными с компьютером
        clock.begin();
       // clock.set(__TIMESTAMP__);
        pinMode(SENSOR_1_PIN, INPUT_PULLUP);
        pinMode(SENSOR_2_PIN, INPUT_PULLUP);
     
        if (!sim900.checkPowerUp())
        {
            sim900.powerUpDown(SIM900_POWER_PIN);
        }
     
        Serial.print("SIM900 INIT");
        while (!sim900.init())
        {
            Serial.print(".");
            delay(1000);
        }
        delay(5000);
        Serial.println("OK");
     
        Serial.print("Setting GPRS");
        // Настройки интернета
         while (!sim900.join(F("beeline.internet.ru"), F("beeline"), F("beeline")))
        {
            Serial.print(".");
            delay(2000);
        }
        Serial.print("OK");
     
        Serial.print("IP Adress: ");
        Serial.println(sim900.getIPAddress());
        check_time();
    }

    void loop()
    {
        static unsigned long time_update_stamp = 0;
        //датчик 1//
        Sensor1State = digitalRead(SENSOR_1_PIN);
        if (Sensor1State != lastSensor1State) {
            if (Sensor1State == LOW) {
              check1 = HIGH;
              Serial.println("on sens1");
              delay(25);
            }
            else {
              check1 = LOW;
            }
            delay(25);
            Serial.println(check1);
            }
      lastSensor1State = Sensor1State;
      if (check1 == HIGH) {
          need_send_info_1 = true;
          Serial.println("Сработал датчик 1");
          Serial.println(need_send_info_1);
          delay(50);
          }
      else
         
        //датчик 2//
      Sensor2State = digitalRead(SENSOR_2_PIN);
      if (Sensor2State != lastSensor2State) {
        if (Sensor2State == LOW) {
          check2 = HIGH;
          Serial.println("on sens2");
          delay(50);
        }
        else {
          check2 = LOW;
        }
        delay(50);
        Serial.println(check2);
      }
      lastSensor2State = Sensor2State;
      if (check2 == HIGH) {
        need_send_info_2 = true;
        Serial.println("Сработал датчик 2");
        Serial.println(need_send_info_2);
      }
        // Проверяем и если надо отправляем данные
        send_info();

        // Если превышен предел максимального времени сработки ставим флаг, что надо звонить
        if (millis() - timestamp_call > max_send_interval * 1000 && !block_calling)
        {
            need_calling = true;
        }
        else
        {
            need_calling = false;
        }

        // Делаем звонок
        calling();

        // Обновляем данные о значении максимального времени сработки каждую минуту в зависимости от времени
        if (millis() - time_update_stamp > 60000)
        {
            check_time();
            time_update_stamp = millis();
        }

        // Чтобы дать время подумать
        delay(300);
    }
     

    Вложения:

    • help.ino
      Размер файла:
      11,1 КБ
      Просмотров:
      382
    Последнее редактирование: 18 авг 2019
  2. ИгорьК

    ИгорьК Гуру