Управление сервой через GSM Shield

Graver
Offline
Зарегистрирован: 15.10.2012
include <SoftwareSerial.h>
#include <Servo.h> 

SoftwareSerial gprsSerial(7, 8);
Servo myservo;

int pos = 0;
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;

void setup()
{
    gprsSerial.begin(19200);
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, OUTPUT);
    myservo.attach(9);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);
}

String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;

void loop()
{
    if (!gprsSerial.available())
        return;

    char currSymb = gprsSerial.read();    
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Green on")) {
                digitalWrite(greenPin, HIGH);
            } else if (!currStr.compareTo("Green off")) {
                digitalWrite(greenPin, LOW);
            } else if (!currStr.compareTo("Yellow on")) {
                digitalWrite(yellowPin, HIGH);
            } else if (!currStr.compareTo("Yellow off")) {
                digitalWrite(yellowPin, LOW);
            } else if (!currStr.compareTo("Servo")){
                for(pos = 0; pos < 180; pos += 1)   
              {                                   
                myservo.write(pos);              
                delay(15);                       
              } 
               for(pos = 180; pos>=1; pos-=1)      
             {                                
               myservo.write(pos);               
               delay(15);                        
             } 
            isStringMessage = false;
            } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
  }
}
Graver
Offline
Зарегистрирован: 15.10.2012

 Помогите пожалуйста разобраться с кодом.

После према СМСки с текстом: "Servo"  сервомашинка вместо отработки своей программы

просто дергается и после этого  GPRS/GSM Shield v1.1 отключается.

include <SoftwareSerial.h>
#include <Servo.h> 

SoftwareSerial gprsSerial(7, 8);
Servo myservo;

int pos = 0;
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;

void setup()
{
    gprsSerial.begin(19200);
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, OUTPUT);
    myservo.attach(9);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);
}

String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;

void loop()
{
    if (!gprsSerial.available())
        return;

    char currSymb = gprsSerial.read();    
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Green on")) {
                digitalWrite(greenPin, HIGH);
            } else if (!currStr.compareTo("Green off")) {
                digitalWrite(greenPin, LOW);
            } else if (!currStr.compareTo("Yellow on")) {
                digitalWrite(yellowPin, HIGH);
            } else if (!currStr.compareTo("Yellow off")) {
                digitalWrite(yellowPin, LOW);
            } else if (!currStr.compareTo("Servo")){
                for(pos = 0; pos < 180; pos += 1)   
              {                                   
                myservo.write(pos);              
                delay(15);                       
              } 
               for(pos = 180; pos>=1; pos-=1)      
             {                                
               myservo.write(pos);               
               delay(15);                        
             } 
            isStringMessage = false;
            } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
  }
}

П

 

include <SoftwareSerial.h>
#include <Servo.h> 

SoftwareSerial gprsSerial(7, 8);
Servo myservo;

int pos = 0;
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;

void setup()
{
    gprsSerial.begin(19200);
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, OUTPUT);
    myservo.attach(9);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);
}

String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;

void loop()
{
    if (!gprsSerial.available())
        return;

    char currSymb = gprsSerial.read();    
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Green on")) {
                digitalWrite(greenPin, HIGH);
            } else if (!currStr.compareTo("Green off")) {
                digitalWrite(greenPin, LOW);
            } else if (!currStr.compareTo("Yellow on")) {
                digitalWrite(yellowPin, HIGH);
            } else if (!currStr.compareTo("Yellow off")) {
                digitalWrite(yellowPin, LOW);
            } else if (!currStr.compareTo("Servo")){
                for(pos = 0; pos < 180; pos += 1)   
              {                                   
                myservo.write(pos);              
                delay(15);                       
              } 
               for(pos = 180; pos>=1; pos-=1)      
             {                                
               myservo.write(pos);               
               delay(15);                        
             } 
            isStringMessage = false;
            } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
  }
}

[/quote]

maksim
Offline
Зарегистрирован: 12.02.2012

Дело не в коде, а нехватке питания.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:
Дело не в коде, а нехватке питания.

Другими словами - попытайтесь запитатся не от USB, а от внешнего блока питания.

Graver
Offline
Зарегистрирован: 15.10.2012

  Запитался от внешнего блока 12В.Никаких изменнеий,разве что серва начала дергаться сильнее.

maksim
Offline
Зарегистрирован: 12.02.2012

Потому что вы серву запитываете от дуины, а нужно запитать от отдельного источника, НО на серву можно давать небольше 6 вольт.

maksim
Offline
Зарегистрирован: 12.02.2012

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

Graver
Offline
Зарегистрирован: 15.10.2012

 Запитал от отдельного источника серву 6В,дал общий минус. Дергается , но перестала выключаться GSM-Shield.

maksim
Offline
Зарегистрирован: 12.02.2012

А что за источник на 6 вольт? Попробуйте так, если тоже дергается , то ваш источник питания не тянет и кстати, а что за серва?

#include <Servo.h> 
Servo myservo;  // create servo object to control a servo 

