ATMEGa328-ESP12 Обратная связь

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, не соображу как мне наладить обратную связь между Atmega и ESP. Суть такая, нажали на кнопку соединенную с ATMEGA, загорелась лампочка. Еще раз нажали-выключилась. Тоже самое и с ESP. Но вот проблема в чем. Нажали на кнопку ATMEGA. лампа загорелась, нажимаю на кнопку ESP лампа гаснет.А вот потом нажимаю на кнопку ATMEGA лампа не загорается, она загорается если еще раз нажать. А нужно чтобы загоралась сразу. Вот схема. Вот мои куски скетчей для ATMEGA  и ESP. Подскажите пожалуйста где я запутался.

ATMEGA 328
if(digitalRead(4)==LOW && flag6==0 && flag33==0 ) //управление освещением от кнопки
   {
    delay(200);
    digitalWrite(16,HIGH);
    flag33=1;
     flag6=1;
   }   
   if(digitalRead(4)==HIGH &&flag6==1  ) //управление освещением от кнопки
   {
     flag6=0;     
   }
  if(digitalRead(4)==LOW && flag6==0 && flag33==1) //управление освещением от кнопки
   {
    delay(200);
    digitalWrite(16,LOW);
    flag33=2;
    }   
   if(digitalRead(4)==HIGH &&flag33==2 ) //управление освещением от кнопки
   {
     flag33=0;
     flag6=0;
   }
   if (digitalRead(14)==HIGH)
  {
    flag33=0;    
  }
////////////////////////////////////////////////////////////////////////////////
ESP-12
if (digitalRead(5)==LOW && flag==0)   //вход с atmega8 с пина 16 на реле для включения реле от кнопки пульта
  {
    digitalWrite(2, HIGH);
     flag=1;           
  }    
  if (digitalRead(5)==HIGH && flag==1 )   
    {      
      digitalWrite(2,LOW);
    flag=0;
    }
	
	if (digitalRead(2)== HIGH)   //вход с atmega8 с пина 21 на реле для включения реле от кнопки пульта
  {
     digitalWrite(13, HIGH);
     }
  else digitalWrite(13, LOW);

b707
Онлайн
Зарегистрирован: 26.05.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Фоторезистор поставь перед лампой, чтоб оба устройства знали её текущее состояние.  А лучше два. 

gzp13
Offline
Зарегистрирован: 06.04.2015

b707 пишет:

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

Почему странно,16 пин Атмеги-выход, 5 пин ЕСП-вход, 2пин ЕСП-выход, 14 пин Атмеги-вход.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

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

b707
Онлайн
Зарегистрирован: 26.05.2017

gzp13 пишет:

Почему странно,16 пин Атмеги-выход, 5 пин ЕСП-вход, 2пин ЕСП-выход, 14 пин Атмеги-вход.

а к лампе пины 16 и 2 как подключены? Что за лампа такая с тремя ногами - двумя входами и GND ?

gzp13
Offline
Зарегистрирован: 06.04.2015

b707 пишет:

gzp13 пишет:

Почему странно,16 пин Атмеги-выход, 5 пин ЕСП-вход, 2пин ЕСП-выход, 14 пин Атмеги-вход.

а к лампе пины 16 и 2 как подключены? Что за лампа такая с тремя ногами - двумя входами и GND ?

Да,не правильно нарисовал схему. Переделал. 



ATMEGA 328
if(digitalRead(4)==LOW && flag6==0 && flag33==0 ) //управление освещением от кнопки
   {
    delay(200);
    digitalWrite(16,HIGH);
    flag33=1;
     flag6=1;
   }   
   if(digitalRead(4)==HIGH &&flag6==1  ) //управление освещением от кнопки
   {
     flag6=0;     
   }
  if(digitalRead(4)==LOW && flag6==0 && flag33==1) //управление освещением от кнопки
   {
    delay(200);
    digitalWrite(16,LOW);
    flag33=2;
    }   
   if(digitalRead(4)==HIGH &&flag33==2 ) //управление освещением от кнопки
   {
     flag33=0;
     flag6=0;
   }
   if (digitalRead(14)==HIGH)
  {
    flag33=0;    
  }
////////////////////////////////////////////////////////////////////////////////
ESP-12
if (digitalRead(5)==LOW && flag==0)   //вход с atmega8 с пина 16 на реле для включения реле от кнопки пульта
  {
    digitalWrite(2, HIGH);
     flag=1;           
  }    
  if (digitalRead(5)==HIGH && flag==1 )   
    {      
      digitalWrite(2,LOW);
    flag=0;
    }
	
	if (digitalRead(2)== HIGH)   //вход с atmega8 с пина 21 на реле для включения реле от кнопки пульта
  {
     digitalWrite(13, HIGH);
     }
  else digitalWrite(13, LOW);

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Какой-то бред нарисован. Зачем все пины меж собой соединять? Зажигайте/тушите лампу 16 пином 328й меги по кнопке sa1, соответственно на 5 пине есп можете «видеть» - включена лампа или нет. А 13 выход есп использовать для «обратной связи», если нужно включать/выключать лампу с кнопки sa2 есп. Понятно излагаю?

