помогите =( Параллельное управление реле через bluetooth и кнопки

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016
int n;
int m;
int s = 2; //подключено реле
void setup()
{
  Serial.begin(9600);
  pinMode(s, OUTPUT);
  pinMode(13, INPUT);  //подключен рубильник 
}
void loop()
{     
  delay(100);   
    if (Serial.available()) //считываеем блютуз 
    {
    n = Serial.read();
    }       
    m = digitalRead(13);    //считываем рубильник
  delay(100);    
    switch (m)  // смотрим что на рубильнике 
  {
    case 0:        //если ноль то реле выключено
    digitalWrite(s, HIGH); //передаем на реле лог еденицу чтоб оно оставалось выключено
    Serial.print("LOW   "); // передаем на блютуз инфу
    Serial.println(millis()/1000); //передаем время на блютуз
    break;
    case 1:    //если один то реле включено
    digitalWrite(s, LOW);  
    Serial.print("HIGH  ");
    Serial.println(millis()/1000);
    break;
  }
   switch (n)  //смотрим что на блютуз
   {
    case '0':   //если ноль то реле выключено
     digitalWrite(s, HIGH);      
    Serial.print("LOW BL   ");
    Serial.println(millis()/1000);
    break;
    case '1':     //если один то реле включено
     digitalWrite(s, LOW);
    Serial.print("HIGH BL  ");
    Serial.println(millis()/1000);
    break;
  } 
  delay(1000);  
}

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

13 пин для кнопки неудачный выбор. выбери любой другой кроме 0 и 1 и сделай подтяжку

да и какой смысл использовать switch. if else логичнее сюда

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

пробывал и с if else . всеравно реле управляется либо через блютуз либо через рубильник, но не паралельно.

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

если отключить пин rx на ардуино, то реле управляется через рубильник. Но если включить порт rx обратно то только по блютуз

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я бы немного поменял подход. считываем с блютуз и записываем в переменную. храним старое значение с блютуз. аналогично для кнопки.

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

okta
Offline
Зарегистрирован: 10.01.2015

Во-первых: зачем вторую одинакувую тему открывать?

Во-вторых: все правильно работает - так и будет. Вы же не факт нажатия на кнопку или факт передачи комманды с блютуза обрабатываете, а просто читаете состояние кнопки/блютуза. И по факту у вас оба этих состояния в релюху пишутся.

Например, по блютузу идет комманда "0" n=0, кнопка при этом нажата m=1. релюха по состоянию кнопки включится и тут же по комманде блютуз выключится (вы это не заметите из-за инерционности реле), дальше в следующем лупе она будет >200 миллисекунд выключена, и по новой тоже самое.

Поставьте между 31 и 32 строками задержку, и посмотрите...

Вам нужно обрабатывать изменение состояния кнопки (и блютуза), и только по изменению состояния переключать реле.

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

немогу реалезовать, не подскажешь как подробнее это сделать?

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016
int n; //начальное
int ns; // после цикла
int m;//начальное
int ms;// после цикла
int s = 2;// реле
void setup()
{
  Serial.begin(9600);
  pinMode(s, OUTPUT);
  pinMode(13, INPUT);  //рубильник
}
void loop()
{  
  n = Serial.read();   //читаем блютуз      
  m = digitalRead(13);  //читаем рубильник
  if (  n != ns ) 
  {
    digitalWrite(s, LOW);
    Serial.print("HIGH  ");
    Serial.println(millis()/1000);
  }
  if (  m != ms )
  {
    digitalWrite(s, HIGH);
    Serial.print("LOW  ");
    Serial.println(millis()/1000);
  }
  ns = Serial.read();         
  ms = digitalRead(13);
}

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

okta
Offline
Зарегистрирован: 10.01.2015

Жека вам подробно описал.

Например, для кнопки:

в сетапе:

старое_значение_кнопки=считали состояние пина

в лупе:

новое_значение_кнопки=считали состояни пина

если старое_значение_кнопки != новое_значение_кнопки то поменяли состояние реле и записали новое_значение_кнопки в старое_значение_кнопки

тоже самое для блютуза

okta
Offline
Зарегистрирован: 10.01.2015

строки 28 и 29 выносим в сетап

строки 18 и 24 меняем на digitalWrite(s, !digitalRead(s));

строки 19 и 35 ставим проверку если digitalRead(s)=высокий то отправить ХАЙ иначе отправить ЛОУ (ну или наоборот - как вам там нужно)

после строки 20 добавляем ns=n;

после строки 26 добавляем ms=m;

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

тупо запутался что куда, строки меняются

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016
int n;
int ns;
int m;
int ms;
int s = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(s, OUTPUT);
  pinMode(13, INPUT); 
  ns = Serial.read(); 
  ms = digitalRead(13);
}
void loop()
{  
  n = Serial.read();   //читаем блютуз      
  m = digitalRead(13);  //читаем рубильник
  if (  n != ns ) 
  {
   digitalWrite(s, !digitalRead(s));   
    if (digitalRead(s) == HIGH)
    {
      Serial.print("HIGH  ");    
      Serial.println(millis()/1000);
    }
    else
    {
      Serial.print("LOW  ");
      Serial.println(millis()/1000);
    }
  }
  if (  m != ms )
  {
    digitalWrite(s, !digitalRead(s));
    Serial.print("LOW  ");
    Serial.println(millis()/1000);
  }   
}

