Проект умного дома, соединить всё что можно ( я новичок, пришел за помощью)
- Войдите на сайт для отправки комментариев
Сб, 10/03/2018 - 22:33
Всем добрый день, вот решил заняться небольшим проэктом, начинаю с автоматических занавесок, НАписал код но он вместо того что бы бесконечно вращаться, делает один шаг и всё.
Использую модуль ESP 8266, Изидрайвер, и просто шаговый! Что я делаю не так? Почему цикл Stepping не зацикливаеться?
// скетч для вайфай окна
#include <ESP8266WiFi.h>
#define DIR_PIN D6
#define STEP_PIN D5
#define OPEN_W D1
#define CLOSE_W D2
#define SLIP_PIN D3
const char* ssid = "ASUS";
const char* password = "12369852";
int o = 0;
int c = 0;
int Stepping = false;
int val = 0;
WiFiServer server(80); // порт для сервера
void setup() {
Serial.begin(115200); // устанавливаем скорость соединение
pinMode(SLIP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(OPEN_W, INPUT_PULLUP);
pinMode(CLOSE_W, INPUT_PULLUP);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("WiFi connected");
server.begin(); // ЗАпуск сервера
Serial.println("Server started");
}
void loop() {
boolean OPEN = !digitalRead(OPEN_W);
boolean CLOS = !digitalRead(CLOSE_W);
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
String req = client.readStringUntil('\r');
if (req.indexOf("/OPEN")){
digitalWrite(SLIP_PIN, HIGH);
Serial.print("Окно открываеться... ");
o = 1;
digitalWrite(DIR_PIN, HIGH); //направление на закрытие окна
Stepping = true;
}
if (req.indexOf("/CLOOSE")){
digitalWrite(SLIP_PIN, HIGH);
Serial.print("Окно закрыветься... ");
c = 1;
digitalWrite(DIR_PIN, LOW); //направление на открытие окна
Stepping = true;
}
if (Stepping == true) {
digitalWrite(STEP_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(400); // чем ниже число теб быстрее вращаеться двигатель
}
if (o == 1 && OPEN == 1){ // окно открывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна
Serial.println("Окно открыто");
o = 0;
Stepping = false;
client.flush();
digitalWrite(SLIP_PIN, LOW);
}
if (c == 1 && CLOS == 1){ // окно закрывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна
Serial.println("Окно закрыто");
c = 0;
Stepping = false;
client.flush();
digitalWrite(SLIP_PIN, LOW);
}
}
А цикл-то где? Вы делаете один шаг, а потом снова садитесь на бесконечное ожидание команды с клиента (в строках 51-53)
71if(Stepping ==true) {72digitalWrite(STEP_PIN, LOW);73digitalWrite(STEP_PIN, HIGH);74delayMicroseconds(400);// чем ниже число теб быстрее вращаеться двигательВот этот цыкл должен повторяться пока правда не смениться на лож ..... но нет .... не хочет
И цик ожидания уже удалил, не помогло!
while (Stepping == true) { digitalWrite(STEP_PIN, LOW); delayMicroseconds(400); digitalWrite(STEP_PIN, HIGH);Поменять на
if (Stepping == true) { digitalWrite(STEP_PIN, LOW); delayMicroseconds(400); digitalWrite(STEP_PIN, HIGH);всё ровно ничего не работает, делает шаг и ждёт, что я не так делаю?!
// скетч для вайфай окна #include <ESP8266WiFi.h> #define DIR_PIN D6 #define STEP_PIN D5 #define OPEN_W D1 #define CLOSE_W D2 #define SLIP_PIN D3 const char* ssid = "ASUS"; const char* password = "12369852"; int o = 0; int c = 0; int Stepping = false; int val = 0; int O = 0; int C = 0; WiFiServer server(80); // порт для сервера void setup() { void setPort(uint16_t port); void setHostname(const char* hostname); void setPassword(const char* password); void begin(); Serial.begin(115200); // устанавливаем скорость соединение pinMode(SLIP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); pinMode(OPEN_W, INPUT_PULLUP); pinMode(CLOSE_W, INPUT_PULLUP); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } Serial.println("WiFi connected"); server.begin(); // ЗАпуск сервера Serial.println("Server started"); } void loop() { WiFiClient client = server.available(); if (!client) { return; } String req = client.readStringUntil('\r'); if (req.indexOf("/OPEN")){ shag_speed(HIGH, LOW, 1); } else if (req.indexOf("/CLOOSE")){ shag_speed(HIGH, HIGH, 2); } } void shag_speed(int SLIP_PIN, int DIR_PIN, int GO){ if (SLIP_PIN == HIGH && DIR_PIN == LOW && GO == 1){ digitalWrite(SLIP_PIN, HIGH); Serial.print("Окно открываеться... "); o = 1; digitalWrite(DIR_PIN, HIGH); //направление на закрытие окна Stepping = true; } if (SLIP_PIN == HIGH && DIR_PIN == HIGH && GO == 2){ digitalWrite(SLIP_PIN, HIGH); Serial.print("Окно закрыветься... "); c = 1; digitalWrite(DIR_PIN, LOW); //направление на открытие окна Stepping = true; } boolean OPEN = !digitalRead(OPEN_W); boolean CLOS = !digitalRead(CLOSE_W); while (Stepping == true) { digitalWrite(STEP_PIN, LOW); delayMicroseconds(400); digitalWrite(STEP_PIN, HIGH); // чем ниже число теб быстрее вращаеться двигатель } if (o == 1 && OPEN == 1){ // окно открывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна Serial.println("Окно открыто"); o = 0; O = 0; Stepping = false; digitalWrite(SLIP_PIN, LOW); } if (c == 1 && CLOS == 1){ // окно закрывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна Serial.println("Окно закрыто"); c = 0; C = 0; Stepping = false; digitalWrite(SLIP_PIN, LOW); } }if (Stepping == true) {Вот этот цыкл должен повторяться пока правда не смениться на лож ..... но нет .... не хочет
Это не цикл и ничего он Вам не должен, тем более повторяться.
Поменять на
Вы что, методом тыка их меняете?
Ну, вот, написали Вы
while (Stepping == true) { digitalWrite(STEP_PIN, LOW); delayMicroseconds(400); digitalWrite(STEP_PIN, HIGH); // чем ниже число теб быстрее вращаеться двигатель }Зачем?
Ответьте себе (мне не надо, я знаю ответ) на простой вопрос: кто, когда и при каких обстоятельствах изменит Вашу переменную с true на false, чтобы этот цикл смог закончиться?
Я понимаю что у меня ошибка именно с этим, но вот ничего не понимаю .... вроде всё правильно! когда открываеться ссылка запускаеться либо открыть либо закрыть, после чего они должны перевести Stepping в положение правда, а уже конечниками отключить! но он просто игнорирует и проходит дальше, програмированием я начал заниматься сравнительно недавно, и прошу о помощи, показать хотя бы прример того, как правильно должно быть
НАсчёт while, как я понял эта команда отвечает за постоянное выполнение в скобках пока в скобочках верно! И да он работает, вращаеться, но сделает пару оборотов и висит! Возможно я не вижу чего то очивидного что заставляет модуль висеть!
Вот вариант при котором всё работает но зависает!
// скетч для вайфай окна #include <ESP8266WiFi.h> #define DIR_PIN D6 #define STEP_PIN D5 #define OPEN_W D1 #define CLOSE_W D2 #define SLIP_PIN D3 const char* ssid = "ASUS"; const char* password = "12369852"; int o = 0; int c = 0; int Stepping = false; int val = 0; int O = 0; int C = 0; WiFiServer server(80); // порт для сервера void setup() { void setPort(uint16_t port); void setHostname(const char* hostname); void setPassword(const char* password); void begin(); Serial.begin(115200); // устанавливаем скорость соединение pinMode(SLIP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); pinMode(OPEN_W, INPUT_PULLUP); pinMode(CLOSE_W, INPUT_PULLUP); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } Serial.println("WiFi connected"); server.begin(); // ЗАпуск сервера Serial.println("Server started"); } void loop() { WiFiClient client = server.available(); if (!client) { return; } String req = client.readStringUntil('\r'); if (req.indexOf("/OPEN")){ shag_speed(HIGH, LOW, 1); } else if (req.indexOf("/CLOOSE")){ shag_speed(HIGH, HIGH, 2); } } void shag_speed(int SLIP_PIN, int DIR_PIN, int GO){ if (SLIP_PIN == HIGH && DIR_PIN == LOW && GO == 1){ digitalWrite(SLIP_PIN, HIGH); Serial.print("Окно открываеться... "); o = 1; digitalWrite(DIR_PIN, HIGH); //направление на закрытие окна Stepping = true; } if (SLIP_PIN == HIGH && DIR_PIN == HIGH && GO == 2){ digitalWrite(SLIP_PIN, HIGH); Serial.print("Окно закрыветься... "); c = 1; digitalWrite(DIR_PIN, LOW); //направление на открытие окна Stepping = true; } boolean OPEN = !digitalRead(OPEN_W); boolean CLOS = !digitalRead(CLOSE_W); while (Stepping == true) { digitalWrite(STEP_PIN, LOW); delayMicroseconds(400); digitalWrite(STEP_PIN, HIGH); // чем ниже число теб быстрее вращаеться двигатель if (o == 1 && OPEN == 1){ // окно открывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна Serial.println("Окно открыто"); o = 0; O = 0; Stepping = false; digitalWrite(SLIP_PIN, LOW); } if (c == 1 && CLOS == 1){ // окно закрывается и замыкая конечничь останавливает двигатель и переводит драйвер в режим сна Serial.println("Окно закрыто"); c = 0; C = 0; Stepping = false; digitalWrite(SLIP_PIN, LOW); } } }Знаете, если Вы настолько не умеете программировать, то Вам просто рано делать "умный дом". Намучаетесь и окончательно потеряете веру в себя. Возьмите нормальный учебник программирования и попробуйте сделать проектик попроще. Потом вернётесь к умному дому уже на новом уровне.
Это из серии
ответьте сколько на пине STEP_PIN длится LOW , а солько HIGH?