Ультразвуковой измеритель уровня жидкости + SIM800L + СМС (требуется доработка)

Lazyua
Offline
Зарегистрирован: 11.11.2017

Доброго времени суток. Друзья, кому интересно, помогите решить задачу: имеется ультразвуковой датчик HC-SR04, Arduino NANO, GSM модуль SIM800L. Необходимо по входящему звонку на GSM модуль заставить Arduino отбиться, произвести замер уровня воды в емкости и ответить по СМС на звонивший номер.

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

#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); // RX, TX
int ch = 0;
String val = "";  //переменная для приема данных от GSM-модуля

#define Trig 9
#define Echo 8


void setup() {  
  pinMode(Trig, OUTPUT); //инициируем как выход 
  pinMode(Echo, INPUT); //инициируем как вход 
  Serial.begin(9600); //Скорость порта для связи Arduino с компьютером
  SIM800.begin(9600);  //Скорость порта для связи Arduino с GSM модулем
  SIM800.println("AT");
} 
unsigned int impulseTime=0; 
unsigned int distance_cm=0;
int incomingByte = 0; 

void sms(String text, String phone) {
  Serial.println("SMS send started");
  SIM800.println("AT+CMGS=\"" + phone + "\"");
  delay(1000);
  SIM800.print(text);
  delay(300);
  SIM800.print((char)26);
  delay(300);
  Serial.println("SMS send finish");
  delay(3000);
}

void loop() 
{
  if (SIM800.available())           // Ожидаем прихода данных (ответа) от модема...
    Serial.write(SIM800.read());    // ...и выводим их в Serial
  if (Serial.available())           // Ожидаем команды по Serial...
    SIM800.write(Serial.read());    // ...и отправляем полученную команду модему

  if (SIM800.available()){       //если GSM модуль что-то послал нам,
  while (SIM800.available())   //сохраняем входную строку в переменную val
  ch = SIM800.read();
  val += char(ch);
  delay(10);
  }
  if (val.indexOf("RING") > -1)  
  Serial.println("Level meter starting");
  SIM800.println("ATH");            // Сбрасываем вызов и начинаем измерение уровня
  digitalWrite(Trig, HIGH); 
  delayMicroseconds(10);            // Отсылаем импульс на эхолот
  digitalWrite(Trig, LOW);
  impulseTime=pulseIn(Echo, HIGH);
  distance_cm=impulseTime/58;       // Преобразовываем расстояние в сантиметры
  Serial.print ("yPOBEHb  ");
  Serial.print (distance_cm);       // Выводим расстояние в порт
  Serial.println("CM");
  delay(200);
  sms(String("yPOBEHb Здесь должен быть уровень CM"),String("+791212345678"));
  val = ""; //обнуляем переменную val
  }

Буду благодарен всем отозвавшимся.

b707
Offline
Зарегистрирован: 26.05.2017

Чтобы без стеба - давайте сделаем так. Вы код соберете, скомпилируете и попробуйте. Если возникнут проблемы - тогда милости просим с конкретными вопросами.

 

Lazyua
Offline
Зарегистрирован: 11.11.2017

Как вставить в текст сообщения переменную? sms(String("yPOBEHb <strong>Здесь должен быть уровень</strong> CM"),String("+791212345678"));