привет народ! пытаюсь сделать систему аквастоп, на макетке уже реализовал, и даже почти готова печатная плата, но есть вопрос c чтением датчика протечки при перезагрузке - если в момент перезагрузки пин датчика уже был закорочен на землю, то программа почему-то не воспринимает это как протечку, т.е. на этом пине, остается логическая единица, но если отключить и снова подключить к земле, то сразу же срабатывает... не могу понять в чем причина...
код и схема ниже
Код:
#include <SPI.h>
#include <Wire.h>
//#include "DHT.h"
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include <Bounce2.h>
#define OLED_RESET 4
#define DHTPIN 2
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(OLED_RESET);
//DateTime dt(2017, 22, 06, 16, 9, 00, 3);
int pin_ButtonON = 2;
int pin_ButtonOFF = 3;
int pin_ButtonRES = 4;
int pin_valveOFF = 10;
int pin_valveON = 11;
int pin_RelayON = 6;
int stateValveON;
int stateValveOFF;
int previous = LOW;
int one = 0;
int runvalve = 0;
int to_close = 1;
int to_open = 0;
int leak = 0;
int resetcl = 0;
int openErr = 0;
int closeErr = 0;
int waterPin = A0;
String timedate;
String timedateLast;
unsigned long currentTime;
unsigned long loopTime;
long previousMillis = 0;
Bounce btnON = Bounce();
Bounce btnOFF = Bounce();
Bounce btnRST = Bounce();
Bounce vlvON = Bounce();
Bounce vlvOFF = Bounce();
Bounce VL1 = Bounce();
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//dht.begin();
Wire.begin();
rtc.begin();
pinMode(pin_ButtonON, INPUT_PULLUP);
btnON.attach(pin_ButtonON); //2
btnON.interval(5);
pinMode(pin_ButtonOFF, INPUT_PULLUP);
btnOFF.attach(pin_ButtonOFF); //3
btnOFF.interval(5);
pinMode(pin_ButtonRES, INPUT_PULLUP);
btnRST.attach(pin_ButtonRES); //4
btnRST.interval(5);
pinMode(pin_valveOFF, INPUT_PULLUP);
vlvOFF.attach(pin_valveOFF); //10
vlvOFF.interval(10);
pinMode(pin_valveON, INPUT_PULLUP);
vlvON.attach(pin_valveON); //11
vlvON.interval(10);
pinMode(waterPin, INPUT_PULLUP);
VL1.attach(waterPin); //A0
VL1.interval(5);
pinMode(pin_RelayON, OUTPUT); //6
display.clearDisplay();
display.setTextSize(1);
SendToScreen(0, 0, "Diagnostic...", 0, 1);
pinMode(9, OUTPUT); // устанавливаем вывод 13 как выход
//tone(10, 2000, 1000);
//if (digitalRead(waterPin) == 0 ) leak = 1;
}
String printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
String valtm;
if(digits < 10)
{
valtm = "0" + String(digits);
return valtm;
}
valtm = String(digits);
return valtm;
}
void SendToScreen (int x, int y, String text, int colour, int clear1) //SendToScreen(0, 16, "To open click RST", 0, 0);
{
if (colour == 0) display.setTextColor(BLACK);
else
{
display.setTextColor(WHITE);
Serial.println( text);
}
if (clear1 == 1) display.clearDisplay();
display.setCursor(x, y);
display.print(text);
display.display();
}
String ooo, nnn;
void loop()
{
DateTime now = rtc.now(); //get the current date-time
timedate = printDigits(now.date()) + String(".") + printDigits(now.month()) + String(".") + printDigits(now.year()).substring(2, printDigits(now.year()).length()) + String(" ") +
printDigits(now.hour()) + String(":") + printDigits(now.minute()) + String(":") + printDigits(now.second());
if (timedate.compareTo(timedateLast) != 0)
{
//Serial.println(timedateLast);
display.setCursor(0,25); display.setTextColor(BLACK); display.print(timedateLast);
display.setCursor(0,25); display.setTextColor(WHITE); display.print(timedate);
timedateLast = timedate;
nnn = digitalRead(waterPin);
if (resetcl == 1) nnn = nnn + " R!";
display.setCursor(100,0); display.setTextColor(BLACK); display.print(ooo);
display.setCursor(100,0); display.setTextColor(WHITE); display.print(nnn);
ooo = nnn;
display.display();
}
//--------------------------------------------------------------------------- on
if (btnON.update())
{
if (btnON.read()==0)
{
tone(8, 2000, 1000);
to_open = 1; // запоминаем нажатие кнопки ОТКРЫТЬ
//SendToScreen(0, 0, "Opening...", 1, 1);
}
}
if (to_open == 1) // если была нажата кнопка ОТКРЫТЬ
{
if ( stateValveON == 0 && runvalve == 0 && (resetcl == 1 or leak < 1)) // и при этом концевик ОТКРЫТИЯ не замкнут и вентиль не крутится -
{
digitalWrite(pin_RelayON, HIGH); // начинам крутить вентиль
runvalve = 1;
SendToScreen(0, 0, "Opening...", 1, 1);
digitalWrite(9, HIGH);
previousMillis = millis();
}
if ( stateValveON == 1 && runvalve == 1 ) // как только сработал концевик ОТКРЫТИЯ
{
digitalWrite(pin_RelayON, LOW); //перестаем крутить вентиль
runvalve = 0;
to_open = 0;
SendToScreen(0, 8, "vlv opened.", 1, 0);
}
}
if (millis() - previousMillis > 2000)
{
digitalWrite(9, LOW);
previousMillis = millis();
}
//--------------------------------------------------------------------------- off
if (btnOFF.update())
{
if (btnOFF.read()==0)
{
//tone(12, 2000, 1000);
to_close = 1; // запоминаем нажатие кнопки ЗАКРЫТЬ
}
}
if (to_close == 1) // если была нажата кнопка ЗАКРЫТЬ
{
if ( stateValveOFF == 0 && runvalve == 0 ) // и при этом концевик ЗАКРЫТИЯ не замкнут и вентиль не крутится -
{
digitalWrite(pin_RelayON, HIGH); // начинам крутить вентиль
runvalve = 1;
if (leak == 0 || (leak == 1 && resetcl == 1)) SendToScreen(0, 0, "Closing...", 1, 1);
}
if ( stateValveOFF == 1 && runvalve == 1 ) // как только сработал концевик ЗАКРЫТИЯ
{
digitalWrite(pin_RelayON, LOW); //перестаем крутить вентиль
runvalve = 0;
to_close = 0;
if (leak == 0|| (leak == 1 && resetcl == 1)) SendToScreen(0, 8, "vlv closed.", 1, 0);
}
}
//-------------------------------------------------------------------------- RESET
if (btnRST.update()) // если протечка устранена, но датчик не высох, а воду надо включить то флаг resetcl блокирует автоматическое закрытие до высыхания
{
if (btnRST.read()==0)
{
if (leak == 1) // резет срабатывает только на мокром датчике
{
resetcl = 1;
SendToScreen(0, 16, "To open click RST", 0, 0); //удалить старую надпись
SendToScreen(0, 16, "Locking OFF", 1, 0);
}
}
}
//-------------------------------------------------------------------------- срабатывание датчика протечки 1
if ( VL1.update())
{
if ( VL1.read()==0)
{
leak = 1;
SendToScreen(0, 0, "Water leack! ", 1, 1);
SendToScreen(0, 16, "To open click RST", 1, 0);
}
else
{
leak = 0;
resetcl = 0; // после высыхания сбрасываем резет (повторное срабатывание после высыхания снова закроет вентиль)
}
}
if (leak == 1 && resetcl == 0 && stateValveOFF == 0) // если сработал датчик протечки при открытом вентиле и не включен резет - закрываем вентиль
{
to_close = 1;
}
//------------------------------------------ --------------------------------- срабатывание концевика открытия вентиля
if (vlvON.update())
{
if (vlvON.read()==0)
{
stateValveON = 1;
}
else
{
stateValveON = 0;
}
}
//--------------------------------------------------------------------------- срабатывание концевика закрытия вентиля
if (vlvOFF.update())
{
if (vlvOFF.read()==0)
{
stateValveOFF = 1;
}
else
{
stateValveOFF = 0;
}
}
}