roboforum.ru

Технический форум по робототехнике.

Aquastop чтение состояния вывода при перезагрузке

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Aquastop чтение состояния вывода при перезагрузке

Сообщение igorlab » 13 май 2017, 01:04

привет народ! пытаюсь сделать систему аквастоп, на макетке уже реализовал, и даже почти готова печатная плата, но есть вопрос 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;
  }
}

}
Аватара пользователя
igorlab
 
Сообщения: 185
Зарегистрирован: 30 окт 2015, 19:08

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7