Скетч включения реле по смс
- Войдите на сайт для отправки комментариев
Добрый день всем ардуинцам.
Вступаю в ряды, сделал первые шаги, диодиком помигал, пытаюсь сделать управление нагрузкой через смс.
Взял пример из библиотеки GSMSHIELD и начал дополнять его своим кодом: чтение даных с температурного датчика и отправка его через СМС.
Вот код:
#include "SIM900.h"
#include <SoftwareSerial.h>
//If not used, is better to exclude the HTTP library,
//for RAM saving.
//If your sketch reboots itself proprably you have finished,
//your memory available.
//#include "inetGSM.h"
//If you want to use the Arduino functions to manage SMS, uncomment the lines below.
#include "sms.h"
SMSGSM sms;
#include "dht.h"
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
//Simple sketch to send and receive SMS.
int numdata;
boolean started=false;
char smsbuffer[160];
// char smsstring[160];
char n[20];
byte position;
void setup()
{
//Serial connection.
Serial.begin(9600);
Serial.println("GSM Shield testing.");
Serial.println("DHT21 test!");
pinMode(7, OUTPUT);
dht.begin();
//Start configuration of shield with baudrate.
//For http uses is raccomanded to use 4800 or slower.
if (gsm.begin(2400)){
Serial.println("\nstatus=READY");
started=true;
}
else Serial.println("\nstatus=IDLE");
if(started){
//Enable this two lines if you want to send an SMS.
//if (sms.SendSMS("3471234567", "Arduino SMS"))
//Serial.println("\nSMS sent OK");
}
};
void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
if(started){
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
}
//Read if there are messages on SIM card and print them.
if(gsm.readSMS(smsbuffer, 160, n, 20))
{
if(smsbuffer=="temperature") {
sms.SendSMS("+3471234567", "Temperature: " + t + " *C");
}
Serial.println(n);
Serial.println(smsbuffer);
}
position = sms.IsSMSPresent(SMS_ALL);
if (position) {
sms.DeleteSMS(position);
}
delay(2000);
}
};
В 65 строке у меня ошибка из-за того, что недопонял синтаксис этого языка. Сам на PHP и Javascript'е программлю. А с Си-подобными как-то не завелось. Подскажите, как правильно написать чтобы в одну строку и текст и переменная попала. Может, через переменную попробовать? Я пробовал через smsstring[] как в манулале, но опять не вышло. Как правильно надо?
Скетч пока недописанный, вы на мой индуский код внимания не обращайте. Интересмует пока косяк с 65 строчкой. Как правильно написать?
Попробуйте так:
String SMSText = "Temperature: " + String(t) + " *C";
sms.SendSMS("+3471234567", SMSText);
Теперь он ругается на строчку, где sms.SendSMS(...
gsm_dht.ino:66:45: error: no matching function for call to 'SMSGSM::SendSMS(const char [12], String&)'
gsm_dht.ino:66:45: note: candidates are:
Ему походу не нравится тип данных String что ли?
У вас номер 11 символов, а должно быть 12.
Не, он явно не на номер ругается. Сменил на "правильный" номер +7904.... (12 символов), ругуется теперь на
error: no matching function for call to 'SMSGSM::SendSMS(const char [13], String&)'
Попробуй обьявить переменные выше строки обращения в функцию. Вообще похоже, что эта функция принимает переменные другого типа. Как она описана в хелпе ?
Вот весь sms.h
#ifndef _SMS_H_ #define _SMS_H_ #include "SIM900.h" class SMSGSM { public: // SMS's methods char SendSMS(char *number_str, char *message_str); char SendSMS(byte sim_phonebook_position, char *message_str); char IsSMSPresent(byte required_status); char GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len); char GetAuthorizedSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len, byte first_authorized_pos, byte last_authorized_pos); char DeleteSMS(byte position); }; #endifЯ так понимаю ей всё как char надо отдавать, а он на второй аргумент ругается, что типа string. :(
Пробовал:
if(smsbuffer=="temperature") { String smsstring = "Temperature: " + String(t) + " *C"; sms.SendSMS("+3471234567", smsstring); }Выводит: error: no matching function for call to 'SMSGSM::SendSMS(const char [12], String&)'
Меняю на
if(smsbuffer=="temperature") { String smsstring = "Temperature: " + String(t) + " *C"; sms.SendSMS("+3471234567", char* smsstring); }Выводит: error: expected primary-expression before 'char'
Объявил mynumber как строку и вписал туда свой номер.
Далее, всё передаю как String:
if(smsbuffer=="temperature") { String smsstring = "Temperature: " + String(t) + " *C"; sms.SendSMS(mynumber, smsstring); }Выводит: gsm_dht.ino:67:40: error: no matching function for call to 'SMSGSM::SendSMS(String&, String&)'
gsm_dht.ino:67:40: note: candidates are:
походу дела трабла вообще не в типе данных. Ему String понятен, но ругается ИМХО на что-то другое. Не могу понять на что.
Ну дык
char SMSText = "Temperature: " + String(t) + " *C";
Вот-вот, именно, если функция объявлена как char SendSMS(char *number_str, char *message_str); , то дайте ей char.
inline char SendSMS( const char* number_str, String message_str ) { return sms.SendSMS( ( char* )number_str, ( char* )( message_str.c_str( ) ) ); } ..... ..... SendSMS( "+3471234567", "Temperature: " + String( t, 1 ) + " *C" );Datak: Спасибо, вот так заработало (ну в смысле, ошибки нет). Вроде в char перевелось. Спасибо еще раз.
Продвинулся дальше, уже принимаю смски от ардуины с температурой.
Но вот такая трабла. В коде прописано вывод в serial последних данных после отсылки смс. Если я мониторю serial и при этом отправляю смски на запрос, то в ответ мне приходят четко смски с температурой. Но стоит мне закрыть монитор последовательного порта, отправить смс-запрос, затем снова открыть монитор последовательного порта - смска с температурой больше неприходит. И в монитор валится всякая хрень (команды AT, но уже другие, нежели при первом открытии). Это почему такое происходит?
Понятно, что в боевом режиме никакого сериал у меня не будет. Весь мониторинг сведется к получению смски с температурой. Но может кто-то объяснит мне этот феномен?
И еще, всё-таки сравнение у меня не работает. Там походу перевод строки или еще что-то попадает. В чистом виде "temperature" не принимается. Как правильно сравнить? Ну или хотя бы часть строки сравнить... Сейчас сделал так, что просто проверяю, не пустая ли строка (строка 65). А сбрасываю переменную выше в 70-71 строке, чтобы ардуина на один запрос бесконечно не слала мне данные.
Код прилагаю.
#include "SIM900.h" #include <SoftwareSerial.h> //If not used, is better to exclude the HTTP library, //for RAM saving. //If your sketch reboots itself proprably you have finished, //your memory available. //#include "inetGSM.h" //If you want to use the Arduino functions to manage SMS, uncomment the lines below. #include "sms.h" SMSGSM sms; #include "dht.h" #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); //To change pins for Software Serial, use the two lines in GSM.cpp. //GSM Shield for Arduino //www.open-electronics.org //this code is based on the example of Arduino Labs. //Simple sketch to send and receive SMS. int numdata; boolean started=false; char smsbuffer[160]; // char* mysmsstring; char* mynumber = "+77777777777"; char n[20]; byte position; void setup() { //Serial connection. Serial.begin(9600); Serial.println("GSM Shield testing."); Serial.println("DHT21 test!"); pinMode(7, OUTPUT); dht.begin(); //Start configuration of shield with baudrate. //For http uses is raccomanded to use 4800 or slower. if (gsm.begin(2400)){ Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); if(started){ //Enable this two lines if you want to send an SMS. // if (sms.SendSMS(mynumber, "Arduino SMS")) { // Serial.println("\nSMS sent OK"); // } } }; void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if(started){ if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } //Read if there are messages on SIM card and print them. char smsbuffer[160] = ""; char n[20] = ""; position = sms.IsSMSPresent(SMS_UNREAD); if(sms.GetSMS(position, n, smsbuffer, 100)) { if(strlen(smsbuffer)>0) { String smsstring = "Temperature: " + String(t, 1) + " *C"; sms.SendSMS(n, (char*)(smsstring.c_str())); } // if(smsbuffer=="temperature") { // String smsstring = "Temperature: " + String(t, 1) + " *C"; // char* mysmsstring = smsstring.c_str(); // sms.SendSMS("3471234567", "Arduino SMS"); // sms.SendSMS(n, (char*)(smsstring.c_str())); // } // if(smsbuffer=="power on") { // digitalWrite(7,HIGH); // } // if(smsbuffer=="power off") { // digitalWrite(7,LOW); // } Serial.println(n); Serial.println(smsbuffer); } position = sms.IsSMSPresent(SMS_UNREAD); if (position) { sms.DeleteSMS(position); } delay(5000); } };И еще, никак не могу нащупать ПИН для программного включения шилда. Перепробовал 9-й, 6-й пин. Не реагирует.
С сериал подключением такая же беда была, не хотело корректно работать.
Код для программного включения :
p.s. код в своё время взял с офф сайта шилда
does not work .
do you find solution to this error ser ?
SMSText = analogRead(A0);
sms.SendSMS ("+ 3471234567", SMSText);
SMSText must be String type.
char SendSMS( const char* number_str, String message_str )
so
String SMSText = String (analogRead(A0));
sms.SendSMS ("+3471234567", SMSText);
or
sms.SendSMS ("+3471234567", String (analogRead(A0));
#include <DHT.h> #define DHTTYPE DHT11 #define DHTPIN 4 #include "SIM900.h" #include <SoftwareSerial.h> #include "sms.h" SMSGSM sms; int Rel1 = 11; // для реле 1 int Rel2 = 12; // для реле 2 int numdata; boolean started=false; char smsbuffer[160]; char n[20]; String input_string = ""; String smsContent = ""; char pos; int flag=0; char n1[] = "+79170417032"; char sendsms[160]; float hum, tem; DHT dht(DHTPIN, DHTTYPE); void setup() { dht.begin(); // gprsSerial.begin(4800); pinMode(Rel1, OUTPUT); pinMode(Rel2, OUTPUT); digitalWrite(Rel1, HIGH); digitalWrite(Rel2, HIGH); Serial.begin(115200); if (gsm.begin(2400)) { Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); } void loop() { delay(2000); gettemperature(); Serial.println("temp: "+String(tem)+" hum: "+String(hum)); smsContent=("Temperature: "+String(tem)+" Vlajnost: "+String(hum)); smsContent.toCharArray(sendsms,160); if (tem<=12) {digitalWrite(Rel1, LOW);flag=1;} if (tem<=10) {digitalWrite(Rel2, LOW);sms.SendSMS(n1, "t < +10C, Vklucheno RELE 2, Kriticheskaya temperatura");flag=1;} if (tem>=17&&flag==1) {digitalWrite(Rel1, HIGH);digitalWrite(Rel2, HIGH);flag=0;} pos = sms.IsSMSPresent(SMS_UNREAD); // смотрим непрочитанные СМС if (pos) { // Если непрочитанные СМС есть, то... getsms(); // получаем непрочитанную СМС // Если непрочитанные СМС есть, то... if (input_string=="11"){digitalWrite(Rel1, LOW);sms.SendSMS(n1, "Prinuditelnoe Vkluchenie RELE 1");memset(n,0,20);} else if (input_string=="21"){digitalWrite(Rel2, LOW);sms.SendSMS(n1, "Prinuditelnoe Vkluchenie RELE 2");memset(n,0,20);flag=1;} else if (input_string=="10"){digitalWrite(Rel1, HIGH);sms.SendSMS(n1, "Prinuditelnoe otkluchenie RELE 1");memset(n,0,20);} else if (input_string=="20"){digitalWrite(Rel2, HIGH);sms.SendSMS(n1, "Prinuditelnoe otkluchenie RELE 2");memset(n,0,20);flag=0;} else if (input_string=="0"){sms.SendSMS(n1, sendsms);memset(n,0,20);} sms.DeleteSMS(pos); delay(1000); } } void getsms() { sms.GetSMS(pos,n,20,smsbuffer,160); // Serial.println(n); // Serial.println(smsbuffer); input_string =String(smsbuffer); Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:--------- " + input_string + "\n"); } void gettemperature() { hum = dht.readHumidity(); tem = dht.readTemperature(false); }Здравствуйте. Подскажите, как устранить.
Исходный скетч:
Ошибка в 79 строке:
У вас по три-пять разных библиотек на одно и то же. Почистите все библиотеки и установите только одну для DHT. одну для GPRSSHIELD и так далее
Ошибка не ушла.
Ноту-то - перевели или так и не смогли? "Кандидат ожидает 4(четыре, Карл!) аргумента, предоставлено 5". А Вы компилятору суете это "
sms.GetSMS(pos,n,20,smsbuffer,160);" - сколько тут "параметров" и куда должен деть лишнее компилятор? :)Как исправить?
Как исправить?
Аналогия: в карман влазит только четыре яблока, а ты пихаешь пять. Как исправить?
Парни, я не програмист.
Подскажите дилетанту в какой строке и что изменить.
В какой строке - Вам написал компилятор (в 79-й). Как исправить - подсказали пользователи (сократить количество параметров функции до 4). Что Вам еще непонятно?
Пропишите плиз эту строку.
Все решилось заменой библиотеки GSMSHIELD на GSM-GPRS-GPS-Shield-GSMSHIELD
Звиздец ты тугой.