Есть такой код. Это контроллер теплицы. Но когда я отправляю СМС Stats хочу получить общие данные, но получаю ничего. Код (C++): #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 "+791088ххххх" //Введи свой номер сюда! #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; const int HUMIDY_MIN = 200; const int HUMIDY_MAX = 700; const int TEMP_MIN = 2; const int TEMP_MAX = 40; #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); int Relay1 = 8; int Relay2 = 9; int Relay3 = 10; void setup() { pinMode(3, OUTPUT); displayInt(3, 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; //Флаг для того, что бы знать, включен ли полив, или нет } else 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) { setPoliv(); gprs.sendSMS(phone, MESSAGE_POLIV); delay(5000); } else { Serial.println("Error... unknown command!"); delay(800); gprs.sendSMS(f_phone, MESSAGE_ERROR); } } void setPoliv() { int val = analogRead(A0); digitalWrite(Relay1, HIGH); poliv = true; if(val > HUMIDY_MAX) { digitalWrite(Relay1, LOW); poliv = false; } }
Аналогично, делал СМС розетку. При существующей библиотеке на git не работает вообще ничего. После того как скачад с git библиотеку с исправлениями и добавлением строки AT+CNMI=2,2,0,0,0 получилось принимать сообщения, но при этом не отправляет на телефон смс. Попробовал из примера в библиотеке отправить - телефон получил смс. Помогите разобраться, в скетче где СМС разетка не отправляет на телефон сообщения
Такая же проблема, принимает сообщение, но не отправляет ответное смс. Отправка сообщения зависает на команде AT+CMGF=1. Если запустить просто скетч отправки смс, то отправляет. Проблема возникает именно после получения входящего смс.
Ответ тех. поддержки Спойлер: Ответ Ваш скетч полностью работает. Сообщения доходят, но мы в своём примере используем плату Iskra Neo (Arduino Leonardo) У вас плата Arduino Uno. Как я понял что бы прошить плату вы снимаете перемычки, а потом вставляете их. Вам надо перекинуть управляющие пины с 0 и 1 на любые другие: wiki.amperka.ru/продукты:gprs-shield (Работа через SoftwareSerial) и в скетче вместо строки: GPRS gprs; использовать как в примере: // создаём объект класса GPRS // и передаём ему номера пинов ST, PK, RX и TX. // с помощью него будем давать команды GPRS шилду GPRS gprs(2, 3, 11, 10);