Немного данных одной СМС

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Небходимо отправить немного данных по СМС.

Вот мой скетч. Когда отправляю запрос на данные, ничего не приходит.

#include "QuadDisplay.h"
#include <GPRS_Shield_Arduino.h>
#include <sim900.h>
#include <DHT.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
#define MESSAGE_ERROR  "Error...unknown command!"
#define PHONE "+79108****" //Введи свой номер сюда!
#define MESSAGE_POLIV "Poliv on"
#define MESSAGE_MIN "Tmin"
#define MESSAGE_MAX "Tmax"
boolean poliv = false;
boolean fort = false;
int messageIndex = 0;
char phone[18];
char message[MESSAGE_LENGTH];
char datetime[24];
GPRS gprs(11, 10);


const int HUMIDY_MIN = 200;
const int HUMIDY_MAX = 700;

const int TEMP_MIN = 2;
const int TEMP_MAX = 40;

#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
int Relay1 = 4;
int Relay2 = 5;
int Relay3 = 6;
void setup() 
{
  pinMode(9, OUTPUT);
  displayInt(9, 0);
  gprs.powerUpDown();
  dht.begin();
  
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(A0, INPUT);
}

char intDigit(unsigned int val, char pos)
{
  char buf[6];
  
  sprintf(buf, "%04u", val);
  
  return buf[3-pos]-'0';
}

unsigned int intDigitSet(unsigned int val, char pos, char d)
{
  char buf[6];
  
  sprintf(buf, "%04u", val);
  
  buf[3-pos] = '0'+d;
  
  return atoi(buf);
}

unsigned int readHumidy(void)
{
  static unsigned int oldval = 0;
  static unsigned int res = 0;
  static unsigned int stability[4] = { 0, 0, 0, 0 };
  
  char i;
  unsigned int val = analogRead(A0);
  
  for(i = 0; i < 4; i++) {
    if(intDigit(oldval, i) != intDigit(val, i)) {
      oldval = intDigitSet(oldval, i, intDigit(val, i));
      stability[i] = 0;
    }
    else {
      if(stability[i] < 10) stability[i]++;
      else res = intDigitSet(res, i, intDigit(val, i));
    }
  }
  
  return res;
}

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float val = analogRead(A0);
  

  messageIndex = gprs.isSMSunread();
  if (messageIndex > 0) {
    gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
    gprs.deleteSMS(messageIndex);
    // выводим номер, с которого пришло смс
    Serial.print("From number: ");
    Serial.println(phone);

    // выводим дату, когда пришло смс
    Serial.print("Datetime: ");
    Serial.println(datetime);

    // выводим текст сообщения
    Serial.print("Recieved Message: ");
    Serial.println(message);
    
    setRelay(phone, message);
  }
  
if(val < HUMIDY_MIN) //Если влажность меньше минимального порога, то
{
  digitalWrite(Relay1, HIGH); //Включаем полив
  poliv = true; //Флаг для того, что бы знать, включен ли полив, или нет
}

if(val > HUMIDY_MAX) //А если достигли максимального порога, то выключаем поливалку
{
  digitalWrite(Relay1, LOW); //Выключили полив
  poliv = false;
}


if(t > TEMP_MAX) //Если температура стала больше заданной, то
{
  gprs.sendSMS(phone, MESSAGE_MAX);
  digitalWrite(Relay2, HIGH); //Включаем мотор
  delay(200); //Ждем пока форточка откроется
  digitalWrite(Relay2, LOW); //Выключаем мотор, форточка открыта
  fort = true;
}
else if(t < TEMP_MIN) //Но, если температура опустилась ниже заданной, то
{
  gprs.sendSMS(phone, MESSAGE_MIN);
  digitalWrite(Relay3, HIGH); //Включаем мотор для закрывания
  delay(200); //Ждем пока форточка закроется
  digitalWrite(Relay3, LOW); //Выключаем мотор, форточка закрыта 
  fort = false;
}
  
  