вот досюда дошел, потом сломался мозг

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016
int n;
int ns;
int m;
int ms;
int s = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(s, OUTPUT);
  pinMode(13, INPUT); 
  ns = Serial.read(); 
  ms = digitalRead(13);
}
void loop()
{  
  n = Serial.read();   //читаем блютуз      
  m = digitalRead(13);  //читаем рубильник
  if (  n != ns ) 
  {
   digitalWrite(s, !digitalRead(s));   
    if (digitalRead(s) == HIGH)
    {
      digitalWrite(s, LOW);
      Serial.print("HIGH  ");    
      Serial.println(millis()/1000);
    }
    else
    {
      digitalWrite(s, HIGH);
      Serial.print("LOW  ");
      Serial.println(millis()/1000);
    }
    ns=n;
  }
  if (  m != ms )
  {
    digitalWrite(s, !digitalRead(s));
     if (digitalRead(s) == HIGH)
    {
      digitalWrite(s, LOW);
      Serial.print("HIGH  ");    
      Serial.println(millis()/1000);
    }
    else
    {
      digitalWrite(s, HIGH);
      Serial.print("LOW  ");
      Serial.println(millis()/1000);
    }    
    ms=m;
  }   
}

вообще все сломалось и мой мозг и скетч

okta
Offline
Зарегистрирован: 10.01.2015

Упростим (для кода из поста 11)

строку 18 меняем на if (n!=ns || m!=ms)

между 30 и 31 добавляем ns=n; ms=m;

c 32 по 37 удаляем

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
#define out    2
#define button 3

boolean n, ns, m, ms;

void setup(){
  Serial.begin(9600);
  pinMode(out, OUTPUT);
  pinMode(button, INPUT_PULLUP); 
  ns = Serial.read(); 
  ms = digitalRead(13);
}
void loop(){  
  n = Serial.read();    //читаем блютуз      
  m = digitalRead(13);  //читаем рубильник
  if (n != ns){
    digitalWrite(out, n);
    ns=n;
    Serial.print("bluetouch=  "); 
    Serial.println(n);   
  }
  if (m != ms){
    digitalWrite(out, m);
    ms=m;
    Serial.print("button=  "); 
    Serial.println(m);   
  }
}

 

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

по блютуз полный игнор передает только значения

okta
Offline
Зарегистрирован: 10.01.2015

to jeka_tm Так рассинхрон между кнопкой и блютусом будет. Т.е. если было включено кнопкой, а выключено блютусом, то чтоб снова включить кнопкой надо будет кноку сначала выключить, а потом включить. Хотя, в некоторых случаях это может быть корректно.

microms пишет:

по блютуз полный игнор передает только значения

с каким кодом?

Вы проверили, что с блютуса идут данные, как вам в самом начале советовали?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

надо вообще приоритет может поставить. что важнее блютуз или кнопка если получится одновременно