gzp13
Offline
Зарегистрирован: 06.04.2015

BOOM пишет:

Какой-то бред нарисован. Зачем все пины меж собой соединять? Зажигайте/тушите лампу 16 пином 328й меги по кнопке sa1, соответственно на 5 пине есп можете «видеть» - включена лампа или нет. А 13 выход есп использовать для «обратной связи», если нужно включать/выключать лампу с кнопки sa2 есп. Понятно излагаю?

Понятно. А если надо ыключить лампу с ЕСП? Для этого я и задействовал выход 13 ЕСП. 

gzp13
Offline
Зарегистрирован: 06.04.2015

BOOM пишет:

Какой-то бред нарисован. Зачем все пины меж собой соединять? Зажигайте/тушите лампу 16 пином 328й меги по кнопке sa1, соответственно на 5 пине есп можете «видеть» - включена лампа или нет. А 13 выход есп использовать для «обратной связи», если нужно включать/выключать лампу с кнопки sa2 есп. Понятно излагаю?

Всмотрелся, и правда бред.Вот 13 пин для обратной связи я и не могу никак насторить. 

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Какая разница - включить или выключить? Обратной связи на это ср#ть ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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

gzp13
Offline
Зарегистрирован: 06.04.2015

BOOM пишет:

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

gzp13 пишет:

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

Ну, вообще говоря, вот так должно работать:

При включении меги инициализируем переменную состояния порта 16 (state = LOW; digitalWrite (16, state); ). Если нажали кнопку на меге - меняем состояние порта 16 на противоположное ( digitalWrite (16, !state); ). Есп в цикле считывает состояние своего порта 5 и запоминает его в какую-то свою переменную (а так же пхает это состояние в порт 13), например state_esp. Если же нужно управлять с есп, то по нажатии кнопки на есп пихаем в 13 порт противоположное состояние state_esp (!state_esp). Мега в цикле смотрит свой порт 14 и если его состояние отлично от state, то (по аналогии с кнопкой) пхает в 16 пин обратное состояние state. Все.

Скорее всего оптимизировать нужно будет потом, чтобы постоянно в порты не писать, но это потом - пусть сначала заработает так. И какую-то проверку работоспособности обратной связи тоже, иначе может фигня получиться ))

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

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

gzp13
Offline
Зарегистрирован: 06.04.2015

ua6em пишет:

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

Вторая кнопка виртуальная, в приложении BLYNK.

rkit
Онлайн
Зарегистрирован: 23.11.2016

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

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

gzp13
Offline
Зарегистрирован: 06.04.2015

ua6em пишет:

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

Вот на макетке собрал, подсоединил, написал код. Работает.

#include "GyverButton.h"
#define BTN_PIN1 2       // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#define BTN_PIN2 3
GButton butt1(BTN_PIN1);
GButton butt2(BTN_PIN2);
byte state;


void setup()
{
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(13, OUTPUT);
    butt1.setTickMode(AUTO);
  butt2.setTickMode(AUTO);
}
void loop()
{
  state=digitalRead(13);
  if (butt1.isPress()  )digitalWrite(13,!state);
  if (butt2.isPress())  digitalWrite(13,!state);
}

 

gzp13
Offline
Зарегистрирован: 06.04.2015

BOOM пишет:

gzp13 пишет:

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

Ну, вообще говоря, вот так должно работать:

При включении меги инициализируем переменную состояния порта 16 (state = LOW; digitalWrite (16, state); ). Если нажали кнопку на меге - меняем состояние порта 16 на противоположное ( digitalWrite (16, !state); ). Есп в цикле считывает состояние своего порта 5 и запоминает его в какую-то свою переменную (а так же пхает это состояние в порт 13), например state_esp. Если же нужно управлять с есп, то по нажатии кнопки на есп пихаем в 13 порт противоположное состояние state_esp (!state_esp). Мега в цикле смотрит свой порт 14 и если его состояние отлично от state, то (по аналогии с кнопкой) пхает в 16 пин обратное состояние state. Все.

Скорее всего оптимизировать нужно будет потом, чтобы постоянно в порты не писать, но это потом - пусть сначала заработает так. И какую-то проверку работоспособности обратной связи тоже, иначе может фигня получиться ))

