Аквасторож

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Пытаюсь.
Попробуйте вообще датчик отключить. Все равно глючит?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а):Попробуйте вообще датчик отключить. Все равно глючит?
Попробую. Напишу потом.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а):Попробуйте вообще датчик отключить. Все равно глючит?
Отключил. Не глючит. Как быть?
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Отключил. Не глючит. Как быть?
Надо почитать как длинные провода подключать.
Возможно это наводки какие то.

ПС: Исчезну на неделю в командировку.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Пытаюсь освоить программирование. Написал скетч в самом Arduino IDE.
Спойлер

Код: Выделить всё

int leak0 = 0;//датчики протечки
int leak1 = 1;
int leak2 = 2;
int leak3 = 3;
int leak4 = 4;
int lalrm = 5;//лампа аварии
int lcls = 6;//лампа закрыто
int lopn = 7;//лампа открыто
int brst = 8;//кнопка сброс
int bcls = 9;//кнопка закрыть
int bopn = 10;//кнопка открыть
int in1 = 11;//команда закрыть
int in2 = 12;//команда открыть
bool alrm = 0;
//bool cls = 0;
//bool opn = 0;
  void setup ()
  {
    pinMode (leak0 , INPUT);
    pinMode (leak1 , INPUT);
    pinMode (leak2 , INPUT);
    pinMode (leak3 , INPUT);
    pinMode (leak4 , INPUT);
    pinMode (lalrm , OUTPUT);
    pinMode (lcls , OUTPUT);
    pinMode (lopn , OUTPUT);
    pinMode (brst , INPUT);
    pinMode (bcls , INPUT);
    pinMode (bopn , INPUT);
    pinMode (in1 , OUTPUT);
    pinMode (in2 , OUTPUT);
    int in1 = HIGH;
    int in2 = HIGH;
    clse();
    alarm();
    opne();
    }
    
    void loop()
    {
      if (digitalRead (leak0) == HIGH)
      {
        alrm = 1;
        //cls = 1;
        clse();                
      }
      
      if (alrm == 1)
      {
        alarm();
      }
      
      if (digitalRead (bcls) == HIGH)
      {
        //cls = 1;
        clse();        
      }
      
      if (digitalRead (brst) == HIGH)
      {
        alrm = 0;
      }
      
      if ((digitalRead (bopn) == HIGH) && (alrm == 0))
      {
        opne();
        //opn = 1;
      }
      
    }
        
    void clse()
    {
      digitalWrite (in1, LOW);
      digitalWrite (lopn, LOW);
      digitalWrite (lcls, HIGH);
      //opn = 0;
      delay (4000);
      digitalWrite (in1, HIGH);      
    }
    
    void opne()
    {
      digitalWrite (in1, HIGH);
      //cls = 0;
      digitalWrite (in2, LOW);
      digitalWrite (lcls, LOW);
      digitalWrite (lopn, HIGH);
      delay (4000);
      digitalWrite (in2, HIGH);
    }
    
    void alarm()
    {
      digitalWrite (lalrm, HIGH);
      delay (500);
      digitalWrite (lalrm, LOW);
      if (alrm == 1)
      {
        alarm();
      }
      
    }
      
Разбил функции по подпрограммам. Будет ли так работать? Будет ли работать блок alarm? Хочется что бы при срабатывании аварии лампа моргала, а при нажатии Сброс все возвращалось все в исходное состояние.
Gisteresis писал(а):Возможно это наводки какие то.
Походу надо провод экранированный?
Последний раз редактировалось seval Пт апр 04, 2014 18:25:55, всего редактировалось 1 раз.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Будет ли так работать?
Надо прошить и попробовать. Если будет что то не так, будем разбираться. В начале я бы не подключал мощные нагрузки, протестил бы из заменив светодиодом с резистором последовательно. Если все гуд, пробуем уже на реальных устройствах.
С языком ардуино не знаком, сильно в код не вникал (знаю кучу других языков), но с виду все вроде нормально.
seval писал(а):Походу надо провод экранированный?
Тут тоже сложно сказать, нужно пробовать.
Возможно промежуточный усилитель надо поставить.

