Немного данных одной СМС
- Войдите на сайт для отправки комментариев
Втр, 29/03/2016 - 14:57
Небходимо отправить немного данных по СМС.
Вот мой скетч. Когда отправляю запрос на данные, ничего не приходит.
#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);
}
}
Все начинается с 149 строки
1. Что означает "ничего не приходит" ? Не срабатывает условие в строке 97 ?
2. В строках 157-173 у Вас, извините, ересь. Почитайте про #define (например, http://arduino.ua/ru/prog/Define), обратите внимание на фразу "директива, которая позволяет дать имя константе перед тем как программа будет скомпилирована"
Если отправить другую команду, например On, то все нормально приходит. А когда Stats, то вообще молчит
В строках 157-173 у Вас, извините, ересь.
Между прочим, компилятор о таких делах предупреждает, но заботливые разработчики IDE придушили все его warning'и на корню (чтобы народ не смущали). Если их включить, то о переопределении константы он будет предупреждать.
Если отправить другую команду, например On, то все нормально приходит. А когда Stats, то вообще молчит
Если послать "Stats", то строка gprs.sendSMS(f_phone, MESSAGE_ERROR); не выполняется ? А в строке 110 Вы "Stats" наблюдаете ? Если два "да", то искать надо в 180 -237.
Я бы, кстати, вместо strcmp() пользую в подобных случаях strstr(), она кажется более уместной.
"
constchar*strstr(constchar* string1,constchar* string2 );Функция ищет первое вхождение подстроки
string2в строкеstring1. Возвращает указатель на первое вхождение строкиstring2в строкуstring1, или пустой указатель, если строкаstring2не является частью строкиstring1. В данном поиске нуль-символ не учитывается."