Gprs-логгер для теплицы

Доброго времени всем. Пытаюсь повторить проект из вики Амперки. projects:gprslogger
Плата UNO, GPRS Шилд от амперки. Библиотеки из проекта. подведено доп.питание.
При подаче питания ардуина подключается к сети, успешно передает данные в народный монитор и отключает шилд (горит красный светодиод) через 100000мс включает повторно и зависает.
вот что происходит в мониторе
19:49:54.546 → Test on AT comand
19:49:54.546 → Test on AT+CFUN=1 comand
19:49:56.148 → Test on AT+CNMI? comand
19:49:57.683 → Test on AT+CNMI=2,2,0,0,0 comand
19:49:57.751 → Test on AT+CMGF?
19:49:59.282 → Test on AT+CMGF=1
19:49:59.316 → Test on AT+CLIP=1
19:49:59.350 → GPRS init success
19:50:09.918 → GPRS OK
19:50:09.918 → IP Address is 0.215.236.95
19:50:14.719 → Connect success
19:50:14.753 → temp = 24
19:50:14.753 → humi = 63
19:50:14.753 → moisture = 100
19:50:14.787 → light = 264
19:50:14.787 →
19:50:27.118 → OK
19:51:37.534 → Test on AT comand
19:51:37.534 → Test on AT+CFUN=1 coman

почему думаю, что зависает? последнее слово “comand” прописано не полностью. плюс если менять скорость обмена ардуины с шилдом, зависает в разных местах
Ардуину менял, тоже самое. в чем может быть проблема? в каком направлении копать
используемый скетч

#include <GPRS_Shield_Arduino.h>
#include <sim900.h>

// библиотека для работы с GPRS устройством
#include <GPRS_Shield_Arduino.h>

// библиотека для эмуляции Serial-порта
// она нужна для работы библиотеки GPRS_Shield_Arduino
#include <SoftwareSerial.h>

// библиотека для работы с датчиком DHT11
#include <dht11.h>

// даём разумное имя для пина к которому подключен датчик DHT11
#define DHT11_PIN 9
// даём разумное имя для пина к которому подключен датчик влажности почвы
#define MOISTURE_PIN A0
// даём разумное имя для пина к которому подключен датчик уровня CO2
//#define MQ2_PIN A2
// даём разумное имя для пина к которому подключен датчик уровня освещённости
#define LIGHT_PIN A4

// IMEI GPRS Shield, он указан на лицевой стороне шилда
// по IMEI устройство будет идентифицироваться в проекте
// поэтому он должен быть уникальным
#define IMEI "867157044409639"

// часть запроса в специальном формате для народного мониторинга, содержащая:
// IMEI устройства, название фирмы и GPS-координаты
#define CLIENT "#"IMEI"#bioagro#55.6689#49.2140#2.0\r\n"

// интервал между отправками данных в миллисекундах (5 минут)
#define INTERVAL 100000 

// размер массива, содержащий TCP-запрос
#define LEN 370
// буфер для отправки данных на народный мониторинг
// согласно установленной сервисом форме
char tcpBuffer[LEN];

// переменная для хранения времени работы программы
// с последнего запуска отправки данных на сервер
unsigned long previousMillis = 0;

// переменная температуры воздуха
int temp = 0;
// переменная влажности воздуха
int humi = 0;
// переменная влажности почвы
int moisture = 0;
// переменная уровня CO2
// int mq2 = 0;
// переменная уровня освещённости
int light = 0;

// создаём объект класса dht11
dht11 DHT;

// Создаем обьект Serial1
SoftwareSerial Serial_s(10, 11); // RX, TX
// создаём объект класса GPRS и передаём в него объект Serial1 
GPRS gprs(Serial_s);
// можно указать дополнительные параметры — пины PK и ST
// по умолчанию: PK = 2, ST = 3
// GPRS gprs(Serial1, 2, 3);

void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(9600);
  // открываем Serial-соединение с GPRS Shield
  Serial_s.begin(9600);
}

void loop()
{
  // включаем GPRS шилд
  gprs.powerOn();
  // проверяем есть ли связь с GPRS устройством
  while (!gprs.init()) {
    // если связи нет, ждём 1 секунду
    // и выводим сообщение об ошибке
    // процесс повторяется в цикле
    // пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("GPRS Init error\r\n");
  }
  // вывод об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");
  delay(3000);

  // пытаемся установить GPRS-соединение
  // с заданными настройками, которые предоставляются операторами связи
  while (!gprs.join("internet.mts.ru", "mts", "mts")) {
    // если GPRS-соединения нет
    // выводим сообщение об ошибке и ждём 1 секунду
    // процесс повторяется в цикле
    // пока не появится положительный ответ от GPRS устройства
    Serial.println("Gprs join network error");
    delay(1000);
  }
  // выводим сообщение об удачной установке GPRS-соединения
  Serial.println("GPRS OK");

  // получаем  и выводим локальный IP адрес
  Serial.print("IP Address is ");
  Serial.println(gprs.getIPAddress());

  // пытаемся подключиться к серверу
  // указывая тип соединения, адрес сервера и номер порта
  while (!gprs.connect(TCP, "narodmon.ru", 8283)) {
    // если сервер не отвечает или отвечает ошибкой
    // выводим сообщение об ошибке и ждём 1 секунду
    // процесс повторяется в цикле
    // пока не появится положительный ответ от сервера
      Serial.println("Connect error");
      delay(1000);
  }
  // выводим сообщение об удачном подключении к серверу
  Serial.println("Connect success");

  // вызываем функцию считывания всех показателей с датчиков
  readSensors();
  // выводим показания датчиков в последовательный порт
  serialPrint();
  // вызываем функцию, которая формирует и отправляет tcp-запрос
  // в специальном формате для «народного мониторинга»
  tcpRequest();
  // разрываем все GPRS-соединения
  gprs.close();
  // деактивируем интерфейс GPRS
  gprs.disconnect();
  // выводим сообщение об удачном завершении операции
  Serial.println("OK");
  // выключаем GPRS-шилд
  gprs.powerOff();

  // проверяем не прошел ли нужный интервал времени
  while (millis() - previousMillis < INTERVAL) {
  // ждём 5 минут
  }
  //если прошел, то сохраняем текущее время
  previousMillis = millis();
}

// функция записи данных с датчиков в массив
// в специальном формате для «народного мониторинга»
void tcpRequest()
{
   /* помните, что при выполнении операций 
   с массивами символов, например strcat(str1, str2);
   контроль нарушения их границ не выполняется, 
   поэтому программист должен сам позаботиться
   о достаточном размере массива str1,
   позволяющем вместить как его исходное содержимое,
   так и содержимое массива str2
  */

  // добавляем к строке tcpBuffer строку CLIENT
  strcat(tcpBuffer, CLIENT);
  // функция добавления в TCP-запрос значения температуры воздуха
  tcpTemp();
  // функция добавления в TCP-запрос значения влажности воздуха
  tcpHumi();
  // функция добавления в TCP-запрос значения влажности почвы
  tcpMoisture();
  // функция добавления в TCP-запрос состояния уровня CO2
  //tcpGas();
  // функция добавления в TCP-запрос значения освещённости
  tcpLight();

  // добавляем к строке tcpBuffer два символа «##»,
  // которые свидетельствуют об окончании запроса
  strcat(tcpBuffer, "##");

  // отправляем массив TCP-запроса на сервис «народного мониторинга»
  gprs.send(tcpBuffer);

  // очищаем буфер
  clearTcpBuffer();
}

// Функция добавление в TCP-запрос данные о температуре воздуха
void tcpTemp()
{
  // переменная для символьного представления
  // значения температуры воздуха
  char s_temp[8];
  // преобразуем целое число 10 системы исчисления
  // из переменной temp в строковое представление в массив s_temp[]
  itoa(temp, s_temp, 10);
  // добавляем к буферу символы «.00», для дробной части
  strcat(s_temp, ".00");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу уникальный серийный номера датчика
  // получаем его путём добавления к IMEI GPRS-шилда названия датчика
  strcat(tcpBuffer, IMEI);
  strcat(tcpBuffer, "T01");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
   // добавляем к буферу строку s_temp
  strcat(tcpBuffer, s_temp);
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу время актуальности показаний
  // если показания датчиков передаются немедленно,
  // то данный параметр передавать не надо
  strcat(tcpBuffer, " ");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу названия датчика
  strcat(tcpBuffer, "Датчик температуры");
  strcat(tcpBuffer, "\r\n");
}

