new code base

This commit is contained in:
2023-03-22 19:36:34 +01:00
parent bd699cd238
commit 66c3d4db74
7 changed files with 160 additions and 210 deletions
+12 -41
View File
@@ -1,43 +1,14 @@
#pragma once
#include <Arduino.h>
// 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
#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
+62 -71
View File
@@ -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();
switch (this->state) {
case State::Off :
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);
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() {
}
+19 -37
View File
@@ -2,60 +2,42 @@
#include <Arduino.h>
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;
};
View File
View File
+61 -44
View File
@@ -1,61 +1,78 @@
#include <Arduino.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Ethernet2.h>
#include <SPI.h>
#include <shiftregister.h>
#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(".");
listenForEthernetClients();
}
}
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);
void listenForEthernetClients() {
EthernetClient client = server.available();
// 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();
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("<br />");
client.print("Pressure: lUl");
client.print(" Pa");
client.println("<br />");
break;
}
delay(10);
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();
}
-11
View File
@@ -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