Скетч включения реле по смс

Artemiy
Offline
Зарегистрирован: 20.10.2014

Добрый день всем ардуинцам.

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

Взял пример из библиотеки 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 строчкой. Как правильно написать?

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

Попробуйте так:

String SMSText = "Temperature: " + String(t) + " *C";

sms.SendSMS("+3471234567", SMSText);

Artemiy
Offline
Зарегистрирован: 20.10.2014

Теперь он ругается на строчку, где 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 что ли?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

У вас номер 11 символов, а должно быть 12. 

Artemiy
Offline
Зарегистрирован: 20.10.2014

Не, он явно не на номер ругается. Сменил на "правильный" номер +7904.... (12 символов), ругуется теперь на

error: no matching function for call to 'SMSGSM::SendSMS(const char [13], String&)'

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Попробуй обьявить переменные выше строки обращения в функцию. Вообще похоже, что эта функция принимает переменные другого типа. Как она описана в хелпе ?

Artemiy
Offline
Зарегистрирован: 20.10.2014

Вот весь 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'

Artemiy
Offline
Зарегистрирован: 20.10.2014

Объявил 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 понятен, но ругается ИМХО на что-то другое. Не могу понять на что.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну дык

char SMSText = "Temperature: " + String(t) + " *C";

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

Вот-вот, именно, если функция объявлена как char SendSMS(char *number_str, char *message_str); , то дайте ей char.

Datak
Offline
Зарегистрирован: 09.10.2014








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" );

 

Artemiy
Offline
Зарегистрирован: 20.10.2014

Datak: Спасибо, вот так заработало (ну в смысле, ошибки нет). Вроде в char перевелось. Спасибо еще раз.

Artemiy
Offline
Зарегистрирован: 20.10.2014

Продвинулся дальше, уже принимаю смски от ардуины с температурой.

Но вот такая трабла. В коде прописано вывод в 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);
  }
};

 

Artemiy
Offline
Зарегистрирован: 20.10.2014

И еще, никак не могу нащупать ПИН для программного включения шилда. Перепробовал 9-й, 6-й пин. Не реагирует.

Binnimo
Offline
Зарегистрирован: 02.11.2012

С сериал подключением такая же беда была, не хотело корректно работать. 
Код для программного включения :

pinMode(9,OUTPUT);
 digitalWrite(9,LOW);
 delay(1000);
 digitalWrite(9,HIGH);
 delay(2000);
 digitalWrite(9,LOW);
 delay(3000);

p.s. код в своё время взял с офф сайта шилда

mamdouh
mamdouh аватар
Offline
Зарегистрирован: 17.04.2015

does not work .

do you find solution to this error  ser ?

SMSText = analogRead(A0);

sms.SendSMS ("+ 3471234567", SMSText);

X-Dron
Offline
Зарегистрирован: 24.01.2015

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));

clon
Offline
Зарегистрирован: 08.11.2018
#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);
}

Здравствуйте. Подскажите, как устранить.

Исходный скетч:

 

clon
Offline
Зарегистрирован: 08.11.2018
Arduino: 1.8.2 (Windows 7), Плата:"Arduino/Genuino Uno"

F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino: In function 'void getsms()':

GSM_TERM_2relay:79: error: no matching function for call to 'SMSGSM::GetSMS(char&, char [20], int, char [160], int)'

F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino:79:44: note: candidate is:

In file included from F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino:6:0:

C:\Users\Aleksandr\Documents\Arduino\libraries\GSMSHIELD/sms.h:13:10: note: char SMSGSM::GetSMS(byte, char*, char*, byte)

     char GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len);

          ^

C:\Users\Aleksandr\Documents\Arduino\libraries\GSMSHIELD/sms.h:13:10: note:   candidate expects 4 arguments, 5 provided

Несколько библиотек найдено для "DHT.h"
 Используется: C:\Users\Aleksandr\Documents\Arduino\libraries\DHT_sensor_library-1.3.0
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\Grove_Temperature_And_Humidity_Sensor
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\DHT-sensor-library-master
Несколько библиотек найдено для "SIM900.h"
 Используется: C:\Users\Aleksandr\Documents\Arduino\libraries\GSMSHIELD
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD
Несколько библиотек найдено для "SoftwareSerial.h"
 Используется: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\SoftwareSerial-master
Не используется: C:\Users\Aleksandr\Documents\Arduino\libraries\SoftwareSerial
exit status 1
no matching function for call to 'SMSGSM::GetSMS(char&, char [20], int, char [160], int)'

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

Ошибка в 79 строке:

 

 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

У вас по три-пять разных библиотек на одно и то же. Почистите все библиотеки и установите только одну для DHT. одну для GPRSSHIELD и так далее

clon
Offline
Зарегистрирован: 08.11.2018
Arduino: 1.8.2 (Windows 7), Плата:"Arduino/Genuino Uno"

F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino: In function 'void getsms()':

GSM_TERM_2relay:79: error: no matching function for call to 'SMSGSM::GetSMS(char&, char [20], int, char [160], int)'

F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino:79:44: note: candidate is:

In file included from F:\Downloads\DM\РђСЂРґСѓРёРЅРѕ\Видео\GSM_TERM_2relay\GSM_TEMP_2reley Р?сходный\GSM_TERM_2relay\GSM_TERM_2relay.ino:6:0:

C:\Users\Aleksandr\Documents\Arduino\libraries\GSMSHIELD/sms.h:13:10: note: char SMSGSM::GetSMS(byte, char*, char*, byte)

     char GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len);

          ^

C:\Users\Aleksandr\Documents\Arduino\libraries\GSMSHIELD/sms.h:13:10: note:   candidate expects 4 arguments, 5 provided

exit status 1
no matching function for call to 'SMSGSM::GetSMS(char&, char [20], int, char [160], int)'

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

Ошибка не ушла.

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ноту-то - перевели или так и не смогли? "Кандидат ожидает 4(четыре, Карл!) аргумента, предоставлено 5". А Вы компилятору суете это "sms.GetSMS(pos,n,20,smsbuffer,160);" - сколько тут "параметров" и куда должен деть лишнее компилятор? :)

clon
Offline
Зарегистрирован: 08.11.2018

Как исправить?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

clon пишет:

Как исправить?

Аналогия: в карман влазит только четыре яблока, а ты пихаешь пять. Как исправить?

clon
Offline
Зарегистрирован: 08.11.2018

Парни, я не програмист.

Подскажите дилетанту в какой строке и что изменить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В какой строке - Вам написал компилятор (в 79-й). Как исправить - подсказали пользователи (сократить количество параметров функции до 4). Что Вам еще непонятно?

clon
Offline
Зарегистрирован: 08.11.2018

Пропишите плиз эту строку.

clon
Offline
Зарегистрирован: 08.11.2018

Все решилось заменой библиотеки GSMSHIELD на GSM-GPRS-GPS-Shield-GSMSHIELD

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Звиздец ты тугой.