• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wyjście z pętli for nie działa
#1
Witam wszystkich  Smile
Robię zasłony okienne sterowane przez silnik krokowy ale nie działa mi wyjście z pętli for.
Układ po włączeniu zasilania za każdym razem ma za zadanie ustawić zasłony w pozycji zerowej czyli kręcić silnikiem krokowym w jedna stronę aż do krańcówki,niestety pętla wykonuje się do spełnienia warunku a nie do załączenia krańcówki gdzie powinno opuścić pętle for ? Program wychodzi z pętli tylko jak krańcówka jest załączona jeszcze przed zasileniem układu ?

Kod:
void setup() {

int kroki = 5; // na przykład

kroki = ilosc_obrotow * 200;

if(krancowkaState == LOW) //przycisk

{
 for(int x = 0; x < kroki; x++){  // robi pięć obrotów
 digitalWrite(stepPin,HIGH);
 delay(predkosc);
 digitalWrite(stepPin,LOW);
 delay(predkosc);

 if(krancowkaState == HIGH)     // tu pętla nie raguje na załączenie przycisku
                                // chyba że wciśniety przed zasileniem ukladu
 {                            
   Serial.println("Wyjscie z petli");
   break;                              //próbowałem tez kroki=6; i tez nie wychodzi z petli
 }
 
    }
  }
}
 
Odpowiedź
#2
Wejdź do przykładów Arduino i zobacz jak się obsługuje przyciski. Na pinie gdzie masz odczytywać stan przycisku musisz wymusić określony stan niski lub wysoki przez rezystor, np. 10k, a przycisk ma go zmienić na przeciwny. Możesz to zrobić podając parametr INPUT_PULLUP, wtedy wykorzystasz wewnętrzny rezystor podciągający do VCC, wewnętrzny podciąga tylko do stanu wysokiego (UNO,PRO MINI, NANO), także przyciskiem możesz zwierać tylko do GND, a o wciśnięciu przycisku świadczy odczyt 0, lub !1 (nie 1, nie HIGH).
W sumie nie musisz definiować tego pinu jako wejścia, bo tak są domyślnie ustawione piny Atmegi, ale dla porządku lepiej to zrobić, nie wiem co tam Arduino sobie wyrabia po starcie. Przykład masz u siebie w podstawach.
Masz zewnętrzny rezystor pull_down i zwierasz krańcówką do VCC? Z opisu, że działa jak zewrzesz przed włączeniem domyślam się, że robisz to na oślep.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(20-05-2018, 19:10)kaczakat napisał(a):
Cytat:Wejdź do przykładów Arduino i zobacz jak się obsługuje przyciski. Na pinie gdzie masz odczytywać stan przycisku musisz wymusić określony stan niski lub wysoki przez rezystor, np. 10k, a przycisk ma go zmienić na przeciwny. Możesz to zrobić podając parametr INPUT_PULLUP, wtedy wykorzystasz wewnętrzny rezystor podciągający do VCC, wewnętrzny podciąga tylko do stanu wysokiego (UNO,PRO MINI, NANO), także przyciskiem możesz zwierać tylko do GND, a o wciśnięciu przycisku świadczy odczyt 0, lub !1 (nie 1, nie HIGH).
W sumie nie musisz definiować tego pinu jako wejścia, bo tak są domyślnie ustawione piny Atmegi, ale dla porządku lepiej to zrobić, nie wiem co tam Arduino sobie wyrabia po starcie. Przykład masz u siebie w podstawach.
Masz zewnętrzny rezystor pull_down i zwierasz krańcówką do VCC? Z opisu, że działa jak zewrzesz przed włączeniem domyślam się, że robisz to na oślep.
 Przycisk z rezystorem mam opanowany,wstawię cały kod:

Kod:
#include <ESP8266WiFi.h>