Вы уже читали про длинные провода, как там делают?
Если у вас не получится, приеду почитаю, что там к чему. Мне это тоже понадобится.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а):Надо прошить и попробовать.
Я сегодня попробовал. Галиматья какая то. При запуске через 4 секунды срабатывает Авария.
Мне должно было прийти две Ардуино, но пришла одна. Одна глючит с протечкой :) , а второй нет что бы эксперементировать.
Жду когда придет.
Gisteresis писал(а):Тут тоже сложно сказать, нужно пробовать.
На днях куплю провод экранированный и попробую.
Я еще подумал - а может как то программно это убрать? Типа защиты от дребезга?
Gisteresis писал(а):Возможно промежуточный усилитель надо поставить.
Надо почитать на досуге что это такое.
Gisteresis писал(а):Вы уже читали про длинные провода, как там делают?
Нет еще. Усиленно изготавливал вторую версию печатной платы. Сегодня запустил ее. Теперь ничего не греется. :)

P.S. Добавил защиту от дребезга. И немного переписал под новую печатку. Опять же писал в FLProg, потому мало что понимаю в том что написано. :))
Спойлер

Код: Выделить всё

bool _bounse1S = 0;
bool _bounse1O = 0;
unsigned long _bounse1P = 0;
bool _k1 = 0;
bool _k2 = 0;
bool _k3 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0;
bool _ktim1 = 0;
bool _k4 = 0;
bool _k5 = 0;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0;
bool _ktim2 = 0;
bool _k6 = 0;
bool _bounseInput7S = 0;
bool _bounseInput7O = 0;
unsigned long _bounseInput7P = 0;
void setup()
{
pinMode(7, INPUT);
pinMode(1, OUTPUT);
pinMode(6, OUTPUT);
pinMode(4, INPUT);
pinMode(2, INPUT);
pinMode(0, OUTPUT);
pinMode(5, OUTPUT);
pinMode(3, INPUT);

_bounseInput7O =  digitalRead(7);
}
void loop()
{

bool  _bounceTmp7 =  (digitalRead (7));

if (_bounseInput7S) 
    {
     if (millis() >= (_bounseInput7P + 40)) 
         {_bounseInput7O= _bounceTmp7; _bounseInput7S=0;}
     }
else
    {
     if (_bounceTmp7 != _bounseInput7O )
         {_bounseInput7S=1; _bounseInput7P = millis();} 
      } 


bool  _bounceTmp1 = _bounseInput7O;

if (_bounse1S) 
    {
     if (millis() >= (_bounse1P + 40)) 
         {_bounse1O= _bounceTmp1; _bounse1S=0;}
     }
else
    {
     if (_bounceTmp1 != _bounse1O )
         {_bounse1S=1; _bounse1P = millis();} 
      } 
_k1 = _bounse1O;
_k2 = ((((_k1) || (_k2))) &&((!_k4)));
digitalWrite (1, ((_k2) || (_ktim1)));
_k3 = ((_k2) || ((digitalRead (3))));
if (_k3)
{
_tim1O  = 1;
_tim1I  = 1;
}
else
{
if (_tim1I)
{
_tim1I = 0;
_tim1P = millis();
}
else
{
if (_tim1O)
{if ( _isTimer(_tim1P, 4000)) _tim1O = 0;
}
}
} 
if(_tim1O)
{_ktim1 = 1;}
else
{_ktim1 = 0;}
digitalWrite (6, (!_ktim1));
_k4 = (digitalRead (4));
_k5 = (((digitalRead (2))) &&((!_k2)));
_k6 = ((((_k6) || (_k5))) &&((!_k2)));
if (_k5)
{
_tim2O  = 1;
_tim2I  = 1;
}
else
{
if (_tim2I)
{
_tim2I = 0;
_tim2P = millis();
}
else
{
if (_tim2O)
{if ( _isTimer(_tim2P, 4000)) _tim2O = 0;
}
}
} 
if(_tim2O)
{_ktim2 = 1;}
else
{_ktim2 = 0;}
digitalWrite (0, _ktim2);
digitalWrite (5, (!_ktim2));


}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long endTime;
  endTime = startTime+period;
  return (millis() >= endTime);
  }
