Browse Source

initial commit

master
Thorsten Riess 2 years ago
commit
28c3dc9687
2 changed files with 270 additions and 0 deletions
  1. +174
    -0
      steuerung/steuerung.ino
  2. +96
    -0
      webinterface/webinterface.ino

+ 174
- 0
steuerung/steuerung.ino View File

@@ -0,0 +1,174 @@
/*
Es gibt 6 Positionen die vom Druckkopf angefahren werden müssen.
für jede Position 1-6 wird in einem Array die genaue Position angegeben.
boundRight wird durch eine Zahl im Array ersetzt.
Wird diese Position erreicht stoppt der Kopf und das
Programm Schalter umlegen wird aufgerufen.
Der Zähler wird auf die nächste Position gesetzt und der Druckkopf wieder gestartet
Hat der Kopf die letzte Position erreicht wird der Druckkopf zur Ausgangsposition
zurückgefahren und die Position bei erreichen der Lichtschranke auf 0 gesetzt.

Damit beim Umlegen der Schalter die richtige Bewegung ausgeführt wird müssen
die Positionen aller Schalter bekannt sein
(Alternativ wird die Position durch ein LDR vor der jeweiligen Statuslampe oder
einem elektrischen Kontakt am Hebel ermittelt)

Welche Schalter umgelegt werden wird über ein Array Schalter 2*6 über die Serielle
Verbindung übertragen. Wenn in Arduino keine 2D Arrays möglich sind wird ein 1D Array
mit doppelter Länge gewählt. (Ist auch einfacher für die Datenübertragung)

Der Abgleich der Position wird aus dem ArraySchalter ermittelt
ArraySchalter ( position 1 ) wenn einer der beiden Werte 1 ist wird die Position (1)
an das Array Position über geben um in einen Wert für die Position umgerechnet
Bsp 1 = 254.
Nach Umlegen der Schalter wird der Zähler hochgesetzt bis eine Spalte im Array erreicht wird
deren Wert nicht 0 ist.

Initialisierung zur Positionsbestimmung?
*/

int in1 = 9; //Motortreiber Pins
int in2 = 10;

int servo1 = ; // Steuerpins Servos
int servo2 = ;
int servoStart = 127; //Ruheposition Servos
int down = 255;
int up = 0;
int servoT = 300; //Schaltzeit für Servos

int velo = 33; //Kopfgeschwindigkeit
int pos = 0; //Zähler Positionssensor Kopf
int NrSchalter = 0; // Spalte Schalter
byte ArraySchalter[12];
byte ArraySchalteralt[12];
int ArrayPosition[6];
const int boundLeft = 0;
int boundRight = 200;

const byte sigPin = 3; // Pins Zähler Positionssensor Kopf
const byte interruptPin = 2;
volatile byte interruptPinChanged = 0;
byte inputflag = 1; //Freigabe für neue Eingabe


void setup () {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
attachInterrupt(0, interruptPositionUpdate, RISING);
Serial.begin(9600);
updateboundRight();
flipswitch();
}

void loop() {
if(interruptPinChanged) {
interruptPinChanged = 0;
Serial.println(pos);

if(pos <= boundLeft) {
Serial.println("Start Position reached");// und warten auf neue Eingabe durch Nutzer
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
inputflag = 1; //
} else if (pos >= boundRight) {
Serial.println("Position reached");//Motor anhalten und Schalterprogramm ausführen
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
flipswitch();
} else {
}

}
}


void interruptPositionUpdate() {
interruptPinChanged = 1;
if(digitalRead(sigPin))
pos--;
else
pos++;
}

void updateboundRight() {
/*
Es wird bestimmt welche Position als nächstes angefahren wird.
Dann wird der Kopf wieder gestartet
*/
while(!(ArraySchalter[NrSchalter]&&ArraySchalter[NrSchalter+6])){
NrSchalter++; // Überspringen leerer Spalten
}
if(NrSchalter==7){
NrSchalter=0;
analogWrite(in1, LOW); //Kopf geht nach links
digitalWrite(in2, velo);
//Warteposition anfahren und Positionsvariable pos bei erreichen der
//Lichtschranke auf 0 setzen
}
else{
boundRight=ArrayPosition[NrSchalter];
NrSchalter++;
analogWrite(in1, velo); //Kopf geht nach rechts
digitalWrite(in2, LOW);
}

}