Вот написал вроде так, как Вы подсказали, не работает((

//////////////КОД АТМЕГА 328/////////
int state=LOW;
void setup() {
  digitalWrite(16, state);
}
void loop() {
  state=(digitalRead(16));
  if (digitalRead(14)!=state)
 {
  digitalWrite(16,!state); 
 } 
if (butt3.isPress()  ) //нажали кн.Атмеги
{  
  delay(200);
   digitalWrite(16,!state);
   }

}

////////КОД ESP/////////////
int state_esp;
void setup()
{
  pinMode(5, INPUT);
}
void loop()
{
  state_esp = digitalRead(5);
  digitalWrite(13, state_esp);
  //нажали кноаку ЕСП
  digitalWrite(OUT_2, HIGH); //выход на лампочку
  digitalWrite((13), !state_esp);
}

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

можно чуть-чуть упростить:
 

#include "GyverButton.h"
#define BTN_PIN1 2       // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#define BTN_PIN2 3
GButton butt1(BTN_PIN1);
GButton butt2(BTN_PIN2);

void setup()
{
  butt1.setTickMode(AUTO);
  butt2.setTickMode(AUTO);
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
}

void loop()
{
  if (butt1.isPress() || butt2.isPress())digitalWrite(13,!digitalRead(13));
 }

 

gzp13
Offline
Зарегистрирован: 06.04.2015

Набросал скетч, но одновременно от ЕСП и Атмеги не работает(((

///////КОД ESP////////////////////
////////КОД ESP/////////////
int state_esp;
void setup()
{
  pinMode(5, INPUT);
  pinMode(13, OUTPUT);
}
BLYNK_WRITE(VBUTTO_2) {  ////КНОПКА ВКЛЮЧЕНИЯ СВЕТА V2
  int State = param.asInt();  // От виртуальной нопки получаем Число
  Blynk.virtualWrite(VBUTTO_2, State);
  digitalWrite((13), !state_esp);
}
void loop()
{
  state_esp = digitalRead(5);
  if (digitalRead(5) == state_esp  ) //вход с atmega8 с пина 16 на реле
  {
    Blynk.virtualWrite(VBUTTO_2, state_esp);
  }
  if (digitalRead(5) == !state_esp  )
  {
    Blynk.virtualWrite(VBUTTO_2, !state_esp);
  }
}
////////КОД АТМЕГА////////////////////////
//////////////КОД АТМЕГА 328/////////
int state = LOW;
void setup() {
  digitalWrite(16, state);
}
void loop() {
  state = (digitalRead(16));
  if (digitalRead(14) != state )
  {
    digitalWrite(16, !state);
  }
  if (butt3.isPress()  )
  {
    delay(200);
    digitalWrite(16, !state);
  }
}

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

gzp13 пишет:

Набросал скетч, но одновременно от ЕСП и Атмеги не работает(((

///////КОД ESP////////////////////
////////КОД ESP/////////////
int state_esp;
void setup()
{
  pinMode(5, INPUT);
  pinMode(13, OUTPUT);
}
BLYNK_WRITE(VBUTTO_2) {  ////КНОПКА ВКЛЮЧЕНИЯ СВЕТА V2
  int State = param.asInt();  // От виртуальной нопки получаем Число
  Blynk.virtualWrite(VBUTTO_2, State);
  digitalWrite((13), !state_esp);
}
void loop()
{
  state_esp = digitalRead(5);
  if (digitalRead(5) == state_esp  ) //вход с atmega8 с пина 16 на реле
  {
    Blynk.virtualWrite(VBUTTO_2, state_esp);
  }
  if (digitalRead(5) == !state_esp  )
  {
    Blynk.virtualWrite(VBUTTO_2, !state_esp);
  }
}
////////КОД АТМЕГА////////////////////////
//////////////КОД АТМЕГА 328/////////
int state = LOW;
void setup() {
  digitalWrite(16, state);
}
void loop() {
  state = (digitalRead(16));
  if (digitalRead(14) != state )
  {
    digitalWrite(16, !state);
  }
  if (butt3.isPress()  )
  {
    delay(200);
    digitalWrite(16, !state);
  }
}

 

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

gzp13
Offline
Зарегистрирован: 06.04.2015

Подскажите в чем ошибка? 2 дня бьюсь, не думал что это будет такой проблемой.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

gzp13 пишет:
2 дня бьюсь

Потому, что ты хочешь странного

gzp13
Offline
Зарегистрирован: 06.04.2015

А в чем странность?

gzp13
Offline
Зарегистрирован: 06.04.2015

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

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

gzp13 пишет:

А в чем странность?

в том, что ты отлаженный код выкинул и начинаешь писать всё заново, тебе осталось написать для ESP код эмулирующий кнопку и подключить выход ESP на вход атмеги, вместо любой из кнопок

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

управлять нагрузкой должно только одно устройство, иначе устроишь тяни-толкай на шине, с пожаром и спецэффектами.  Второе устройство не должно иметь физический доступ к нагрузке, оно должно уметь передавать в другое устройство свои пожелания и запрашивать у него текущее состояние 

gzp13
Offline
Зарегистрирован: 06.04.2015

ua6em пишет:

gzp13 пишет:

А в чем странность?

в том, что ты отлаженный код выкинул и начинаешь писать всё заново, тебе осталось написать для ESP код эмулирующий кнопку и подключить выход ESP на вход атмеги, вместо любой из кнопок

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

gzp13
Offline
Зарегистрирован: 06.04.2015

DetSimen пишет:

управлять нагрузкой должно только одно устройство, иначе устроишь тяни-толкай на шине, с пожаром и спецэффектами.  Второе устройство не должно иметь физический доступ к нагрузке, оно должно уметь передавать в другое устройство свои пожелания и запрашивать у него текущее состояние 

 Я так и сделал же, реле (лампа)включаются по сигналу с атмеги, Или Вы намекаете что надо делать вот по такой схеме?

Смысл устройства такой. Блок управления на Атмеге328. С него можно включить например обогрев. А через ESP и приложение Блинк я хочу отслеживать, что обогрев включен,т.е горит лампа в приложении. И так же при нажатии кнопки в приложении обогрев должен выключиться.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

и где ты видишь также? где Гайверовская библиотека, где обработка второй кнопки?
 

////////КОД АТМЕГА////////////////////////
//////////////КОД АТМЕГА 328/////////
int state = LOW;
void setup() {
  digitalWrite(16, state);
}
void loop() {
  state = (digitalRead(16));
  if (digitalRead(14) != state )
  {
    digitalWrite(16, !state);
  }
  if (butt3.isPress()  )
  {
    delay(200);
    digitalWrite(16, !state);
  }
}

 

gzp13
Offline
Зарегистрирован: 06.04.2015

ua6em пишет:

и где ты видишь также? где Гайверовская библиотека, где обработка второй кнопки?
 

////////КОД АТМЕГА////////////////////////
//////////////КОД АТМЕГА 328/////////
int state = LOW;
void setup() {
  digitalWrite(16, state);
}
void loop() {
  state = (digitalRead(16));
  if (digitalRead(14) != state )
  {
    digitalWrite(16, !state);
  }
  if (butt3.isPress()  )
  {
    delay(200);
    digitalWrite(16, !state);
  }
}

 

тут нету, просто на макетке по быстрому залил и указал другие пины.

Logik
Offline
Зарегистрирован: 05.08.2014

Для потомков, нашедших этот топик в будущем, пишу. Мы, жители 20-х годов 21-го века, отлично знаем что атмега и esp отлично связываются uart на скоростях вплоть до 250КБод. Просто среди нас есть недоумки ищущие свой, совершенно оригинальный путь в 3.14...

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

DetSimen пишет:

управлять нагрузкой должно только одно устройство, иначе устроишь тяни-толкай на шине, с пожаром и спецэффектами.  Второе устройство не должно иметь физический доступ к нагрузке, оно должно уметь передавать в другое устройство свои пожелания и запрашивать у него текущее состояние 

1. Выделенное не обязательно.

2. Можно проще.

Итак:

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

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

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

Все!

Никакой обратной связи, никаких пожеланий, никаких запросов.

 

PS. Каждый из контроллеров можно заменить на триггер - как раз есть по паре штук в одном корпусе.

gzp13
Offline
Зарегистрирован: 06.04.2015

После долгих мучений, я выяснил в чем проблема. При нажатии на кнопку V2 в приложении, загорается кнопка V2 в приложении,но вот лог.1 так и висит, а мне надо чтобы она перешла в лог.0 и при этом кнопка V2 продолжала гореть. Как сделать в скетче так?

BLYNK_WRITE(VBUTTO_2)
{
int State = param.asInt();
Blynk.virtualWrite(VBUTTO_2, State);
digitalWrite(15,State);
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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

gzp13
Offline
Зарегистрирован: 06.04.2015

BOOM пишет:

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

Так нарисовал))

BLYNK_WRITE(VBUTTO_2)
{
int State = param.asInt();
Blynk.virtualWrite(VBUTTO_2, State);
digitalWrite(15,State);
}

Загвоздка в том, что лог.1 висит постоянно пока я не изменю состояние пина. А надо чтобы я нажал вирт.кнопку SA2 и на изменила свое состояние как обычная кнопка, т.е нажал-1,и через допустим 100мс(как будто я кнопку отпустил) она вернулась в исходное состояние в лог.0. А так получается мне надо нажимать на кнопку 2 раза чтобы она изменила свое состояние .