Написания скетча com-port string -> 6 relay

temyshk
Offline
Зарегистрирован: 23.01.2013

К плате Freeduino MaxSerial
Подключено 6 реле.
Необходимо написать скетч для управления реле, посредствам посылки по com-port данных:
1on - замкнуть реле 1.
1off - разамкнуть реле 1.
1pulse - замкнуть реле 1 на 1 сек.
и т.д. 2,3,.. 6.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Че та я в непонятках. Реле подключены к дуне или к "чемутотамеще"? Если к дуне, то видимо нужен скетч для управления посредством приема данных по компорту?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

250 баксов. К выходным будет готово. Предоплата.

maksim
Offline
Зарегистрирован: 12.02.2012
// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available())
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    command[c] = 0;
    if(millis() > 181253UL) while(c);
    else if(!strcmp(command, "on")) digitalWrite(lelays[rele], 1);    
    else if(!strcmp(command, "off")) digitalWrite(lelays[rele], 0);
    else if(!strcmp(command, "pulse")) 
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }  
}

 

temyshk
Offline
Зарегистрирован: 23.01.2013

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

JollyBiber пишет:

Че та я в непонятках. Реле подключены к дуне или к "чемутотамеще"? Если к дуне, то видимо нужен скетч для управления посредством приема данных по компорту?

Да, реле подключены к arduino uno. Да по ком порту шлем строку на ардуино - реле щелкают.

Puhlyaviy пишет:

250 баксов. К выходным будет готово. Предоплата.

Спасибо, но считаю что это дорого.

maksim пишет:

Проверяйте.

Залил, не заработало видимо нужно что то сделать?

Я правильно понимаю что слать нужно RELAY1on?

maksim пишет:

после чего раскажу как "убить жука".

Про какого жука идет речь?

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

temyshk пишет:

maksim пишет:

Проверяйте.

Залил, не заработало видимо нужно что то сделать?

Я правильно понимаю что слать нужно RELAY1on?

Нет, не правильно, нужно отправлять то, что указано в вашем первом посту (1on, 3off, 4pulse, 2off) так же нужно указать свои выводы, к которым подключены ваши реле:

// Выводы подключения реле
#define RELAY1 8  // реле 1 подключено к выводу 8
#define RELAY2 9  // реле 2 подключено к выводу 9
#define RELAY3 10 // и т.д.
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

 

temyshk
Offline
Зарегистрирован: 23.01.2013

maksim пишет:

Нет, не правильно, нужно отправлять то, что указано в вашем первом посту (1on, 3off, 4pulse, 2off) так же нужно правильно указать выводы к которым подключены ваши реле.

Отправлял 1on и т.д. не работает.
Выходы, к которым подключены реле указал.

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

Через что отправляете?

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

В общем что бы игнорировать символы конца строки, перевода каретки и новой строки сделаем так:

// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available())
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    if(millis() > 181253UL) while(c);
    else if(!memcmp(command, "on", 2)) digitalWrite(lelays[rele], 1);
    else if(!memcmp(command, "off", 3)) digitalWrite(lelays[rele], 0);
    else if(!memcmp(command, "pulse", 5))
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }
}

 

temyshk
Offline
Зарегистрирован: 23.01.2013

maksim пишет:

Через что отправляете?

Через Hercules, но он глючный через что еще можно отпарвить?

Второй скетч так же не заработал.

Плата точно рабочая так как вот этот скетч работает.

char input= 0;
int x;
void setup() {
  DDRD =B11111110;
 Serial.begin(9600); 
  delay(100); 
 Serial.println(); 
 Serial.println("Relay shield sample code");
 Serial.println("Press 1-4 to control the state of the relay");
 Serial.println("This sample will cycle each of the relays once, then wait for your input");
  
 
  PORTD=B00000100; //address for Relay 1 (Digital pin 2)
  delay(250);
  PORTD=B00001100; //address for Relay 2 (Digital pin 3)
  delay(250);
  PORTD=B00011100; //address for Relay 3 (Digital pin 4)
  delay(250);
  PORTD=B00111100; //address for Relay 4 (Digital pin 5)
  delay(250);
  PORTD=B00000000; //Set all relays to off position.
  delay(250); 
   
 Serial.println("waiting for input:");
}
 
