управление восемью реле

murhub
Offline
Зарегистрирован: 29.02.2016

здраствуйте 

не судите строги за ошибки )))

задачу себе поставили сделать так чтобы через блютуз открывать и закрывать двери в машине 

заказали платы arduino uno и блоки парных реле, стабилизатор для блютуз , сам блютуз hc-05, пинижалу питания с 12 до 5 вольт

пока они едут человек пишет прогу на андроид я скетч для ардуинки 

char incomingByte;  // входящие данные
int  rele1 = 3;      // LED подключен к 3пину итд
int  rele2 = 4;
int  rele3 = 5;
int  rele4 = 6;
int  rele5 = 7;
int  rele6 = 8;
int  rele7 = 9;
int  rele8 = 10;
 
void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(rele1, OUTPUT); //Устанавливаем 3 вывод как выход итд
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(rele6, OUTPUT);
  pinMode(rele7, OUTPUT);
  pinMode(rele8, OUTPUT);
  }
 
void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    if(incomingByte == '1') 
    {
       digitalWrite(rele1, HIGH);  // то включаем реле 1
       Serial.println("левое переднее окно вверх");  // и отправляем обратно сообщение 
    }
    if(incomingByte == '2') 
    {
       digitalWrite(rele2, HIGH); 
       Serial.println("левое переднее окно вниз"); 
    }
    if(incomingByte == '3') 
    {
       digitalWrite(rele3, HIGH);  
       Serial.println("левое заднее окно вверх");  
    }
    if(incomingByte == '4') 
    {
       digitalWrite(rele4, HIGH);  
       Serial.println("левое заднее окно вниз");  
    }
    if(incomingByte == '5') 
    {
       digitalWrite(rele5, HIGH);  
       Serial.println("правое переднее окно вверх");
    }
    if(incomingByte == '6') 
    {
       digitalWrite(rele6, HIGH);  
       Serial.println("правое переднее окно вниз");  
    }
    if(incomingByte == '7') 
    {
       digitalWrite(rele7, HIGH); 
       Serial.println("правое заднее окно вверх"); 
    }
    if(incomingByte == '8') 
    {
       digitalWrite(rele8, HIGH); 
       Serial.println("правое заднее окно вверх");  
    }
    delay (400) // ожидаем 400 миллисекунд и вырубаем все реле
    digitalWrite(rele1, LOW);
    digitalWrite(rele2, LOW);
    digitalWrite(rele3, LOW);
    digitalWrite(rele4, LOW);
    digitalWrite(rele5, LOW);
    digitalWrite(rele6, LOW);
    digitalWrite(rele7, LOW);
    digitalWrite(rele8, LOW);
    
  }
}
 
я понимаю что у меня реле будет работать с перерывами если и будет работать программа
посмотрите посоветуйте 
спс
Radjah
Offline
Зарегистрирован: 06.08.2014

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

https://www.arduino.cc/en/Reference/SwitchCase

В начале вместо "int" пиши "const int".

Реле могут управлять и инверсным уровнем.

После Serial.read я бы принудительно flush делал, чтобы не было задержки в 0,4 секунды, если в буфере мусор.

murhub
Offline
Зарегистрирован: 29.02.2016

я про flush не понял вы писали его для очистки буфера последовательного порта ??

и про инверсный уровень тоже не понял поясните это если пины менять на другие ???

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Прилетает в порт "1<CR><LF>"

Программа обрабатывает "1", потом ждет 0,4 сек и гасит все.

Потом по условию сразу попадаем на 0,4 сек и еще раз.

Сбрасывать буфер или добавить дполонительную проверку на левые данные. C помощью case...switch делается легко, просто и красиво.

Если реле "такие синенькие", то у них один контакт нормально замкнут, а второй нормально разомкнут. Переключение происходит при подаче на пин низкого уровня.

murhub
Offline
Зарегистрирован: 29.02.2016
   switch (Serial.read()); 
    case 1: 
       digitalWrite(rele1, HIGH);  // то включаем реле 1
       Serial.println("левое переднее окно вверх");  // и отправляем обратно сообщение 
    break;