Посмотрим как будет.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

seval писал(а):Посмотрим как будет.
Два дня полет нормальный. Завтра буду подключать еще пару датчиков.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Добавил "плюшку" в виде моргающего индикатора Аварии при срабатывании датчика протечки.
Спойлер

Код: Выделить всё

bool _k1 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0;
bool _ktim1 = 0;
bool _k2 = 0;
bool _k3 = 0;
bool _k4 = 0;
bool _k5 = 0;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0;
bool _ktim2 = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0;
bool _kgen1 = 0;
bool _k6 = 0;
bool _bounseInput8S = 0;
bool _bounseInput8O = 0;
unsigned long _bounseInput8P = 0;
bool _bounseInput7S = 0;
bool _bounseInput7O = 0;
unsigned long _bounseInput7P = 0;
void setup()
{
pinMode(7, INPUT);
pinMode(1, OUTPUT);
pinMode(3, INPUT);
pinMode(6, OUTPUT);
pinMode(4, INPUT);
pinMode(2, INPUT);
pinMode(5, OUTPUT);
pinMode(0, OUTPUT);
pinMode(8, INPUT);

_bounseInput8O =  digitalRead(8);
_bounseInput7O =  digitalRead(7);
}
void loop()
{

bool  _bounceTmp8 =  (digitalRead (8));

if (_bounseInput8S) 
    {
     if (millis() >= (_bounseInput8P + 40)) 
         {_bounseInput8O= _bounceTmp8; _bounseInput8S=0;}
     }
else
    {
     if (_bounceTmp8 != _bounseInput8O )
         {_bounseInput8S=1; _bounseInput8P = millis();} 
      } 
bool  _bounceTmp7 =  (digitalRead (7));

if (_bounseInput7S) 
    {
     if (millis() >= (_bounseInput7P + 40)) 
         {_bounseInput7O= _bounceTmp7; _bounseInput7S=0;}
     }
else
    {
     if (_bounceTmp7 != _bounseInput7O )
         {_bounseInput7S=1; _bounseInput7P = millis();} 
      } 


_k1 = ((_bounseInput7O) || (_bounseInput8O));
_k2 = ((((_k1) || (_k2))) &&((!_k4)));
digitalWrite (1, ((_ktim1) || (_k6)));
_k3 = ((_k1) || ((digitalRead (3))));
if (_k3)
{
_tim1O  = 1;
_tim1I  = 1;
}
else
{
if (_tim1I)
{
_tim1I = 0;
_tim1P = millis();
}
else
{
if (_tim1O)
{if ( _isTimer(_tim1P, 4000)) _tim1O = 0;
}
}
} 
if(_tim1O)
{_ktim1 = 1;}
else
{_ktim1 = 0;}
digitalWrite (6, (!_ktim1));
_k4 = (digitalRead (4));
_k5 = (((digitalRead (2))) &&((!_k2)));
if (_k5)
{
_tim2O  = 1;
_tim2I  = 1;
}
else
{
if (_tim2I)
{
_tim2I = 0;
_tim2P = millis();
}
else
{
if (_tim2O)
{if ( _isTimer(_tim2P, 4000)) _tim2O = 0;
}
}
} 
if(_tim2O)
{_ktim2 = 1;}
else
{_ktim2 = 0;}
digitalWrite (0, _ktim2);
digitalWrite (5, (!_ktim2));

if (((_k2) &&((!_k4)))) 
   {
   if (! _gen1I)
      {
      _gen1I = 1;
      _gen1O = 1;
      _gen1P = millis();
      }
   }
else
   {
   _gen1I = 0 ;
   _gen1O= 0;
   }
if (_gen1I )
   {
   if ( _isTimer ( _gen1P , 500 ))
      {
      _gen1P = millis();
      _gen1O = ! _gen1O;
      }
   }  
if(_gen1O)
{_kgen1 = 1;}
else
{_kgen1 = 0;}
_k6 = _kgen1;


}
bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long endTime;
  endTime = startTime+period;
  return (millis() >= endTime);
  }
