помогите =( Параллельное управление реле через bluetooth и кнопки
- Войдите на сайт для отправки комментариев
Втр, 22/03/2016 - 10:36
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);
}
в итоге реле слушается только блютуз и полностью игнорит рубильник
необходимо сделать паралельное управление реле и с рубильника и с блютуз
13 пин для кнопки неудачный выбор. выбери любой другой кроме 0 и 1 и сделай подтяжку
да и какой смысл использовать switch. if else логичнее сюда
пробывал и с if else . всеравно реле управляется либо через блютуз либо через рубильник, но не паралельно.
если отключить пин rx на ардуино, то реле управляется через рубильник. Но если включить порт rx обратно то только по блютуз
я бы немного поменял подход. считываем с блютуз и записываем в переменную. храним старое значение с блютуз. аналогично для кнопки.
затем сравниваем старое значение с новым для блютуз и для кнопки и там где произошло изменение то и устанавливаем, и там где было изменение записываем текущее значение в старое
Во-первых: зачем вторую одинакувую тему открывать?
Во-вторых: все правильно работает - так и будет. Вы же не факт нажатия на кнопку или факт передачи комманды с блютуза обрабатываете, а просто читаете состояние кнопки/блютуза. И по факту у вас оба этих состояния в релюху пишутся.
Например, по блютузу идет комманда "0" n=0, кнопка при этом нажата m=1. релюха по состоянию кнопки включится и тут же по комманде блютуз выключится (вы это не заметите из-за инерционности реле), дальше в следующем лупе она будет >200 миллисекунд выключена, и по новой тоже самое.
Поставьте между 31 и 32 строками задержку, и посмотрите...
Вам нужно обрабатывать изменение состояния кнопки (и блютуза), и только по изменению состояния переключать реле.
немогу реалезовать, не подскажешь как подробнее это сделать?
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); }в итоге с блютуз можно включить но нельзя выключить, а с руюильника можно выключить но нельзя включить.
Жека вам подробно описал.
Например, для кнопки:
в сетапе:
старое_значение_кнопки=считали состояние пина
в лупе:
новое_значение_кнопки=считали состояни пина
если старое_значение_кнопки != новое_значение_кнопки то поменяли состояние реле и записали новое_значение_кнопки в старое_значение_кнопки
тоже самое для блютуза
строки 28 и 29 выносим в сетап
строки 18 и 24 меняем на digitalWrite(s, !digitalRead(s));
строки 19 и 35 ставим проверку если digitalRead(s)=высокий то отправить ХАЙ иначе отправить ЛОУ (ну или наоборот - как вам там нужно)
после строки 20 добавляем ns=n;
после строки 26 добавляем ms=m;
тупо запутался что куда, строки меняются
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); } }вот досюда дошел, потом сломался мозг
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; } }вообще все сломалось и мой мозг и скетч
Упростим (для кода из поста 11)
строку 18 меняем на if (n!=ns || m!=ms)
между 30 и 31 добавляем ns=n; ms=m;
c 32 по 37 удаляем
#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); } }по блютуз полный игнор передает только значения
to jeka_tm Так рассинхрон между кнопкой и блютусом будет. Т.е. если было включено кнопкой, а выключено блютусом, то чтоб снова включить кнопкой надо будет кноку сначала выключить, а потом включить. Хотя, в некоторых случаях это может быть корректно.
по блютуз полный игнор передает только значения
с каким кодом?
Вы проверили, что с блютуса идут данные, как вам в самом начале советовали?
если я правильно тебя понял то рассинхрон будет только если одновременно и по блютуз и от кнопки будут разные данные, но такое маловероятно, если конечно долго не держать кнопку. но согласен код надо допиливать
надо вообще приоритет может поставить. что важнее блютуз или кнопка если получится одновременно
и вообще что приходит в блютуза: текущее значение или HIGH один раз отправляется?
с кодом Евгения.
да идет
пробуй. и ответь на мои вопросы
#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; }с рубильника работает , но с блютуз не переключает реле.
в терменале я отправляю один раз значение 1 или 0 , если ты про это.
я просто новичек
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
работает!!! ЕХУУУ=)))))) наконец 23 пост
все здорово, только:
использовал плату про микра: http://web.igrosfera.net/2014/01/китайский-аналог-arduino-leonardo-pro-micro/ , при заливке скетча, пришлось отсоединять блютуз модуль, иначе не зальешь, в качестве нагрузки - модуль с реле, так вот, после заливки скетча реле переключается (дребезжит), пока не вставишь блютуз модуль обратно, и такая же картина в момент установления связи с андроидом по блютуз (дребезг-переключение секунды 2-3) delay не помог, как переделать скетч пока не додумал, а идея хорошая, включать и выключать свет по блютузу и выключателем независимо. (если кому пригодится - функцию использовал Serial1, Serial - cоединяет с монитором порта компьютера (для платы Leonardo Pro Micro ATmega32U4)
какой бред далает даже не думая.
какой может быть тут независимое использование.
ну включен у тебя выключатель. а ты по блютузу пытаещься его вырубить. и что?! вырубишь? :))))
конечно да, выключается и включается с любого места, если включено блютузом выключается тумблером (переключателем на 3 ножках, центральный к пину, 1й к +, 3й к-), каждый следующий сигнал меняет состояние реле, независимо, откуда он приходит. Иначе нет смысла это делать для комнаты, пришел, включил выключателем, лег, выключил по блютузу( а люстру включает реле) только нестабильно работает в момент установления связи с андроида по блютузу
тублем у себя в голове включи.
если ты выключатель используешь тупо как кнопку для ардуино это одно а если там включаешь 220в это другое.
и то что у тебя хорошо получается на проводе длиной 20см не значит что это будет работать на проводе длиной несколько метров.
тублем у себя в голове включи.
зачем писать, если нечего сказать