diff --git a/include/config.h b/include/config.h index 3447b0e..8a386c8 100644 --- a/include/config.h +++ b/include/config.h @@ -1,43 +1,14 @@ #pragma once -#include -// Ethernet -#define IP_ADDRESS "192.168.0.55" -#define IP_PORT 8888 -byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; - -// Pins -#define ETHERNET_INT 3 -#define ETHERNET_CS 10 -#define ETHERNET_RESET A1 - -#define HALL_INT 2 -#define PRESSURE_READ A7 -#define BUTTON_READ A6 -#define DISPLAY_ACTIVE_READ 9 - -#define STATUS_LED_1 8 -#define STATUS_LED_2 A0 - -#define SR_LATCH 5 -#define SR_CLOCK 6 -#define SR_DATA 7 -#define SR_OUTPUT_ENABLE A3 -#define SR_CLEAR A2 - -// Shift register output pins -#define VALVE_01 1 -#define VALVE_02 2 -#define VALVE_03 3 -#define VALVE_04 4 -#define VALVE_05 5 -#define VALVE_06 6 -#define VALVE_07 7 -#define VALVE_08 8 -#define VALVE_09 9 -#define VALVE_10 10 -#define VALVE_11 11 -#define VALVE_12 12 - -#define ERROR_LAMP 15 -#define PUMP_ON_LAMP 16 \ No newline at end of file +#define PRESSURE_PIN A7 +#define BUTTON_PIN A6 +#define SROE_PIN A3 +#define STATUS_LED_1_PIN A0 +#define DISPLAY_ACTIVE_PIN 9 +#define STATUS_LED_2_PIN 8 +#define SRSER_PIN 7 +#define SRCLK_PIN 6 +#define RCLK_PIN 5 +#define SSR_PIN 4 +#define INT_ETH_PIN 3 +#define INT_HALL_PIN 2 \ No newline at end of file diff --git a/lib/Pump/pump.cpp b/lib/Pump/pump.cpp index 4c19bbf..be904b1 100644 --- a/lib/Pump/pump.cpp +++ b/lib/Pump/pump.cpp @@ -1,97 +1,88 @@ #include "pump.h" -Pump::Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin) { +Pump::Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin, uint8_t errorLedPin) { this->pumpPin = pumpPin; this->pressurePin = pressurePin; this->flowPin = flowPin; + this->errorLedPin = errorLedPin; pinMode(this->pumpPin, OUTPUT); + pinMode(this->errorLedPin, OUTPUT); pinMode(this->pressurePin, INPUT); + // Hall flow sensor? digitalWrite(this->pumpPin, LOW); + digitalWrite(this->errorLedPin, LOW); } void Pump::loop() { - if (millis() - lastMillisLoop < this->delayLoopMs) - return; - this->lastMillisLoop = millis(); - - this->calculatePressure(); - this->calculateFlow(); - this->checkErrors(); - this->controlPump(); -} - -bool Pump::switchPump(bool state) { - if (this->currentStatus == Status::Failure) - return false; - - if (state && this->currentStatus == Status::Standby) - return false; - - if (state) - this->currentStatus = Status::On; - else - this->currentStatus = Status::Off; - return true; -} - -uint32_t Pump::getPumpRunningTime() { - if (this->currentStatus == Status::On) - return millis() - this->pumpRunningStart; - return 0; -} - -void Pump::calculatePressure() { - uint16_t rawValue = analogRead(this->pressurePin); - if (rawValue < 104) - this->pressure = 0; - else if (rawValue > 922) - this->pressure = 550; - else - this->pressure = map(rawValue, 104, 922, 0, 550); - - //TODO: Error checking -} - -void Pump::calculateFlow() { - //TODO: Error checking -} - -void Pump::checkErrors() { - if (this->error == Error::None) - return; - - if (this->error ) - -} - -void Pump::controlPump() { - if (this->lastStatus == this->currentStatus) - return; - this->lastStatus = this->currentStatus; - - switch (this->currentStatus) { - case Status::Off : - digitalWrite(this->pumpPin, LOW); + switch (this->state) { + case State::Off : + break; - case Status::On : - digitalWrite(this->pumpPin, HIGH); - this->pumpRunningStart = millis(); + case State::On : + break; - case Status::Standby : - ; + case State::Timer : + break; - case Status::Failure : - digitalWrite(this->pumpPin, LOW); - if (this->errorFunction) - this->errorFunction(this->error); + case State::Standby : + break; - + + case State::Error : + if (millis() - this->startTime > Pump::blinkTime) { + this->startTime = millis(); + if (this->ledState) { + this->ledState = false; + digitalWrite(this->errorLedPin, LOW); + } else { + this->ledState = true; + digitalWrite(this->errorLedPin, HIGH); + } + } + break; + default: break; } } + +void Pump::activate(uint32_t duration = 0) { + this->startTime = millis(); + if (duration) { + this->state = State::Timer; + this->duration = duration; + } else { + this->state = State::On; + } +} + +void Pump::stop() { + if (this->state != State::Error) + this->state = State::Off; +} + +void Pump::clearError() { + if (this->state == State::Error) + this->state = State::Off; +} + +uint16_t Pump::getPressure() { + +} + +uint16_t Pump::getRunningTime() { + +} + +uint16_t Pump::getFlow() { + +} + +void Pump::checkSensors() { + +} \ No newline at end of file diff --git a/lib/Pump/pump.h b/lib/Pump/pump.h index 087003c..99dc259 100644 --- a/lib/Pump/pump.h +++ b/lib/Pump/pump.h @@ -2,60 +2,42 @@ #include - class Pump { public: - enum Error : uint8_t { - None, - HighPressure, - LowFlow, - Both - }; - - enum Status : uint8_t { + static const uint16_t blinkTime = 1000; + enum State { Off, On, + Timer, Standby, - Failure + Error }; - typedef void (*ErrorFunction)(Error); - - Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin); + Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin, uint8_t errorLedPin); void loop(); - void clearError() { this->error = Error::None; } - bool switchPump(bool state); - void incrementFlowCounter() { this->flowCounter++; }; - uint8_t getFlowPin() { return this->flowPin; } - uint32_t getPumpRunningTime(); + void activate(uint32_t duration = 0); + void stop(); + void clearError(); - void setErrorFunction(ErrorFunction ptr) { this->errorFunction = ptr; } + uint16_t getPressure(); + uint16_t getRunningTime(); + uint16_t getFlow(); + + State getState() { return this->state; } private: - void calculatePressure(); - void calculateFlow(); - void checkErrors(); - void controlPump(); + void checkSensors(); + State state = State::Off; - void setStatus(Status status); - - Status lastStatus = Status::Off; - Status currentStatus = Status::Off; - Error error = Error::None; - ErrorFunction errorFunction = nullptr; + bool ledState = false; uint8_t pumpPin; uint8_t pressurePin; uint8_t flowPin; - uint8_t delayLoopMs = 20; + uint8_t errorLedPin; - uint16_t flowCounter = 0; - uint16_t pressure = 0; - - uint32_t lastMillisLoop = 0; - uint32_t lastPressureCalculation = 0; - uint32_t lastFlowCalculation = 0; - uint32_t pumpRunningStart = 0; + uint32_t startTime; + uint32_t duration; }; \ No newline at end of file diff --git a/lib/Valve/valve.cpp b/lib/Valve/valve.cpp new file mode 100644 index 0000000..e69de29 diff --git a/lib/Valve/valve.h b/lib/Valve/valve.h new file mode 100644 index 0000000..e69de29 diff --git a/src/main.cpp b/src/main.cpp index c4dd086..f05836c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,61 +1,78 @@ #include -#include -#include +#include +#include +#include -#include "config.h" -char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; -char ReplyBuffer[UDP_TX_PACKET_MAX_SIZE]; +byte mac[] = { 0xC3, 0xF9, 0x7C, 0xB1, 0x8C, 0xF3 }; -EthernetUDP Udp; +IPAddress ip(192, 168, 13, 0); +IPAddress gateway(192, 168, 0, 1); +IPAddress subnet(255, 255, 128, 0); + +EthernetServer server(80); + +ShiftRegister reg() + +void listenForEthernetClients(void); void setup() { Serial.begin(115200); - Serial.println("Irrigation Arduino"); + Serial.println("Arduino Bewaesserung"); - Ethernet.init(ETHERNET_CS); - IPAddress ip; - ip.fromString(IP_ADDRESS); Ethernet.begin(mac, ip); - - if (Ethernet.hardwareStatus() == EthernetNoHardware) { - Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); - while (true) - delay(1); - } - - if (Ethernet.linkStatus() == LinkOFF) - Serial.println("Ethernet cable is not connected."); - - Udp.begin(IP_PORT); + server.begin(); } void loop() { - // if there's data available, read a packet - int packetSize = Udp.parsePacket(); - if (packetSize) { - Serial.print("Received packet of size "); - Serial.println(packetSize); - Serial.print("From "); - IPAddress remote = Udp.remoteIP(); - for (int i=0; i < 4; i++) { - Serial.print(remote[i], DEC); - if (i < 3) { - Serial.print("."); - } - } - Serial.print(", port "); - Serial.println(Udp.remotePort()); - - // read the packet into packetBuffer - Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); - Serial.println("Contents:"); - Serial.println(packetBuffer); - - // send a reply to the IP address and port that sent us the packet we received - Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); - Udp.write(ReplyBuffer); - Udp.endPacket(); - } - delay(10); + listenForEthernetClients(); } + +void listenForEthernetClients() { + EthernetClient client = server.available(); + + if (!client) return; + + Serial.println("Got a client"); + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + + char buffer[7]; + client.readBytesUntil(' ', buffer, 7); + Serial.print(c); + // if you've gotten to the end of the line (received a newline + // character) and the line is blank, the http request has ended, + // so you can send a reply + if (c == '\n' && currentLineIsBlank) { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println(); + // print the current readings, in HTML format: + client.print("Temperature: "); + client.print("temperature"); + client.print(" degrees C"); + client.println("
"); + client.print("Pressure: lUl"); + client.print(" Pa"); + client.println("
"); + break; + } + if (c == '\n') { + // you're starting a new line + currentLineIsBlank = true; + } + else if (c != '\r') { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + Serial.println(); + delay(1); + client.stop(); +} \ No newline at end of file diff --git a/test/README b/test/README deleted file mode 100644 index 9b1e87b..0000000 --- a/test/README +++ /dev/null @@ -1,11 +0,0 @@ - -This directory is intended for PlatformIO Test Runner and project tests. - -Unit Testing is a software testing method by which individual units of -source code, sets of one or more MCU program modules together with associated -control data, usage procedures, and operating procedures, are tested to -determine whether they are fit for use. Unit testing finds problems early -in the development cycle. - -More information about PlatformIO Unit Testing: -- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html