/* 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 #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 unsigned int STEPPER_1_PULSE_GPIO = 25; const unsigned int STEPPER_1_DIR_GPIO = 33; const unsigned int STEPPER_2_PULSE_GPIO = 99; const unsigned int STEPPER_2_DIR_GPIO = 99; 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; // power relais control long power_off_timer = 0; const long power_off_timeout = 5*1000; // switch off power after 3 seconds bool power_enabled = false; // stepper positions / dir / endstops long current_stepper_position = 0; // must be loaded from persisted data; reseted by endstop(s) ////////// WIFI Krempel // 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; ////////// WIFI Krempel ///// Persisted Data (Preferences) Preferences preferences; //struct PersistedData{ // long last_position; // int initialized_magic_number; // set to a predifend value AFTER initialization of memory was done, indicating successfull initialization // char ssid[64]; // char wifi_pw[32]; //}; void load_persisted_data(){ //EEPROM.get( eeAddress, p_data ); Serial.println( "Read custom object from EEPROM: " ); Serial.println( preferences.getLong("last_position") ); Serial.println( preferences.getInt("initialized_magic_number") ); Serial.println( preferences.getString("ssid") ); Serial.println( preferences.getString("wifi_pw") ); } void calibrate(){ } // initialize the stepper library on pins 8 through 11: //Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); //Stepper myStepper(stepsPerRevolution, stepper_1_pulse_gpio, stepper_1_dir_gpio); AccelStepper stepper1(AccelStepper::DRIVER, STEPPER_1_PULSE_GPIO, STEPPER_1_DIR_GPIO); AccelStepper stepper2(AccelStepper::DRIVER, STEPPER_2_PULSE_GPIO, STEPPER_2_DIR_GPIO); // Up to 10 steppers can be handled as a group by MultiStepper MultiStepper steppers; void setup_steppers(){ // set the speed at 60 rpm: //myStepper.setSpeed(120); // Configure each stepper stepper1.setMaxSpeed(stepsPerRevolution); stepper2.setMaxSpeed(stepsPerRevolution); // Then give them to MultiStepper to manage steppers.addStepper(stepper1); steppers.addStepper(stepper2); } void setup() { preferences.begin("hvst", false); load_persisted_data(); setup_steppers(); 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(); // 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); long steps = x/lead*stepsPerRevolution; current_stepper_position + steps; long positions[2]; positions[0] = current_stepper_position; positions[1] = current_stepper_position; steppers.moveTo(positions); steppers.runSpeedToPosition(); // blocking call; alternative might be just run... 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() { Serial.println("load_persisted_data();"); load_persisted_data(); Serial.println("data loaded;"); delay(1000); //_test_stepper(); long positions[2]; // Array of desired stepper positions positions[0] = 1000; positions[1] = 50; steppers.moveTo(positions); steppers.runSpeedToPosition(); // Blocks until all are in position delay(1000); 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(""); } }