void setup(){ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 

void loop(){ 
  for(int pos = 0; pos < 180; pos ++){                                  
    myservo.write(pos);             
    delay(15);                      
  }
  for(int pos = 180; pos>=0; pos--){                               
    myservo.write(pos);              
    delay(15);                       
  }
} 

 

Graver
Offline
Зарегистрирован: 15.10.2012

  Изменил код по Вашему совету. Изменений нет. Источник питания сервы-акумулятор 6В,  4,5Ah.

Серва маломощная - Hextronik HXT900. Эта серва работает и от USB питания на обычном скетче из базы примеров IDE 1.0.1

maksim
Offline
Зарегистрирован: 12.02.2012

Надо было не изменять, а просто попробовать этот код. Серва у вас действительно маленькая, но вместе с GSM-шилдом может давать просадки, по этому от USB может не работать. Если она у вас дергается с этим кодом (не надо его менять просто копируйте и залейте), то либо у вас разряжен аккум, либо что-то с проводами, либо с сервой, либо вы что-то не так подключаете.

Graver
Offline
Зарегистрирован: 15.10.2012

 С Вашим кодом серва работает и c акумулятором и от USB.

maksim
Offline
Зарегистрирован: 12.02.2012

 А GSM-шилд при этом подключен?

Graver
Offline
Зарегистрирован: 15.10.2012

 GSM-шилд включен в разъем Уно ,но при нажатии кнопки "SIM900-POWER" пытается  включиться , мигают индикаторы "STATUS" и "NET", а затем выключаетя. Серва же продолжает отрабатывать скетч.

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

Вопрос к топикстартеру и всем кто может помочь.

Вы своим кодом хотя бы светодиод смогли зажечь? Я совсем еще начинающий и играюсь с приемом смсок. Есть ощущение что Ваш код совершенно не рабочий в плане распарсенья данных с СОМ порта. Я им не то что серву, диод зажечь не могу. Это не критика, просто я совсем еще чайник и может что то не то делаю.

НЕ могли бы Вы обяснить, как именно у Вас идет "чтение" СМСки? Я все выходные сижу - понять не могу.

Зачем Вы используете АТ+IFC?

Почему Вы анализируете весь поток СОМ порта, а не ждете +СМТ сначала?

Спасибо за ответы

Вот мой код (с частью Вашего кода)для отсылания СМС по превышению температурного порога и отправки СМС, по приему входящей СМС, запрашивающий статус. Отправка по превышению работает, остальное нет.

#include <SoftwareSerial.h>
#include "DHT.h"

SoftwareSerial mySerial(10, 11); // RX, TX

#define DHTPIN 2     
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#define HOT 1
#define COLD 0
int LastStatusOfTheTemp=COLD;

int count = 0;
int countMessages = 1;

void setup (){
  dht.begin();
  mySerial.begin(9600);
  mySerial.flush();
  mySerial.print("\r");
  mySerial.println("AT");
  delay(100);
  int i=0;
  char commandbuffer[100];
  if(mySerial.available()){
    delay(100);
    while( mySerial.available() && i< 99) {
      commandbuffer[i++] = mySerial.read();
    }
    commandbuffer[i++]='\0';
  }
  if(i>0)
  {
     mySerial.println(commandbuffer);
     delay(500);
     mySerial.print("AT+CMGF=1\r");
     delay(500);
     mySerial.print("AT+CPBS=\"SM\"\r");
     delay(500);
     mySerial.print("AT+CNMI=1,2,2,1,0\r");
     delay(500);
  }
}

String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;

void loop ()
{
  if (!mySerial.available())
        return;
  float t = dht.readTemperature();
  if (t>=30) 
  {
     if (LastStatusOfTheTemp==COLD) 
     {
      while (count < countMessages)
      {
        delay(1000);
        mySerial.print("AT+CMGS="); // отправляем смс
        mySerial.print((char)34);
        mySerial.print("89xxxxxxxxx"); // номер получателя
        mySerial.print((char)34); // символ кавычки "
        mySerial.print((char)13); // символ <cr> (ASCII character 13)
        delay(1500);
        mySerial.print("VERY HOT! - ");
        mySerial.print(t); // текст смс
        delay(500);
        mySerial.print((char)26); // символ <ctrl-z> (ASCII character 26)
        delay(30000);
        count++;
        LastStatusOfTheTemp=HOT;
      }
     }
     else
       {
        if (LastStatusOfTheTemp==HOT) {
          LastStatusOfTheTemp=COLD;
       }
      }
      char currSymb = mySerial.read();   
          if ('\r' == currSymb) {
            if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
              if (!currStr.compareTo("Status")) {
                mySerial.print("AT+CMGS="); // отправляем смс
                mySerial.print((char)34);
                mySerial.print("89xxxxxxxxx"); // номер получателя
                mySerial.print((char)34); // символ кавычки "
                mySerial.print((char)13); // символ <cr> (ASCII character 13)
                delay(1500);
                mySerial.print("Temperatura - ");
                mySerial.print(t); // текст смс
                delay(500);
                mySerial.print((char)26); // символ <ctrl-z> (ASCII character 26)
                delay(300);
            isStringMessage = false;
            } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
  }
  }
}

 

lexa217
Offline
Зарегистрирован: 08.12.2012

У Вас проверка получения смс идет только в случае, если температура выше 30 градусов.  вынесите код проверки получения смс за пределы  if (t>=30){}

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

Хм. Странно. Я руководствовался такой логикой:

1. Если Т-ра больше 30, то шлем смс сами.

2. Если меньше, то проверяем наличие смс и если оно есть и со словом "Статус", то шлем текущую температуру.

И все это должно быть именно под If (t>30)...

Может я чего неправильно понимаю?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если я не ошибаюсь, то с 57 строки по 112 это строки которые под if(t>30) заключены, поэтому - это отличается от Вашей логики, описанной только что. Если хотите совет - ставьте скобки либо так:

if(..) {
..
}

либо так:

if(..)
{
..
}

И старайтесь выдерживать уровни, у вас текст гуляет как попало. Если не ошибаюсь, Ctrl-F - делает выравнивание.

Иначе Вы постоянно будете в этом хаосе путаться.

Так что lexa217 Вам правильно говорит.

 

NewFolk
Offline
Зарегистрирован: 19.12.2012

Извините, что встреваю. А каким шилдом пользуетесь? Посоветуйте новичку плз. Задача практически ваша.