void flipswitch(){
/*
Über Array Schalter wird entschieden welcher Schalter betätigt wird
aus ArraySchalteralt wird ermittelt in welche Richtung der Servo
den Schalter umlegen muss.
Danach wird updateboundRight ausgeführt und die nächste Kopfposition bestimmt.
Die Servos sind in Mittelstellung analogWrite(127) von dort dann ca 45°
nach oben oder unten und wieder in Ausgangsstellung.
Genaue Servopositionen sind dabei noch abhängig der Einbauposition zu ermitteln.
*/
if(ArraySchalter[NrSchalter]){//Schalterreihe oben servo 1
if(ArraySchalteralt[NrSchalter]){
//Schalter nach unten kippen
analogWrite (servo1, down);
delay(servoT);
}
else{
//Schalter nach oben kippen
analogWrite (servo1, up);
delay(servoT);
}
analogWrite (servo1, servoStart);
delay(servoT);
digitalWrite (servo1 ,LOW);

}
if(ArraySchalter[NrSchalter+6]){//Schalterreihe unten servo 2
if(ArraySchalteralt[NrSchalter]){
//Schalter nach unten kippen
analogWrite (servo2, down);
delay(servoT);
}
else{
//Schalter nach oben kippen
analogWrite (servo2, up);
delay(servoT);
}
analogWrite (servo2, servoStart);
delay(servoT);
digitalWrite (servo2 ,LOW);
}
updateboundRight();
}

void serialEvent(){
/*
Wenn eine Eingabe abgearbeitet wurde inputflag=1 wird der Controller frei für die
nächste Eingabe. Vorherige Eingaben werden somit verworfen. Die Eingabe wird aus
dem EingabeArray in ArraySchalter geschrieben und der Kopf nach rechts gestartet.
*/
}

+ 96
- 0
webinterface/webinterface.ino View File

@@ -0,0 +1,96 @@
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "Twilight";
const char* password = "V4ffwSzLMd7i";

ESP8266WebServer server(80); //creating the server at port 80

void setup() {
Serial.begin(115200);
// put your setup code here, to run once:

WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/form", formdata);
server.on("/", handleroot);

//configuring the server wherein you configure your url and function name, you can also mention your method(GET,POST..) if u want i.e server.on("/yourURL", method,function);

server.begin();
}

void handleroot() {
server.send(200, "text/html", "<html><head></head><body><h1>Relais-Rechner-Steuerung</h1><form action=\"/form\" method=\"post\"><ul><li><label><input type=\"checkbox\" name=\"switch1\" value=\"on\">2^4</label><label><input type=\"checkbox\" name=\"switch2\" value=\"on\">2^3</label><label><input type=\"checkbox\" name=\"switch3\" value=\"on\">2^2</label><label><input type=\"checkbox\" name=\"switch4\" value=\"on\">2^1</label><label><input type=\"checkbox\" name=\"switch5\" value=\"on\">2^0</label></li><li><label><input type=\"checkbox\" name=\"switch6\" value=\"on\">2^4</label><label><input type=\"checkbox\" name=\"switch7\" value=\"on\">2^3</label><label><input type=\"checkbox\" name=\"switch8\" value=\"on\">2^2</label><label><input type=\"checkbox\" name=\"switch9\" value=\"on\">2^1</label><label><input type=\"checkbox\" name=\"switch10\" value=\"on\">2^0</label></li></ul><button type=\"submit\">Go!</button></form></body></html>");
}

void formdata() {
char sw1='0',sw2='0',sw3='0',sw4='0',sw5='0',sw6='0',sw7='0',sw8='0',sw9='0',sw10='0';
if(server.hasArg("switch1")) {
sw1 = '1';
}
if(server.hasArg("switch2")) {
sw2 = '1';
}
if(server.hasArg("switch3")) {
sw3 = '1';
}
if(server.hasArg("switch4")) {
sw4 = '1';
}
if(server.hasArg("switch5")) {
sw5 = '1';
}
if(server.hasArg("switch6")) {
sw6 = '1';
}
if(server.hasArg("switch7")) {
sw7 = '1';
}
if(server.hasArg("switch8")) {
sw8 = '1';
}
if(server.hasArg("switch9")) {
sw9 = '1';
}
if(server.hasArg("switch10")) {
sw10 = '1';
}
Serial.print('A');
Serial.print(sw1);
Serial.print(sw2);
Serial.print(sw3);
Serial.print(sw4);
Serial.print(sw5);
Serial.print(sw6);
Serial.print(sw7);
Serial.print(sw8);
Serial.print(sw9);
Serial.print(sw10);
Serial.print('E');
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
}

void loop() {
server.handleClient();
}

Loading…
Cancel
Save