Родилась у меня мысль - Как заставить Ардуино реагировать на оторванный датчик протечки?
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Родилась у меня мысль - Как заставить Ардуино реагировать на оторванный датчик протечки?
Надо подумать.
В промышленных аналоговых датчиках например используют формат 4-20мА, можно диагностировать обрыв.
Можно не на IO вход подавать а на АЦП что то похожее замутить.

Я вообще думал проверку просто делать через каждые пару месяцев.

С длинными проводами то разобрались?
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

С длинными проводами вроде разобрался. Защиту от дребезга внедрил в программу. Все не когда датчиков еще поставить. Всего планируется 6 датчиков. Поставлю все и тогда буду ждать глюки :)
Как съездили?

P.S. Решил все это дело сделать по красивее. Заказал корпуса. Переделал под эти корпуса схему.
Изображение
Как корпуса придут буду рисовать печатку.
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):С длинными проводами вроде разобрался. Защиту от дребезга внедрил в программу.
То есть защита от дребезга решила проблему? Усиливать сигнал не пришлось.
seval писал(а):Решил все это дело сделать по красивее.
Да. Схема мне нравится. Осталось только простой МК поставить вместо ардуины :wink:

ПС:
Как съездили?
Хорошо, ездил в Дагестан. Обстановка там стала гораздо тише, мирнее по сравнению с прошлыми годами.
Отведал местные блюда :hunger: Очень вкусно готовят.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а):То есть защита от дребезга решила проблему?
Вроде решила. Посмотрим как дальше будет. Добавил еще один датчик. Пока работает как надо.
Gisteresis писал(а):Осталось только простой МК поставить вместо ардуины
Хочу. Только вот надо сначала написать программу аналогичную в Arduino IDE. Что бы понять как вообще писать код.
Еще не могу сообразить что нужно для старта? Купить пару МК? И программатор? А как же задушить земноводное, что бы потратить пару тысяч на программатор?
Но все таки хочу. :))
Gisteresis писал(а):Отведал местные блюда
Завидую. :kill:
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Что бы понять как вообще писать код.
Попробуйте CodeVisionAVR, там есть генератор начального кода, останется только функцию main заполнить по аналогии с вашей программой.
Настройки периферии делает генератор по вашим установкам в меню генератора.
Настройки фуз битов можно делать по калькулятору, набираем в поисковике "калькулятор фуз битов авр"
Вот например вроде удобный:
http://homes-smart.ru/fusecalc/
Думаю для старта самое оно. Дальше если не понравится то можно перейти и на другие по вкусу.

Программатор я в начале сделал самопальный STK200/300, схема простая, ставим буфер и пару резисторов, практически и весь программатор.
"5 проводков" не пробовал, это уж совсем по моему топор :)))
Видел реализацию программатора из клавиатуры. Сердито.
На покупной перешел только потому, что надоело задумываться над фузами и делать переходные панельки под разные корпуса микросхем. В итоге у меня получилась куча плат.
Если это не напрягает, то я думаю STK200/300 + AVRDoctor самое оно. Можно отдельно сделать и плату отладчика.
Что то делать более сложное времени уйдет больше, тут надо серьезно заморочиться.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а):Попробуйте CodeVisionAVR,
Обязательно попробую. Тем боле что теща скоро переедет в новую квартиру, и у меня теперь грант на исследования своей системы. :))
С праздником всех котов и кошек.
У меня чего то не получается самому написать скетч. Может кто подскажет?
Спойлер

Код: Выделить всё

int leak1 = 3;//датчик протечки
int lopn = 7;//LED Открыто
int lcls = 8;//LED Закрыто
int lalrm = 9;//LED Авария
int bopn = 12;//кнопка Открыть
int bcls = 11;//кнопка Закрыть
int brst = 10;//кнопка Сброс
int in1 = 2;//Выход Закрыть
int in2 = 13;//Выход Открыть
bool l1 = 0;//Переменная Протечка
bool a2 = 0;//Переменная Авария
bool c3 = 0;//Переменная Закрыть
bool r4 = 0;//Переменная Сброс
bool o5 = 0;//Переменная Открыть
bool f6 = 0;//Переменная Моргать

