/* Stepper Motor Control - one revolution This program drives a unipolar or bipolar stepper motor. The motor is attached to digital pins 8 - 11 of the Arduino. The motor should revolve one revolution in one direction, then one revolution in the other direction. Created 11 Mar. 2007 Modified 30 Nov. 2009 by Tom Igoe */ #include #include const int stepsPerRevolution = 2*2*1600; // change this to fit the number of steps per revolution // for your motor const float lead = 3.0; // Steigung in mm // PINs const int stepper_1_a_gpio = 25; const int stepper_1_b_gpio = 33; const int butten_down_up_analog_read = 34; const int led_gpio = 32; const int button_down_gpio = 35; const int button_up_gpio = 34; const int relais_gpio = 13; const int wifi_btn_gpio = 14; const int power_led_gpio = 27; long power_off_timer = 0; const long power_off_timeout = 5*1000; // switch off power after 3 seconds bool power_enabled = false; // Replace with your network credentials const char* ssid = "ESP32-Access-Point"; const char* password = "123456789"; // Set web server port number to 80 WiFiServer server(80); // Variable to store the HTTP request String header; // Auxiliar variables to store the current output state String output26State = "off"; String output27State = "off"; // Assign output variables to GPIO pins const int output26 = 26; const int output27 = 27; // initialize the stepper library on pins 8 through 11: //Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); Stepper myStepper(stepsPerRevolution, stepper_1_a_gpio, stepper_1_b_gpio); void setup() { // set the speed at 60 rpm: pinMode(led_gpio, OUTPUT); pinMode(power_led_gpio, OUTPUT); //pinMode(button_down_gpio, INPUT_PULLDOWN); // for analog read not required //pinMode(button_up_gpio, INPUT_PULLDOWN); // for analog read not required pinMode(relais_gpio, OUTPUT); pinMode(wifi_btn_gpio, INPUT); disable_power(); myStepper.setSpeed(120); // initialize the serial port: Serial.begin(115200); } void do_test(){ Serial.print("Setting LED to LOW"); digitalWrite(power_led_gpio, LOW); delay(5000); Serial.print("Setting LED to HIGH"); digitalWrite(power_led_gpio, HIGH); delay(5000); } void setup_wifi_ap(){ // Connect to Wi-Fi network with SSID and password Serial.print("Setting AP (Access Point)…"); // Remove the password parameter, if you want the AP (Access Point) to be open WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(IP); server.begin(); } void move_x_mm(int x) { digitalWrite(led_gpio, HIGH); Serial.println(x); Serial.println(x/lead); myStepper.step(x/lead*stepsPerRevolution); digitalWrite(led_gpio, LOW); } void enable_power() { if(!power_enabled) { digitalWrite(relais_gpio, HIGH); digitalWrite(power_led_gpio, HIGH); Serial.println("enable relais"); delay(500); power_enabled = true; } power_off_timer = millis(); } void disable_power() { Serial.println("disable relais"); digitalWrite(relais_gpio, LOW); digitalWrite(power_led_gpio, LOW); power_enabled = false; } void _test_stepper(){ //Wdo_test(); //listen_for_wifi_client(); //enable_power(); //delay(2000); move_x_mm(10*3); //disable_power(); delay(3000); move_x_mm(-3*10); delay(3000); } void loop() { //_test_stepper(); //return; if(millis() > power_off_timer + power_off_timeout && power_enabled){ disable_power(); } int up_down_btn_val = analogRead(butten_down_up_analog_read); //delay(100); if (up_down_btn_val > 150 && up_down_btn_val < 300) { enable_power(); move_x_mm(2); } else if (up_down_btn_val > 1800 && up_down_btn_val < 2050) { enable_power(); move_x_mm(-2); } else if (up_down_btn_val > 0) { char format[] = "Btn Val=\"%d\""; char txt[50] = ""; sprintf(txt,format,up_down_btn_val); Serial.println(txt); } int up_button_state = digitalRead(button_up_gpio); //Serial.println(up_button_state); if ( up_button_state == HIGH ) { enable_power(); move_x_mm(2); } else { //disable_power(); } int down_button_state = digitalRead(button_down_gpio); //Serial.println(down_button_state); if ( down_button_state == HIGH ) { enable_power(); move_x_mm(-2); } else { //disable_power(); } //delay(10); /* Serial.println("on"); digitalWrite(led_gpio, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second Serial.println("off"); digitalWrite(led_gpio, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second */ /* // step one revolution in one direction: Serial.println("clockwise"); //myStepper.step(3*stepsPerRevolution); move_x_mm(10); delay(2500); // step one revolution in the other direction: Serial.println("counterclockwise"); //myStepper.step(-stepsPerRevolution); move_x_mm(-10); delay(2500); */ /* int wifi_btn_state = digitalRead(wifi_btn_gpio); if ( wifi_btn_state == HIGH ) { digitalWrite(led_gpio, HIGH); delay(200); digitalWrite(led_gpio, LOW); delay(200); digitalWrite(led_gpio, HIGH); delay(200); digitalWrite(led_gpio, LOW); delay(200); digitalWrite(led_gpio, HIGH); delay(200); digitalWrite(led_gpio, LOW); setup_wifi_ap(); } */ } void listen_for_wifi_client(){ WiFiClient client = server.available(); // Listen for incoming clients if (client) { // If a new client connects, Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) { // loop while the client's connected if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("GET /26/on") >= 0) { Serial.println("GPIO 26 on"); output26State = "on"; digitalWrite(output26, HIGH); } else if (header.indexOf("GET /26/off") >= 0) { Serial.println("GPIO 26 off"); output26State = "off"; digitalWrite(output26, LOW); } else if (header.indexOf("GET /27/on") >= 0) { Serial.println("GPIO 27 on"); output27State = "on"; digitalWrite(output27, HIGH); } else if (header.indexOf("GET /27/off") >= 0) { Serial.println("GPIO 27 off"); output27State = "off"; digitalWrite(output27, LOW); } // Display the HTML web page client.println(""); client.println(""); client.println(""); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println(""); // Web Page Heading client.println("

ESP32 Web Server

"); // Display current state, and ON/OFF buttons for GPIO 26 client.println("

GPIO 26 - State " + output26State + "

"); // If the output26State is off, it displays the ON button if (output26State=="off") { client.println("

"); } else { client.println("

"); } // Display current state, and ON/OFF buttons for GPIO 27 client.println("

GPIO 27 - State " + output27State + "

"); // If the output27State is off, it displays the ON button if (output27State=="off") { client.println("

"); } else { client.println("

"); } client.println(""); // The HTTP response ends with another blank line client.println(); // Break out of the while loop break; } else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); Serial.println("Client disconnected."); Serial.println(""); } }