const char* ssid = "TALKTALK92E85E"; //////////  TU WPISZ NAZWE SWOJEJ SIECI  //////////////////////////////////////////////////////////////////////////
const char* password = "SDFGFR";  ///////////  TU WPISZ HASLO DO SWOJEJ SIECI  ///////////////////////////////////////////////////////////////////////  

int stepPin = D1;
int dirPin = D2;
int sleep = D3;
int ilosc_obrotow = 5; ////////////////////////  TU USTALASZ ILOSC OBROTOW /////////////////////////////////////////////////////////////////////////////
int predkosc = 1; ////////////////////////////   TU USTALASZ PREDKOSC SILNIKA - 1 NAJSZYBCIEJ - 5 NAJWOLNIEJ  //////////////////////////////////////////
int kroki = 0;
int kolejnosc = 0;
int krancowka = D5;
int krancowkaState = 0;
int zmienna = 0;

IPAddress ip(192,168,1,128);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

WiFiServer server(80);

void setup() {
 Serial.begin(9600);
 delay(100);
 
 pinMode(stepPin,OUTPUT);
 pinMode(dirPin,OUTPUT);
 pinMode(sleep,OUTPUT);
 pinMode(krancowka, INPUT);

 digitalWrite(sleep,LOW);

 kroki = ilosc_obrotow * 200;

 Serial.println();
 Serial.println();
 Serial.print("Laczenie do");
 Serial.println(ssid);

 WiFi.begin(ssid, password);

 WiFi.config(ip, gateway, subnet);

 while (WiFi.status() != WL_CONNECTED) {
   delay(5000);
   Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi podlaczone");

 // Start the server
 server.begin();
 Serial.println("Start serwera");

 // Print the IP address
 Serial.print("Uzyj tego URL   ");
 Serial.print("http://");
 Serial.print(WiFi.localIP());
 Serial.println("/");

 krancowkaState = digitalRead(krancowka);

/////////////////////////////////////////////  TO NIE DZIAŁA   //////////////////////////////////

if(krancowkaState == LOW)
{
 digitalWrite(sleep,HIGH);
 digitalWrite(dirPin,HIGH);
 for(int x = 0; x < kroki; x++){
 digitalWrite(stepPin,HIGH);
 delay(predkosc);
 digitalWrite(stepPin,LOW);
 delay(predkosc);
 if(krancowkaState == HIGH)
 {
   Serial.println("Wyjscie z petli");
   break;
 }
 
    }
  }
}

////////////////////////////////////////////////////////////////////////////////////////////////


void loop() {
 WiFiClient client = server.available();
 if (!client) {
   return;
 }

 // Wait until the client sends some data
 Serial.println("Nowy klient");
 while(!client.available()){
   delay(10);
 }

 // Read the first line of the request
 String request = client.readStringUntil('\r');
 Serial.println(request);
 client.flush();

 if (request.indexOf("/Odsloniete") != -1) {
 if (kolejnosc ==0) {  
 digitalWrite(sleep,HIGH);
 digitalWrite(dirPin,LOW);
 for(int x = 0; x < kroki; x++){
 digitalWrite(stepPin,HIGH);
 delay(predkosc);
 digitalWrite(stepPin,LOW);
 delay(predkosc);
 }
}    
     client.println("HTTP/1.1 200 OK");
     client.println("Content-Type: text/html");
     client.println("");
     client.println("<!DOCTYPE HTML>");
     client.println("<html>");
     client.println("Odsloniete");
     client.println("</html>");
     digitalWrite(sleep,LOW);
     kolejnosc = 1;
 }
 
 if (request.indexOf("/Zasloniete") != -1)  {
 if (kolejnosc == 1) {
 digitalWrite(sleep,HIGH);
 digitalWrite(dirPin,HIGH);
 for(int x = 0; x < kroki; x++){
 digitalWrite(stepPin,HIGH);
 delay(predkosc);
 digitalWrite(stepPin,LOW);
 delay(predkosc);
 }
}    
     client.println("HTTP/1.1 200 OK");
     client.println("Content-Type: text/html");
     client.println("");
     client.println("<!DOCTYPE HTML>");
     client.println("<html>");
     client.println("Zasloniete");
     client.println("</html>");
     digitalWrite(sleep,LOW);
     kolejnosc = 0;
 }

 client.println("<br><br>");
 client.println("<a href=\"/Odsloniete\"\"><button>ODSLON</button></a>");
 client.println("<a href=\"/Zasloniete\"\"><button>ZASLON</button></a><br />");  
 client.println("</html>");
}
 
Odpowiedź
#4
Jak wejdziesz w pętle for to stan krańcówki sprawdzasz splątaniem kwantowym?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(20-05-2018, 19:48)kaczakat napisał(a): Jak wejdziesz w pętle for to stan krańcówki sprawdzasz splątaniem kwantowym?

A tak w języku zrozumiałym dla mnie mogę ?   Undecided
 
Odpowiedź
#6
No jak sprawdzasz czy krańcówka zadziałała po wejściu do pętli for, gdy silnik przekręci już trochę tę zasłonkę?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(20-05-2018, 20:04)kaczakat napisał(a): No jak sprawdzasz czy krańcówka zadziałała po wejściu do pętli for, gdy silnik przekręci już trochę tę zasłonkę?

No właśnie to jest mój problem. Jeśli nacisnę krańcówkę i po tym włączę zasilanie to silnik nie rusz czyli tak jak by stal na krańcówce i wyświetla:

Kod:
Serial.println("Wyjście z pętli");
  Ale jeśli silnik już ruszy ko krańcówka nie reaguje,pętla wykonuje całe pięć obrotów.Nie wiem jak mam wyjść z pętli tak żeby silnik staną w trakcie  pracy w pętli.
 
Odpowiedź
#8
Ok, możemy tak do rana. Tu sprawdzasz stan krańcówki i przypisujesz do zmiennej:

Kod:
 krancowkaState = digitalRead(krancowka);
To wstaw to gdzieś do tej pętli, bo sprawdzasz ciągle zmienną z dalekiej przeszłości.
Kod:
f(krancowkaState == LOW)
{
digitalWrite(sleep,HIGH);
digitalWrite(dirPin,HIGH);
for(int x = 0; x < kroki; x++){
digitalWrite(stepPin,HIGH);
delay(predkosc);
digitalWrite(stepPin,LOW);
delay(predkosc);
//o tu:
 krancowkaState = digitalRead(krancowka);


if(krancowkaState == HIGH) //albo zamiast tego: if( digitalRead(krancowka)==HIGH)
{
  Serial.println("Wyjscie z petli");
  break;
}

   }
 }
}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
(20-05-2018, 20:50)kaczakat napisał(a): Ok, możemy tak do rana. Tu sprawdzasz stan krańcówki i przypisujesz do zmiennej:

Kod:
 krancowkaState = digitalRead(krancowka);
To wstaw to gdzieś do tej pętli, bo sprawdzasz ciągle zmienną z dalekiej przeszłości.
Kod:
f(krancowkaState == LOW)
{
digitalWrite(sleep,HIGH);
digitalWrite(dirPin,HIGH);
for(int x = 0; x < kroki; x++){
digitalWrite(stepPin,HIGH);
delay(predkosc);
digitalWrite(stepPin,LOW);
delay(predkosc);
//o tu:
 krancowkaState = digitalRead(krancowka);


if(krancowkaState == HIGH) //albo zamiast tego: if( digitalRead(krancowka)==HIGH)
{
  Serial.println("Wyjscie z petli");
  break;
}

   }
 }
}

kaczakat


Jesteś wielki  Tongue

Zrobiłem bezprzewodowe sterowanie silnikiem przez telefon i kompa a tu taka wtopa.

Jeszcze raz dzięki  Shy
 
Odpowiedź
#10
Proszę bardzo.
Tak bywa - nie widzi się własnych literówek, ktoś musi spojrzeć z boku.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości