Градусник с дисплеем и авто поливом+СМС

Надергал отовсюду код и попытался создать устройство для бани чтобы смотреть какая в ней влажность и температура, но решил при этом чтобы устройство ещё автоматически поливала грядки с огурцами и писала мне смс по запросу о влажности почвы под огурцами.
Итог автополивалка и дисплей работают, но смс мне в ответ так и не приходят.
Что я делаю не так?

#include "TM1637.h"
#include "DHT.h"
//#include "SIM900.h"
#include <Wire.h>
#include <SoftwareSerial.h>

#define Rele             10       // Пин на реле
#define CLK              12
#define DIO              13
#define pinPower         A0       // Пин датчика напряжения
#define DHTPin           A1       // Пин датчика DHT22
#define pinSensor        A5       // Пин датчика влажности почвы HM-390

#define pinSensor_MIN   250
#define pinSensor_MAX   600
#define INTERVAL      10000 * 3
#define DHTTYPE       DHT22

unsigned int humidity = 0;
unsigned long waitTime = 0;

char incomingByte;
String inputString;

float t;      // Температура
float h;      // Влажность воздуха
float p;      // Влажность почвы

SoftwareSerial mySerial(7, 8);     // пины RX:TX
TM1637 tm1637(CLK, DIO);           // Дисплей HW-069
DHT dht(DHTPin, DHTTYPE);

void setup() {
  pinMode(Rele, OUTPUT);
  digitalWrite(Rele, HIGH);

  pinMode(9, OUTPUT);           // Атозапуск SIM900 при первом всключении
  digitalWrite(9, LOW);
  delay(1000);
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
  delay(3000);

  Serial.begin(9600);
  mySerial.begin(9600);

  while (!mySerial.available()) {     // Зацикливаем и ждем инициализацию SIM900
    mySerial.println("AT");           // Отправка команды AT
    delay(1000);                      // Пауза
    Serial.println("Connecting...");  // Печатаем текст
  }
  Serial.println("Connected!");           // Печатаем текст
  mySerial.println("AT+CMGF=1");          // Отправка команды AT+CMGF=1
  delay(1000);                            // Пауза
  mySerial.println("AT+CNMI=1,2,0,0,0");  // Отправка команды AT+CNMI=1,2,0,0,0
  delay(1000);                            // Пауза
  mySerial.println("AT+CMGL=\"REC UNREAD\"");

  delay(1000);

  tm1637.init();

  dht.begin();                // запускаем датчик DHT22
  tm1637.set(BRIGHTEST);
}

void loop() {
  int Temperature = dht.readTemperature();
  int Humidity = dht.readHumidity();
  int valueSensor = analogRead(pinSensor);

  if (mySerial.available()) {  // Проверяем, если есть доступные данные
    delay(100);                // Пауза

    while (mySerial.available()) {     // Проверяем, есть ли еще данные.
      incomingByte = mySerial.read();  // Считываем байт и записываем в переменную incomingByte
      inputString += incomingByte;     // Записываем считанный байт в массив inputString
    }

    delay(10);                    // Пауза
    Serial.println(inputString);  // Отправка в "Мониторинг порта" считанные данные
    inputString.toUpperCase();    // Меняем все буквы на заглавные

    if (inputString.indexOf("DATA") > -1) {
      p = (pinSensor);
      DHT dht(DHTPin, DHTTYPE);
      t = dht.readTemperature();
      h = dht.readHumidity();

      sms(String("Temperature: " + String(t) + " *C " + " Humidity: " + String(h) + " Pochva: " + String(p)), String("+792xxxxxxxxxx"));
    }

    delay(50);
    if (inputString.indexOf("OK") == -1) {
      mySerial.println("AT+CMGDA=\"DEL ALL\"");
      delay(1000);
    }

    inputString = "";
  }

  Serial.println(valueSensor);
  if (isnan(Humidity) || isnan(Temperature)) {
    Serial.println(F("Oshibka"));
    return;
  }

  int digitoneT = Temperature / 10;
  int digittwoT = Temperature % 10;

  int digitoneH = Humidity / 10;
  int digittwoH = Humidity % 10;

  tm1637.display(1, digitoneT);
  tm1637.display(2, digittwoT);
  tm1637.display(3, 12);

  delay(5000);

  tm1637.display(1, digitoneH);
  tm1637.display(2, digittwoH);
  tm1637.display(3, 15);

  delay(5000);

  Serial.print(F("Vlaga: "));
  Serial.print(Humidity);
  Serial.print(F(" %\t"));
  Serial.print(F("Temperatur: "));
  Serial.print(Temperature);
  Serial.println(F(" °C "));

  int humidityNow = analogRead(pinSensor);

  if (humidityNow != humidity) {
    humidity = humidityNow;
  }
  if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < pinSensor_MIN) {
    digitalWrite(Rele, LOW);
    delay(8000 * 2);
    digitalWrite(Rele, HIGH);
    waitTime = millis();
  }
}

void sms(String text, String phone)  // Процедура Отправка SMS
{
  Serial.println("SMS send started");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000);
}

Схема где?

А не слишком универсальное “устройство для бани”?

не, еще массаж пяточек с мёдом должно уметь делать, а в нём этого пока нет

Конечно можно просто ещё одну плату купить и на неё залить готовый скетч. Потом отдельную плату для полива и отдельную для градусника.
Когда всё это можно сделать в одном устройстве.

Могу фото отправить подойдет?

можно, при соответствующем уровне знаний/опыта, начните с отдельных устройств.

и как, получается?

Все устройства есть укомплектованы и подключены они полностью рабочие(Вывод данных на дисплей и авто полив).
При подключении модуля GSM-связи не отправляться смс с ответом это единственная проблема.

В процессе разработки.

У вас в коде полно ляпов, но об этом позже.
На тему СМС - сделайте маленький скетч, где будет только вот эта функция

и скажите, приходит ли СМС

99,9% начинают так - ведь “ардуино - это прсто”. Я не исключение. Но когда дело доходит до практической реализации - либо не работает, либо работает не так.
Года три (нерегулярного) изучения языка - и я смог более-менее совладать с sim 800.

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

2 лайка

Приходит СМС если не используется часть кода связанного с вывод значений датчиков на дисплей, так же выводом данных температуры, влажности, влажности почвы в мониторинг порта.

Ну так тогда начните с того кода, который отправляет смс, и ПОСТЕПЕННО добавляйте в него возможности пока смс не перестанут приходить. Тогда будете знать, что именно конфликтует с этими смс.
Да, и по мере усложнения скетча контролируйте расход памяти, хотя бы той, что указывает компилятор.

1 лайк

ну потому что, как я уже сказал - у вас в коде полно бредятины.

Вот возьмем хоть этот кусок

что вы хотели сказать второй строчкой.? напомню, что pinSensor - это номер пина датчика почвы. НОМЕР! Не данные с датчика, а просто номер пина - в вашем случае А5. Нафига вы его приравниваете переменной, которую потом выводите в СМС как значение влажности? - что за бред?

Далее - третья строка - вы зачем-то создаете еще один обьект для датчика DHT. С какой целью? У вас уже есть один, причем именно с этим же именем. Почему вы его не используете?

Третья и четвертая строка - запрос температуры и влажности. Опять же - зачем? - вы их уже запросили в первых строках процедуры ЛУП. С тех пор прошла вряд ли больше десятка секунд. Думаете они поменялись?

Итог - маленький кусок, но ни одной строки без ошибки или бессмысленного действия.
И так по всему коду.

2 лайка

Получается я должен сделать отдельную команду на отправку данных с датчика влажности почвы типа так?

if (inputString.indexOf("DATA") > -1) {
      DHT dht(DHTPin, DHTTYPE);
      t = dht.readTemperature();
      h = dht.readHumidity();

if (inputString.indexOf("DATA1") > -1) 
p = (pinSensor);

 sms(String("Temperature: " + String(t) + " *C " + " Humidity: " + String(h) + " Pochva: " + String(p)), String("+792ххххххххх"));
}

вы правда такой … (удалено цензурой)… или прикидываетесь?
Вы в этом коде повторили ВСЕ ошибки, про которые я писал выше.
Вы хоть что-нить исправили? - не вижу

1 лайк

Возвращаясь к вопросу из первого поста

Беретесь за дело, о котором, похоже, не имеете ни малейшего представления.
Я бы вам советовал пока свой проект отложить и сначала почитать всякие обучающие мурзилки по ардуино.

так и ваш “работает” - в том смысле что ардуина мигает лампочками и не виснет. Только правильно ли?
В этом коде нет грубой ошибки с копированием номера пина вместо чтения сигнала с этого пина… остальные ляпы те же.
Эти ляпы не мешают работе, это просто бессмысленная трата памяти и процессорных циклов.

Спойлер

Как пример - можно просто спилить дерево, а можно сначала раздется догола и три раза обежать вокруг. Помешает ли этот ритуал спилить дерево - нет. Но на того, кто считает это обязательным, будут смотреть слегка криво :slight_smile:

на тему сенсора влажности почвы - что за модель? у вас есть примеры кода, как с ним работать?

HW-390 модель сенсора. Сериал принты с него в монитор порта идут они правильные реле работает в соответствии с настройками.