delay(250);
}
void setRelay(char f_phone[], char f_message[])
{
  int val = analogRead(A0);
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  char s_temp[8];
  char s_humi[8];
  char s_mois[8];
  if(poliv == false)
  {
    #define MESSAGE_POL "Poliv now is On!"
  }
  else if(poliv == true)
  {
    #define MESSAGE_POL "Poliv now is Off!"
  }

  if(fort == false)
  {
    #define MESSAGE_FORT "Window now is closed!"
  }
  else if(fort == true)
  {
    #define MESSAGE_FORT "Window now is open!"
  }
  
  itoa(t, s_temp, 10);
  itoa(h, s_humi, 10);
  itoa(val, s_mois, 10);
  
  if (strcmp(f_message, "Stats") == 0) 
  {
   char* tm = "Temperature=";
   char* hm = "Humidity=";
   char* ms = "Moisture: ";
   char* tmc = " °C";
   char* Hm = " %";
   char* tz = "; ";
   char* fr;
   char* pl;
   if(fort == false)
  {
    fr = "Window now is closed!";
  }
  else if(fort == true)
  {
    fr = "Window now is open!";
  }
  if(poliv == false)
  {
   pl = "Poliv now is On!";
  }
  else if(poliv == true)
  {
    pl = "Poliv now is Off!";
  }
   //Temperature c
   char* a = strcat(tm , s_temp);
   char* b = strcat(a, tmc);
   char* c = strcat(b, tz);
   //Humidity m
   char* d = strcat(hm, s_humi);
   char* r = strcat(d, Hm);
   char* m = strcat(r, tz);
   //Moisture e
   char* q = strcat(ms, s_mois);
   char* w = strcat(q, Hm);
   char* e = strcat(w, tz);
   //Relay statsus
   char* p = strcat(fr, tz);
   char* y = strcat(p, pl);
   char* u = strcat(y, tz);
   //Все в кучу =)
   char* z = strcat(c, m);
   char* x = strcat(z, e);
   
   char* v = strcat(x, u);
    gprs.sendSMS(phone, v);
    delay(2000);/*
    gprs.sendSMS(phone, s_humi);
    delay(2000);
    gprs.sendSMS(phone, s_mois);
    delay(2000);
    gprs.sendSMS(phone, MESSAGE_POL);
    delay(2000);
    gprs.sendSMS(phone, MESSAGE_FORT);
    delay(2000);*/
    
  } 
  else if (strcmp(f_message, "On") == 0) 
  {
    digitalWrite(Relay1, HIGH);
    poliv = true;
    gprs.sendSMS(phone, MESSAGE_POLIV);
    delay(5000);
  } 
  else 
  {
    Serial.println("Error... unknown command!");
    delay(800);
    gprs.sendSMS(f_phone, MESSAGE_ERROR);
  }
}

 

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Все начинается с 149 строки

Araris
Offline
Зарегистрирован: 09.11.2012

1. Что означает "ничего не приходит" ? Не срабатывает условие в строке 97 ?

2. В строках 157-173 у Вас, извините, ересь. Почитайте про #define (например, http://arduino.ua/ru/prog/Define), обратите внимание на фразу "директива, которая позволяет дать имя константе перед тем как программа будет скомпилирована"

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Если отправить другую команду, например On, то все нормально приходит. А когда Stats, то вообще молчит

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Araris пишет:

В строках 157-173 у Вас, извините, ересь. 

Между прочим, компилятор о таких делах предупреждает, но заботливые разработчики IDE придушили все его warning'и на корню (чтобы народ не смущали). Если их включить, то о переопределении константы он будет предупреждать.

Araris
Offline
Зарегистрирован: 09.11.2012

Nazar_Diadiun пишет:

Если отправить другую команду, например On, то все нормально приходит. А когда Stats, то вообще молчит

Если послать "Stats", то строка gprs.sendSMS(f_phone, MESSAGE_ERROR); не  выполняется ? А в строке 110 Вы "Stats" наблюдаете ?  Если два "да", то искать надо в 180 -237.

Я бы, кстати, вместо strcmp() пользую в подобных случаях strstr(), она кажется более уместной.

"const char strstrconst char * string1, const char * string2 );

 Функция ищет первое вхождение подстроки string2 в строке string1. Возвращает указатель на первое вхождение строки string2   в строку string1, или пустой указатель, если строка string2 не является частью строки string1. В данном поиске нуль-символ не  учитывается."