и вообще что приходит в блютуза: текущее значение или HIGH один раз отправляется?

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

с кодом Евгения.

да идет 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пробуй. и ответь на мои вопросы

#define out    2
#define button 3

boolean n, ns, m, ms;
boolean state=0;
boolean flag=0;
unsigned long time=1;

void setup(){
  Serial.begin(9600);
  pinMode(out, OUTPUT);
  pinMode(button, INPUT_PULLUP); 
  ns = Serial.read(); 
  ms = digitalRead(13);
}
void loop(){  
  n = Serial.read();    //читаем блютуз      
  m = digitalRead(13);  //читаем рубильник
  if (n != ns && flag){
    state=!state;
    flag=0;
    time=millis();
    ns=n;
  }
  if (m != ms && flag){
    state=!state;
    flag=0;
    time=millis();
    ms=m;
  }
  digitalWrite(out, state);
  if((millis()-time)>2000 && !flag) flag=1;
}

 

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

с рубильника работает , но с блютуз не переключает реле. 

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

в терменале я отправляю один раз значение 1 или 0 , если ты про это.

я просто новичек

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

okta
Offline
Зарегистрирован: 10.01.2015
int n;
int ns;
int m;
int ms;
int s = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(s, OUTPUT);
  pinMode(3, INPUT_PULUP); 
  ns = Serial.read(); 
  ms = digitalRead(3);
}
void loop()
{ 
  if (Serial.available()) 
  { 
  n = Serial.read();   //читаем блютуз      
  }
  m = digitalRead(3);  //читаем рубильник
  if (  n != ns || m!=ms ) 
  {
   digitalWrite(s, !digitalRead(s));   
    if (digitalRead(s) == HIGH)
    {
      Serial.print("HIGH  ");    
      Serial.println(millis()/1000);
    }
    else
    {
      Serial.print("LOW  ");
      Serial.println(millis()/1000);
    }
  ns=n;
  ms=m;
  }
}

Кнопку подключи к пину 3

microms
microms аватар
Offline
Зарегистрирован: 22.03.2016

работает!!! ЕХУУУ=)))))) наконец  23 пост

bojarinov
Offline
Зарегистрирован: 24.11.2016

все здорово, только:

использовал плату про микра: http://web.igrosfera.net/2014/01/китайский-аналог-arduino-leonardo-pro-micro/ , при заливке скетча, пришлось отсоединять блютуз модуль, иначе не зальешь, в качестве нагрузки - модуль с реле, так вот, после заливки скетча реле переключается (дребезжит), пока не вставишь блютуз модуль обратно, и такая же картина в момент установления связи с андроидом по блютуз (дребезг-переключение секунды 2-3) delay не помог, как переделать скетч пока не додумал, а идея хорошая, включать и выключать свет по блютузу и выключателем независимо. (если кому пригодится - функцию использовал Serial1, Serial - cоединяет с монитором порта компьютера (для платы Leonardo Pro Micro ATmega32U4)

arDubino
Offline
Зарегистрирован: 12.01.2017

какой бред далает даже не думая.

какой может быть тут независимое использование.

ну включен у тебя выключатель. а ты по блютузу пытаещься его вырубить. и что?! вырубишь? :))))

bojarinov
Offline
Зарегистрирован: 24.11.2016

конечно да, выключается и включается с любого места, если включено блютузом выключается тумблером (переключателем на 3 ножках, центральный к пину, 1й к +, 3й к-),  каждый следующий сигнал меняет состояние реле, независимо, откуда он приходит. Иначе нет смысла это делать для комнаты, пришел, включил выключателем, лег, выключил по блютузу( а люстру включает реле) только нестабильно работает в момент установления связи с андроида по блютузу

arDubino
Offline
Зарегистрирован: 12.01.2017

тублем у себя в голове включи.

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

и то что у тебя хорошо получается на проводе длиной 20см не значит что это будет работать на проводе длиной несколько метров.

bojarinov
Offline
Зарегистрирован: 24.11.2016

arDubino пишет:

тублем у себя в голове включи.

зачем писать, если нечего сказать