что то у меня с switch не получается 

case label '1' not within a switch statement

не могу понять что то вроде не пашет просто единичка в свитче говорит 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

case '1' :

murhub
Offline
Зарегистрирован: 29.02.2016

когда написал 

case '1' :
 
выдает 
case label ''1'' not within a switch statement
 
))) может у меня что то глючит
 
Radjah
Offline
Зарегистрирован: 06.08.2014

А где вигурные скобки? Ну для чего не лесом послал, а ссылку дал?

Radjah
Offline
Зарегистрирован: 06.08.2014

С разбегу как-то так.

char incomingByte;  // входящие данные
const int  rele1 = 3;      // LED подключен к 3пину итд
const int  rele2 = 4;
const int  rele3 = 5;
const int  rele4 = 6;
const int  rele5 = 7;
const int  rele6 = 8;
const int  rele7 = 9;
const int  rele8 = 10;

void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(rele1, OUTPUT); //Устанавливаем 3 вывод как выход итд
  pinMode(rele2, OUTPUT);
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(rele6, OUTPUT);
  pinMode(rele7, OUTPUT);
  pinMode(rele8, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    switch (incomingByte) {
      case '1':
        digitalWrite(rele1, HIGH);  // то включаем реле 1
        Serial.println(F("левое переднее окно вверх"));  // и отправляем обратно сообщение
        AllOFF();
        break;
      case '2':
        digitalWrite(rele2, HIGH);
        Serial.println(F("левое переднее окно вниз"));
        AllOFF();
        break;
      case '3':
        digitalWrite(rele3, HIGH);
        Serial.println(F("левое заднее окно вверх"));
        AllOFF();
        break;
      case '4':
        digitalWrite(rele4, HIGH);
        Serial.println(F("левое заднее окно вниз"));
        AllOFF();
        break;
      case '5':
        digitalWrite(rele5, HIGH);
        Serial.println(F("правое переднее окно вверх"));
        AllOFF();
        break;
      case '6':
        digitalWrite(rele6, HIGH);
        Serial.println(F("правое переднее окно вниз"));
        AllOFF();
        break;
      case '7':
        digitalWrite(rele7, HIGH);
        Serial.println(F("правое заднее окно вверх"));
        AllOFF();
        break;
      case '8':
        digitalWrite(rele8, HIGH);
        Serial.println(F("правое заднее окно вверх"));
        AllOFF();
        break;
      default:
        // Do nothing
        {}
    }
  }
}

void AllOFF() {
  delay (400); // ожидаем 400 миллисекунд и вырубаем все реле
  digitalWrite(rele1, LOW);
  digitalWrite(rele2, LOW);
  digitalWrite(rele3, LOW);
  digitalWrite(rele4, LOW);
  digitalWrite(rele5, LOW);
  digitalWrite(rele6, LOW);
  digitalWrite(rele7, LOW);
  digitalWrite(rele8, LOW);
}

 

murhub
Offline
Зарегистрирован: 29.02.2016

Radjah пишет:

А где вигурные скобки? Ну для чего не лесом послал, а ссылку дал?

про скобки я вьехал просто не увидел 

и это т код как и мой выдает 

'char incomingByte' previously declared here 

типа раньше определен

что то не то с этой структурой

на сколько я понял switch сам пытаеться определять переменные 

murhub
Offline
Зарегистрирован: 29.02.2016
пока остановился на если только подправил вашей подпрограммой спасибо
теперь другой вопрос
можноли не устанавливая порты на выход посмотреть что на них High или LOW
я к тому что если уже получил из стека единичку и реле уже включено получив следующую единичку просто проверить стоит ли High и если стоит то ничего не делать
if(incomingByte == '1') 
    {
       if (digitalRead (rele1) = LOW) { 
       digitalWrite(rele1, HIGH);  // то включаем реле 1
       Serial.println("левое переднее окно вверх");  // и отправляем обратно сообщение 
       }
      
    }

 

или мне надо подключить другои пин с установкой его на вход и через него следить