Browse Source

controller code

master
Patrizio Trinchini 4 years ago
parent
commit
b55f3dadf1
  1. 2
      README.md
  2. 9
      platformio.ini
  3. 224
      src/main.cpp

2
README.md

@ -0,0 +1,2 @@
# Controllo Canale Irriguo

9
platformio.ini

@ -8,7 +8,10 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:uno]
platform = atmelavr
board = uno
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
upload_protocol = esptool
lib_deps =
knolleary/PubSubClient@^2.8

224
src/main.cpp

@ -1,9 +1,227 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h>
#define WLAN_SSID "TP-LINK-RPT0"
#define WLAN_PASS "6JM54UG4EY"
#define MQTT_CLID "ValveControl"
#define MQTT_HOST "192.168.1.133"
#define MQTT_PORT 1883
#define MQTT_USER "admin"
#define MQTT_PASS "22pa0799"
void openValve();
void closeValve();
void stopValve();
void OnConnect();
void OnOpen();
void OnClose();
void OnRestart();
void OnNotFound();
String SendHTML(uint8_t ValveOpen);
bool ValveOpen = false;
int ButtonOpen = 14;
int ButtonClose = 12;
int MotorPin1 = 0;
int MotorPin2 = 2;
int duration = 10000;
ESP8266WebServer server(80);
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void onMessage(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic ");
Serial.print(topic);
Serial.print(": ");
for (unsigned int i=0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
const char * command = (char *)payload;
if (!strncmp(command, "open", length)) {
openValve();
} else if (!strncmp(command, "close", length)) {
closeValve();
} else {
Serial.println("Unnown command");
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect(MQTT_CLID, MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT connected");
client.subscribe("/valve/command");
} else {
Serial.print("Connection failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup_mqtt() {
client.setServer(MQTT_HOST, MQTT_PORT);
client.setCallback(onMessage);
}
void setup_http() {
Serial.println("Starting HTTP server...");
server.on("/", OnConnect);
server.on("/open", OnOpen);
server.on("/close", OnClose);
server.on("/restart", OnRestart);
server.onNotFound(OnNotFound);
server.begin();
Serial.println("HTTP server started");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while(!Serial) {
delay(100);
}
pinMode(ButtonOpen, INPUT);
pinMode(ButtonClose, INPUT);
pinMode(MotorPin1, OUTPUT);
pinMode(MotorPin2, OUTPUT);
setup_wifi();
setup_mqtt();
setup_http();
}
void loop() {
// put your main code here, to run repeatedly:
}
if (!client.connected()) {
reconnect();
}
client.loop();
server.handleClient();
int buttonOpenState = digitalRead(ButtonOpen);
int buttonCloseState = digitalRead(ButtonClose);
if(buttonOpenState == LOW) {
buttonCloseState = !buttonOpenState;
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
ValveOpen = true;
}
if(buttonCloseState == LOW) {
buttonOpenState = !buttonCloseState;
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
ValveOpen = false;
}
if(buttonOpenState == HIGH && buttonCloseState == HIGH) {
stopValve();
}
}
void OnConnect() {
server.send(200, "text/html", SendHTML(ValveOpen));
}
void OnOpen() {
openValve();
server.send(200, "text/html", SendHTML(ValveOpen));
}
void OnClose() {
closeValve();
server.send(200, "text/html", SendHTML(ValveOpen));
}
void OnRestart() {
server.send(200, "text/plain","Restarting...");
delay(1000);
ESP.restart();
}
void OnNotFound(){
server.send(404, "text/plain", "Not found");
}
void openValve() {
Serial.println("Opening valve...");
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
delay(duration);
stopValve();
ValveOpen = HIGH;
}
void closeValve() {
Serial.println("Closing valve...");
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
delay(duration);
stopValve();
ValveOpen = false;
}
void stopValve() {
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, LOW);
}
String SendHTML(uint8_t ValveOpen) {
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>Linear Actuator</title>\n";
ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
ptr +=".button {display: block;width: 80px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
ptr +=".button-open {background-color: #1abc9c;}\n";
ptr +=".button-open:active {background-color: #16a085;}\n";
ptr +=".button-close {background-color: #34495e;}\n";
ptr +=".button-close:active {background-color: #2c3e50;}\n";
ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<h1>Linear Actuator</h1>\n";
if(ValveOpen) {
ptr +="<p>Valve is OPEN</p><a class=\"button button-close\" href=\"/close\">CLOSE</a>\n";
} else {
ptr +="<p>Valve is CLOSED</p><a class=\"button button-open\" href=\"/open\">OPEN</a>\n";
}
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}

Loading…
Cancel
Save