// Функция добавление в TCP-запрос данные о влажности воздуха
void tcpHumi()
{
  // переменная для символьного представления
  // значения влажности воздуха
  char s_humi[8];
  // преобразуем целое число 10 системы исчисления
  // из переменной humi в строковое представление в массив s_humi[]
  itoa(humi, s_humi, 10);
  // добавляем к буферу символы «.00», для дробной части
  strcat(s_humi, ".00");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу уникальный серийный номера датчика
  // получаем его путём добавления к IMEI GPRS-шилда названия датчика
  strcat(tcpBuffer, IMEI);
  strcat(tcpBuffer, "H01");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
   // добавляем к буферу строку s_humi
  strcat(tcpBuffer, s_humi);
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу время актуальности показаний
  // если показания датчиков передаются немедленно,
  // то данный параметр передавать не надо
  strcat(tcpBuffer, " ");
  strcat(tcpBuffer, "#");
  // добавляем к буферу названия датчика
  strcat(tcpBuffer, "Датчик влажности");
  strcat(tcpBuffer, "\r\n");
}

void  tcpMoisture()
{
  // переменная для символьного представления
  // значения влажности почвы
  char s_moisture[8];
  // преобразуем целое число 10 системы исчисления 
  // из переменной moisture в строковое представление в массив s_moisture[]
  itoa(moisture, s_moisture, 10);
  // добавляем к буферу символы «.00», для дробной части
  strcat(s_moisture, ".00");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу уникальный серийный номера датчика
  // получаем его путём добавления к IMEI GPRS-шилда названия датчика
  strcat(tcpBuffer, IMEI);
  strcat(tcpBuffer, "H02");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
   // добавляем к буферу строку s_moisture
  strcat(tcpBuffer, s_moisture);
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу время актуальности показаний
  // если показания датчиков передаются немедленно,
  // то данный параметр передавать не надо
  strcat(tcpBuffer, " ");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу названия датчика
  strcat(tcpBuffer, "Датчик влажности почвы");
  strcat(tcpBuffer, "\r\n");
}

//void  tcpGas()
//{
  // переменная для символьного представления значения CO2
  //char s_mq2[8];
  // преобразуем целое число 10 системы исчисления
  // из переменной mq2 в строковое представление в массив s_mq2[]
  //itoa(mq2, s_mq2, 10);
  // добавляем к буферу символы «.00», для дробной части
  //strcat(s_mq2, ".00");
  // добавляем к буферу разделительный символ «#»
  //strcat(tcpBuffer, "#");
  // добавляем к буферу уникальный серийный номера датчика
  // получаем его путём добавления к IMEI GPRS-шилда названия датчика
  //strcat(tcpBuffer, IMEI);
  //strcat(tcpBuffer, "MQ2");
  // добавляем к буферу разделительный символ «#»
  //strcat(tcpBuffer, "#");
   // добавляем к буферу строку s_gas
  //strcat(tcpBuffer, s_mq2);
  // добавляем к буферу разделительный символ «#»
  //strcat(tcpBuffer, "#");
  // добавляем к буферу время актуальности показаний
  // если показания датчиков передаются немедленно,
  // то данный параметр передавать не надо
  //strcat(tcpBuffer, " ");
  // добавляем к буферу разделительный символ «#»
  //strcat(tcpBuffer, "#");
  // добавляем к буферу названия датчика
  //strcat(tcpBuffer, "Датчик CO2");
  //strcat(tcpBuffer, "\r\n");
//}

void  tcpLight()
{
  // переменная для символьного представления значения освещённости
  char s_light[8];
  // преобразуем целое число 10 системы исчисления
  // из переменной light в строковое представление в массив s_light[]
  itoa(light, s_light, 10);
  // добавляем к буферу символы «.00», для дробной части
  strcat(s_light, ".00");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу уникальный серийный номера датчика
  // получаем его путём добавления к IMEI GPRS-шилда названия датчика
  strcat(tcpBuffer, IMEI);
  strcat(tcpBuffer, "L01");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
   // добавляем к буферу строку s_light
  strcat(tcpBuffer, s_light);
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу время актуальности показаний
  // если показания датчиков передаются немедленно,
  // то данный параметр передавать не надо
  strcat(tcpBuffer, " ");
  // добавляем к буферу разделительный символ «#»
  strcat(tcpBuffer, "#");
  // добавляем к буферу названия датчика
  strcat(tcpBuffer, "Датчик освещения");
  strcat(tcpBuffer, "\r\n");
}