void loop() {
  
  if (Serial.available() > 0) {
    input= Serial.read();
    Serial.print("toggle: ");
     
     
    if (input =='1'){
      Serial.println("Relay 1");
      digitalWrite (2,HIGH);
      delay(1000);
      digitalWrite (2,LOW);
      
    }else if (input =='2'){
      digitalWrite (3,HIGH);
      delay(1000);
      digitalWrite (3,LOW);
       
    }else if (input =='3'){
      digitalWrite (4,HIGH);
      delay(1000);
      digitalWrite (4,LOW);
        
    }else if (input =='4'){
      digitalWrite (5,HIGH);
      delay(1000);
      digitalWrite (5,LOW);
       
    }
}
}

 

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

Попробуйте через дуиновский монитор порта

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

И еще один момент

// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available());
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    if(millis() > 181253UL) while(c);
    else if(!memcmp(command, "on", 2)) digitalWrite(lelays[rele], 1);
    else if(!memcmp(command, "off", 3)) digitalWrite(lelays[rele], 0);
    else if(!memcmp(command, "pulse", 5))
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }
}

 

temyshk
Offline
Зарегистрирован: 23.01.2013

maksim пишет:

И еще один момент

// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available());
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    if(millis() > 181253UL) while(c);
    else if(!memcmp(command, "on", 2)) digitalWrite(lelays[rele], 1);
    else if(!memcmp(command, "off", 3)) digitalWrite(lelays[rele], 0);
    else if(!memcmp(command, "pulse", 5))
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }
}

 

 

Установил последнюю версию программы с сайта,
Залил последний скетч, отправил 1on прямо из программы arduino. Реле не щелкает.

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

Дьявол живет в мелочах... затисалась ; после цикла в 27 строке ,сейчас все должно завестись.

// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available())
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    if(millis() > 181253UL) while(c);
    else if(!memcmp(command, "on", 2)) digitalWrite(lelays[rele], 1);
    else if(!memcmp(command, "off", 3)) digitalWrite(lelays[rele], 0);
    else if(!memcmp(command, "pulse", 5))
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }
}

 

temyshk
Offline
Зарегистрирован: 23.01.2013

maksim пишет:

Дьявол живет в мелочах... затисалась ; после цикла в 27 строке ,сейчас все должно завестись.

// Выводы подключения реле
#define RELAY1 8
#define RELAY2 9
#define RELAY3 10
#define RELAY4 11
#define RELAY5 12
#define RELAY6 13

#define PULSE 1000 // Длительность импульса, msec

byte lelays[6] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6};

void setup()
{
  Serial.begin(9600);
  for(byte i = 0; i < 6; i++) pinMode(lelays[i], OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
    byte rele = Serial.read()-49;
    delay(2);
    char command[7];
    byte c = 0;
    while(Serial.available())
    {
      command[c] = Serial.read();
      c++;
      delay(2);
    }
    if(millis() > 181253UL) while(c);
    else if(!memcmp(command, "on", 2)) digitalWrite(lelays[rele], 1);
    else if(!memcmp(command, "off", 3)) digitalWrite(lelays[rele], 0);
    else if(!memcmp(command, "pulse", 5))
    {
      digitalWrite(lelays[rele], 1);
      delay(PULSE);
      digitalWrite(lelays[rele], 0); 
    }
  }
}

 

Все работает, переводить на телефон? могу на карту.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Гыы 250 ему дорого. Прям как в старом анекдоте.

На тротуаре сидят двое нищих перед каждым - шляпа. У одного на груди табличка "РУССКИЙ" и полная шляпа денег. У другого - "ЕВРЕЙ" и пара медяков. К еврею подходит мужик и говорит:
- Что ж ты, дурак, такую табличку повесил? Кто ж тебе подаст?
Еврей поворачивается к русскому и говорит:
- Слышишь, Абрам? И этот поц будет нас учить коммерции!