В общем так. Разобрался вроде. Отчитываюсь.
От Гидролока необходимо три действия:
1 Вкл/выкл
2 Индикация, что вкл/выкл
3 Индикация протечки
Читаем инструкцию (в приложении) - замыкание/размыкание FUN и GND приводит к открыванию/закрыванию кранов. Однако есть ньанс, запрещено на эти контакты подавать напряжение. Измерения показалои, что между этими контактами - 5В.
Задача 1 - вкл/выкл крана. Берем бистабильное реле2
http://smartliving.ru/forum/viewtopic.php?f=14&t=1912
Берем обычную релюшку для ардуино. Соединяем следующим образом - ардуино - релюшка-бистабильное реле-контакты гидролок. Получается так, что по команде ардуинки, обычная релюшка на 100 миллисекунд замыкает контакт и подает 12В на бистабильное реле. Бистабильное реле меняет положение, соотв замыкает/размыкает контакты FUN GND и вкл или выкл краны.
Задача 2 - определить положение бистабильного реле - пользуем оптопару 4N25 - (6 ног, над первой стоит точка и идут они против часовой стрелки) - 1GND 2FUN через 1К резистор 4GND arduino 5 2pin arduino через подтягивающий резистор 4.7К. Теперь, когда мы даем команду реле открыть или закрыть кран, на 2 пине мы увидим состояние реле (определим есть ли ток (замкнуты ли) FUN GND)
Задача 3 - определить наличие сигнала протечки. В гидролоке это реализуется с помощью открытого коллектора с нагрузочной способностью 100 мА, 30 В. Используем метод выше, чтобы определить есть ли ток между контактами 2 и 4 гидролока (ожидаем 12В). Все подключается так же, только пин ардуины пользуем другой 8.
Важное замечание, тут все наоборот в плане логики - чтобы активировать реле нужно подать Low, если есть сигнал, тоже получим LOW, а в спокойном состоянии HIGH.
Ругаем, комментируем
Код получается следующий
Код: Выделить всё
#include <SPI.h>
#include <Arduino.h>
// Variables will change:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long lastDebounceTime2 = 0;
long debounceDelay = 100; // the debounce time; increase if the output flickers
int gidroPin1 = 8; //Gidrolock 1 (зеленый+зеленый/2) - черный
int gidroPin2 = 2; //Gidrolock 2
int gidroPin3 = 4; //Gidrolock 3 (оранжевый + коричневый)
//Gidrolock
int gidrostate = 1;
int gidrostateold = 1;
int gidroalarm = 0;
int gidroalarmold = 0;
unsigned long millisGidroOld = 0;
unsigned long millisCounter =0;
int incomingByte = 0;
void setup()
{
Serial.begin(57600);
//gidrolock
pinMode(gidroPin1, OUTPUT);
//digitalWrite(gidroPin1, 1);
pinMode(gidroPin2, INPUT);
//digitalWrite(gidroPin2, HIGH); // turns on the internal pull up
pinMode(gidroPin3, INPUT);
digitalWrite(gidroPin3, HIGH); // turns on the internal pull up
}
void loop()
{
unsigned long millisCounter = millis();
//if (millisCounter - millisGidroOld >= 10000) {
//Girdolock
gidrostate=digitalRead(gidroPin2); // state check
if (gidrostate != gidrostateold){
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (gidrostate != gidrostateold){
Serial.print("Gidrolock status changed ");
Serial.println(gidrostate);
if (gidrostate == LOW){
gidrostateold = gidrostate;
Serial.println ("Gidrolock On");
} else if (gidrostate == HIGH){
gidrostateold = gidrostate;
Serial.println ("Gidrolock off");
} else {
Serial.println ("Gidrolock error state");
}
}}
gidroalarm=digitalRead(gidroPin3); //Alarm check
//if (gidroalarm != gidroalarmold){
// reset the debouncing timer
// lastDebounceTime2 = millis();
//}
//if ((millis() - lastDebounceTime2) > debounceDelay) {
if (gidroalarm != gidroalarmold){
Serial.println(gidroalarm);
if (gidroalarm == LOW){
Serial.print("Leak detection from Gidrolock ");
gidroalarmold = gidroalarm;
} else if (gidroalarm == HIGH){
gidroalarmold = gidroalarm;
Serial.println ("Gidrolock No leaks");
}else{
Serial.println ("Gidrolock error alarm");
}
}//}
millisGidroOld = millisCounter;
// }
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read()-'0';
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte);
if (incomingByte == 1){
while ((digitalRead(gidroPin2))!= 0){
digitalWrite(gidroPin1, LOW);
delay (100);
digitalWrite(gidroPin1, HIGH);
}
gidrostateold = gidrostate;
}
if (incomingByte == 0){
while ((digitalRead(gidroPin2))!= 1){
digitalWrite(gidroPin1, LOW);
delay (100);
digitalWrite(gidroPin1, HIGH);
}
gidrostateold = gidrostate;
}
}
}