void setup()
	{
	pinMode (leak1 , INPUT);
    pinMode (bopn , INPUT);
    pinMode (bcls , INPUT);
    pinMode (brst , INPUT);
    pinMode (lopn , OUTPUT);
    pinMode (lcls , OUTPUT);
    pinMode (lalrm , OUTPUT);
    pinMode (in1 , OUTPUT);
    pinMode (in2 , OUTPUT);
    alrme ();
    //blnk ();
    cls ();
    //opn ();
    //rst ();
	}
void loop()
	{
	l1 = (digitalRead (leak1));//Присваиваем переменной l1 значение входов датчиков протечки
	r4 = (digitalRead (brst));//Присваиваем переменной r4 значение входа 10
	if (l1)//Если протечка
		{
		alrme ();//то идем в блок Авария alrme
		}
	}
void alrme ()
	{
	a2 = ((((l1) || (a2))) &&((!r4)));//Присваиваем переменной a2 значение l1, делаем самоподхват и блокировку сбросом r4
	digitalWrite (lalrm, ((a2) || (f6)));//Включаем индикатор Аварии и заставляем его моргать от f6
	if (a2)//Если Авария
		{
		cls ();//то идем в блок cls
		}
	}
void cls ()
	{
	c3 = ((((digitalRead (bcls))) || (a2)));//Присваиваем переменной c3 значение кнопки Закрыть или значение переменной Авария a2
	if (c3)//Если есть команда закрыть
		{
		digitalWrite (in1, c3);// то закрываем задвижку
		digitalWrite (lcls, HIGH);// зажигаем диод Закрыто
		delay (4000);//Ждем 4 секунды
		digitalWrite (in1, LOW);//убираем напряжение с задвижки
		digitalWrite (lcls, LOW);// гасим диод Закрыто
		}
	}

	
Чего у меня Сброс не срабатывает? Куда эту строчку надо встроить?

Код: Выделить всё

r4 = (digitalRead (brst));
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

seval писал(а):Чего у меня Сброс не срабатывает?
Имена переменных соответствуют пинам ардуины?
По схеме 3,4,5 кнопки, а в программе 12,11,10?
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

Gisteresis писал(а): Имена переменных соответствуют пинам ардуины?
По схеме 3,4,5 кнопки, а в программе 12,11,10?
Схему забыл перерисовать. Пины подгонял под корпуса которые еще не пришли.
Родился
Сообщения: 1
Зарегистрирован: Чт окт 01, 2015 12:08:05

Сообщение proDream »

Приветствую. Очень заинтересовала ваша разработка, понравились схемы и реализация. Хотелось бы узнать чем все закончилось и если можно увидеть финальные "чертежи" устройства.
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вт мар 04, 2014 20:09:54
Откуда: Орёл

Сообщение seval »

proDream писал(а): если можно увидеть финальные "чертежи" устройства.
Как таковых чертежей нет. Сейчас все живет вот в таком Изображение корпусе. Там две латы. Одна основная и одна лицевая.
Есть платы нарисованные. Схему не рисовал. Если нужно нарисую как освобожусь.
И программы сейчас под рукой нет, что бы выложить. Но практически ничего не изменилось.
Изображение
Изображение
VAT
Встал на лапы
Сообщения: 90
Зарегистрирован: Вс дек 20, 2015 21:03:39

Сообщение VAT »

Продаваемые на рынке готовые комплекты Аквасторож, Нептун и Гидролок годами соревнуются в ненадежности.. Стоят конечно дорого если взглянуть на внутренности.
Не маленькие вы резисторы поставили последовательно с площадками датчика? Вода не такой уж может быть хороший проводник.
У АС еще конденсатор параллельно обкладкам стоит - это позволяет контроллеру контролировать обрыв датчика и закрывать воду по этому событию. Я считаю это очень нужным. Про систему забываешь. Ну и контроль положения шара нужен - не смог закрыть при тестовом провороте - так хоть сигнал чтобы подал. А еще круче - иметь возможность замера тока - тогда можно контролировать деградацию крана и закрыть воду до того как.
Ответить

Вернуться в «AVR»