// функция считывания показателей с датчиков
void readSensors()
{
  // считывание данных с датчика DHT11
  DHT.read(DHT11_PIN);
  // присваивание переменной temp значения температуры воздуха
  temp = DHT.temperature;
  // присваивание переменной humi значения влажности воздуха
  humi = DHT.humidity;
  // считывание значения с датчика влажности почвы
  moisture = analogRead(MOISTURE_PIN);
  // считывание значения с датчика уровня CO2
  //mq2 = analogRead(MQ2_PIN);
  // считывание значения с датчика уровня освещённости
  light = analogRead(LIGHT_PIN);

  // преобразовываем аналоговое 10-битное значение
  // датчика влажности почвы в диапазон (от 0% до 100%)
  moisture = map(moisture, 0, 1023, 0, 100);
  // преобразовываем аналоговое 10-битное значение
  // датчика уровня CO2 в диапазон (от 0ppm до 8000ppm)
  //mq2 = map(mq2, 0, 1023, 0, 8000);
  // преобразовываем аналоговое 10-битное значение
  // датчика уровня освещённости в диапазон (от 0Lx до 2000Lx)
  light = map(light, 0, 1023, 2000, 0);
}
void clearTcpBuffer()
{
  for (int t = 0; t < LEN; t++) {
    // очищаем буфер,
    // присваивая всем индексам массива значение 0
    tcpBuffer[t] = 0;
  }
}

// функция вывода значения датчиков в последовательный порт
void  serialPrint()
{
  Serial.print("temp = ");
  Serial.println(temp);
  Serial.print("humi = ");
  Serial.println(humi);
  Serial.print("moisture = ");
  Serial.println(moisture);
  //Serial.print("CO2 = ");
  //Serial.println(mq2);
  Serial.print("light = ");
  Serial.println(light);
  Serial.println("");
}

Добавь в setup() последней строкой такое:

Serial.println("GPRS Start Init");

Тогда если эта фраза будет появляться несколько раз - значит перезагружается.

Питания модему не хватает. На вход ему пару электролитов на 1000 мкФ поставь и все будет хорошо.

а зачем не эта инфа? я по индикаторам вижу что нет, висит

на вход по питанию? запаралелить на разьеме питания ардуины?

Ты давай не спорь, а делай что говорят. А то выгоним.
Ты на Амперке уже две недели всем мозг выносишь. Если нет таланта к электронике - так хоть других слушай.

1 лайк

нет, не появляется
23:22:50.954 → GPRS Start Init
23:22:54.941 → Test on AT comand
23:22:54.941 → Test on AT+CFUN=1 comand
23:22:56.541 → Test on AT+CNMI? comand
23:22:58.096 → Test on AT+CNMI=2,2,0,0,0 comand
23:22:58.130 → Test on AT+CMGF?
23:22:59.684 → Test on AT+CMGF=1
23:22:59.717 → Test on AT+CLIP=1
23:22:59.752 → GPRS init success
23:23:10.350 → GPRS OK
23:23:10.350 → IP Address is 0.225.32.231
23:23:13.857 → Connect success
23:23:13.891 → temp = 22
23:23:13.891 → humi = 56
23:23:13.891 → moisture = 100
23:23:13.925 → light = 227
23:23:13.925 →
23:23:18.431 → OK
23:24:37.928 → Test on AT comand
23:24:37.928 → Test on AT+CFUN=1 coman

запараллелить на входе питания модема. Ему много тока надо при установлении сессии.
А так же рекомендую аппаратный уарт использовать для работы с модемом, а логи выводить в программный порт.

опыта нет. мне бы так, как есть, сначала запустить

на шилде нет отдельного разьема питания. питание через пины. паралелить “gnd” с “5v” или “Vin”? или не важно?

покажите схему всех подключений, включая питание, с указанием всех пинов, что куда подключено

Напомнило

  • Машина не заводится…
  • Бензин заливал?
  • Заливал, не помогло. Сейчас слил, мне бы так, как есть, сначала запустить…
1 лайк

на шилде нет отдельного разьема питания. питание через пины. паралелить “gnd” с “5v” или “Vin”? или не важно?

“неважно” пишется слитно в этом данном случае. Вопрос твой туп по существу, иди в школу еще раз.

иди в школу еще раз учись, начиная с 5 класса советского общего образования. там основы оптики и электротехники будут, не пропусти.


перемычки на шилде RX - D11 и TX - D10

Питание 5в откуда берется?

к чему это позерство, делать нечего? я сюда за помощью пришел к опытным людям. я пока не знаю как лучше запитывать от 5в к 5V или через Vin напругой 7-12в, может есть разница о которой ВЫ знаете, а я нет. поэтому и спрашиваю, я хочу разобраться. а вы банально нахер шлете, умничая про школу. вот так вот и отбивают охоту что то делать мастерить…

ЮСБ зарядник, 2А выдает

получается шилд не стартует, а как же тогда прошла команда “Тest on AT comand”?

Спросите у авторов библиотеки.