Skocz do zawartości

Zmienne millis, prośba o pomoc


SOYER

Pomocna odpowiedź

No to nie zrozumiałeś przykładu.

Zastanów się. Jak chcesz, żeby twój program robił coś przez cały czas (na przykład sprawdzał przycisk), to nie możesz mieć żadnego delay. Zrób porządnie maszynę stanów w pętli, z przełączaniem stanów gdy upłynie odpowiednia liczba milisekund i gotowe. Za każdym razem, kiedy twój program na coś czeka, ma wykonywać główną pętlę.

Link do komentarza
Share on other sites

SOYER, delay oznacza dla mikrokontrolera "zamknij oczy, zatkaj uszy i czekaj". Program nie może nic sprawdzać, ani niczego innego wykonywać, tylko czeka. Takie działanie sprawdza się w prostych zastosowaniach, ale Ty chciałbyś czekać na jedną z dwóch rzeczy: mija zadany czas, albo został naciśnięty przycisk.

Można do tego użyć przerwań, ale to o wiele bardziej skomplikowane.

Najprościej jest napisać własną funkcję, powiedzmy mydelay, która będzie w pętli czekała zadany czas używając millis(), a jeśli wykryje, że przyciśnięto przycisk, od razu zakończy działanie.

Taka funkcja jest prosta, ale sprawdzi się tylko w prostych programach. Dla bardziej rozbudowanych zastosowań, a pracowicie rozwijasz swój program do czegoś takiego wymyślono automaty skończone. https://pl.wikipedia.org/wiki/Automat_sko%C5%84czony, https://en.wikipedia.org/wiki/Finite-state_machine

Tylko nie wiem, czy nie próbujesz zaczynać od zbyt ambitnych zadań.

Link do komentarza
Share on other sites

Dobra, nad millis jeszcze będę kombinował, bo na razie nie łapię tego... czy mam tą funkcję z millis dać do setup?

Na razie zrobiłem to na przerwaniu i działa choć nie do końca(o tym pod kodem):

#include <LiquidCrystal.h> //Dołączenie bilbioteki
#include <SimpleDHT.h>
LiquidCrystal lcd(8, 3, 4, 5, 6, 7); //Informacja o podłączeniu 
int pinDHT11 = 13; //pin czujnika
int maphum; //zmienna do sterowania diodami
SimpleDHT11 dht11; 
boolean wyslano = false;

void setup() {
  attachInterrupt(digitalPinToInterrupt(2), wynikiP, LOW);
 Serial.begin(9600); 
 Serial.println(digitalRead(2));
 pinMode(2, INPUT_PULLUP);
}

void loop() {

byte temperature = 0; 
 byte humidity = 0; 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika

 dzieci();
 wyniki();
 franek();
 wyniki();
 dominik();
 wyniki();
 zosia();

}
void wynikiP(){
 while(digitalRead(2) == LOW){
   if(wyslano == false){
 byte temperature = 0; 
 byte humidity = 0; 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika
 lcd.begin(16, 2); // ustawiamy lcd dla nast. wyswietlenia
 lcd.setCursor(2, 0); 
 lcd.print("Wilg.: "); 
 lcd.print((int)humidity); 
 lcd.print("%RH"); 
 lcd.setCursor(2, 1); 
 lcd.print("Temp.: "); 
 lcd.print((int)temperature); 
 lcd.print("*C"); // wyswietlamy temp. i wilgotnosc wraz z jednostkami
wyslano = true;
}
}
}
void zosia(){
 wyslano=false;
 lcd.begin(16, 2);
 lcd.setCursor(16,0);
 lcd.print(" Czesc Zosia :-)");  //tekst 1 linii
 for (int positionCounter = 0; positionCounter < 33; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 15 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void franek(){
 wyslano=false;
 lcd.begin(16, 2);
 lcd.setCursor(16,1);
 lcd.print(" Czesc Franek :-)");  //tekst 2 linii
 delay(1500);  // czekamy z ww. tekstem
 for (int positionCounter = 0; positionCounter < 35; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 15 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void wyniki(){
 wyslano=false;
 byte temperature = 0; 
 byte humidity = 0; 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika
 lcd.begin(16, 2); // ustawiamy lcd dla nast. wyswietlenia
 lcd.setCursor(2, 0); 
 lcd.print("Wilg.: "); 
 lcd.print((int)humidity); 
 lcd.print("%RH"); 
 lcd.setCursor(2, 1); 
 lcd.print("Temp.: "); 
 lcd.print((int)temperature); 
 lcd.print("*C"); // wyswietlamy temp. i wilgotnosc wraz z jednostkami
 delay(3000); // czekamy z ww. tekstem 
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) {
   lcd.scrollDisplayRight(); //przewijamy ww tekst do prawej krawedzi lcd
   delay(1000);// szybkosc przewijania
 }
 for (int positionCounter = 0; positionCounter < 4; positionCounter++) {
   lcd.scrollDisplayLeft(); //przewijamy do lewej krawedzi ww tekst
   delay(1000); // szybkosc przeijania
 }
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) {
   lcd.scrollDisplayRight(); // przewijamy teks znowu do srodka lcd
   delay(1000); //czekamy
 }
 delay(3000);
}
void dominik(){
 wyslano=false;
 lcd.begin(16, 2);
 lcd.setCursor(16,0);
 lcd.print(" Czesc Dominik :-)");  //tekst 2 linii
 delay(1500);  // czekamy z ww. tekstem
 for (int positionCounter = 0; positionCounter < 35; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 15 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void dzieci(){
 wyslano=false;
 int migniecie = 0;
 lcd.begin(16, 2);
 lcd.setCursor(4,0);
 lcd.print("Dominik");  //tekst 2 linii
 lcd.setCursor(2,1);
 lcd.print("Zosia Franek");
  for(int migniecie =0; migniecie <10; migniecie++){
    lcd.noDisplay();
    delay(500);
    lcd.display();
    delay(500);
  }
}

Dlaczego w funkcji wynikiP nie odczytuje mi danych z czujnika, a w pozostałych nie ma problemu?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

A takie pytanie... Ty w ogóle rozumiesz to co robisz, czy bezmyślnie przepisujesz fragmenty kodu z jakichś programów nie dbając o to, czy mają jakikolwiek sens?

Jest uważasz że rozumiesz - to mylisz się.

Jest przepisujesz i uważasz że to musi działać - zgłoś się do Antka Emigranta na Onecie. Pewnie nie pomoże, ale przynajmniej pogłaszcze po główce...

Ktoś Ci już powiedział - zacznij od czegoś prostszego.

Moja dobra rada: duuuuuużo prostszego.

Link do komentarza
Share on other sites

Chłopaki mam program który wypisuje na ekranie to co widać, robi to z przewijaniem, na zmianę wyświetla imiona dizeciaków i wyniki z DHT. Chcę zrobić najprostszą rzecz: przerwać pętlę w momencie naciśnięcia przycisku i kazać wyświetlić wyniki. Że robię źle to widzę, bo nie działa, opieram się tylko i wyłącznie na wiedzy z kursu arduino forbotu i waszych rad. Jeśli nie da się tego zrobić z delay które są w tym przypadku konieczne do przewijania tekstu, to napiszcie, że ze względu na konieczność stosowania delay do przewijania nie da się przerwać programu. Jeśli wiecie jak to zrobić W TYM KONKRETNYM PROGRAMIE to proszę o pomoc przy dodaniu tej funkcjonalności, jak nie wiecie albo nie chcecie pomóc to proszę nie zabierajcie głosu w dyskusji. Bierzcie przykład z Deshipu albo Elvisa...

[ Dodano: 28-11-2017, 16:11 ]

Bo to co robisz jest złe... Nawet jeśli ten program wydaje się działać jest po prostu niepoprawny. Nie należy tak używać przerwań.

Elvis napisz proszę co jest niepoprawne, "nie należy tak używać przerwań", tak czyli jak?

Link do komentarza
Share on other sites

Nie przesadzajmy, to nie jest jakoś bardzo skomplikowane. Tylko trudno jest przerobić istniejący program w ten sposób. Łatwiej napisać to od nowa.

Narysuj sobie graf wszystkich możliwych stanów — czyli tego co ma być wyświetlane, w tym przypadku — oraz przejść pomiędzy nimi — czyli co musi się wydarzyć, żeby się stan zmienił. Każdy z tych stanów, to będzie osobny case w switchu sprawdzającym zmienną z obecnym stanem. I każdy musi być napisany bez delay–ów — tam, gdzie wcześniej miałeś jakieś polecenia, potem delay, potem dalsze polecenia, musisz mieć dwa if-y sprawdzające millis i robiące pierwsze albo drugie polecenia w zależności od tego ile czasu minęło od wejścia do tego stanu.

[ Dodano: 28-11-2017, 16:14 ]

Delay nie jest konieczne do przewijania tekstu. Tekst równie dobrze możesz przewijać sprawdzając ile czasu upłynęło i ustawiając na podstawie tego pozycję tekstu.

  • Lubię! 1
Link do komentarza
Share on other sites

Twierdzisz że delay jest konieczne do przewijania... Udowodnij to.

Chcesz pomocy od konkretnych osób... Pisz na priv. To nie miejsce na to, aby twierdzić że deshipu jest lepszy od Elvisa (albo odwrotnie) a ethanak to się w ogóle nie zna.

Ogólnie: przestań jojczeć i do roboty.

Link do komentarza
Share on other sites

A takie pytanie... Ty w ogóle rozumiesz to co robisz, czy bezmyślnie przepisujesz fragmenty kodu z jakichś programów nie dbając o to, czy mają jakikolwiek sens?

Jest uważasz że rozumiesz - to mylisz się.

Jest przepisujesz i uważasz że to musi działać - zgłoś się do Antka Emigranta na Onecie. Pewnie nie pomoże, ale przynajmniej pogłaszcze po główce...

Ktoś Ci już powiedział - zacznij od czegoś prostszego.

Moja dobra rada: duuuuuużo prostszego.

Ethanak, nie uważam, że rozumiem, próbuję, nie uważam, że musi działać, próbuję.

Piszesz, że mam zacząc od czegoś prostszego, ok, to pokaż mi jak przerwać mój program by zyskał tą funkcjonalność...

[ Dodano: 28-11-2017, 16:22 ]

Twierdzisz że delay jest konieczne do przewijania... Udowodnij to.

Chcesz pomocy od konkretnych osób... Pisz na priv. To nie miejsce na to, aby twierdzić że deshipu jest lepszy od Elvisa (albo odwrotnie) a ethanak to się w ogóle nie zna.

Ogólnie: przestań jojczeć i do roboty.

Nie twierdzę, że delay jest konieczne do przewijania, cały czas odnosimy się do mojego "programu", w nim delay jest konieczne do przewiajania,

nie chcę pomocy od konkretnych osób, chcę rzeczowości i unikania osobistych wycieczek, dlatego daję przykład konkretnych osób,
nie jejczę, chcesz posłuchać jejczenia to zapraszam do siebie na piwo jak teściow aprzyjedzie w odwiedziny;-)

luzik....

Link do komentarza
Share on other sites

Wywal ten "program" tam gdzie jego miejsce.

Zacznij od założeń (chcę osiągnąć coś takiego) a nie od chycia bujem i chcenia (nie rozumiem co napisałem ale poprawcie to żeby działało).

Powtarzam: zacznij od czegoś prostszego. Bo na razie jesteś w sytuacji gościa, który właśnie opanował tabliczkę mnożenia i chce opracować trajektorię lotu na Marsa.

Z chęcią Ci pomożemy... Ale pozwól sobie pomóc!

Link do komentarza
Share on other sites

Czyli czasami pisanie programu i później dopisywanie czegoś nowego i nowego może spowodować, że to co wcześniej napisaliśmy nijak będzie się nadawać do tego na co chcemy to przerobić, to już jakaś nauka dla początkującego:-). Zresztą tak jest ze wszystkim, widzę, że z programowanie również.

Wnioski: czy w podobnie prostym programie zawierającym millis nie można stosować delay?

co było źle w programie z przerwaniem?

Link do komentarza
Share on other sites

Może napisz osobny program, który tylko będzie przewijał tekst, ale bez delay -- tylko na millis. Potem dodaj do niego przewijanie raz jednego a raz innego tekstu. Potem przełączanie tego przyciskiem. Dalej już powinno być z górki.

  • Lubię! 1
Link do komentarza
Share on other sites

Wywal ten "program" tam gdzie jego miejsce.

Zacznij od założeń (chcę osiągnąć coś takiego) a nie od chycia bujem i chcenia (nie rozumiem co napisałem ale poprawcie to żeby działało).

Powtarzam: zacznij od czegoś prostszego. Bo na razie jesteś w sytuacji gościa, który właśnie opanował tabliczkę mnożenia i chce opracować trajektorię lotu na Marsa.

Z chęcią Ci pomożemy... Ale pozwól sobie pomóc!

Ok, ethanak, przyjmijmy twoją optykę, jak ty to widzisz? Włączyłeś się do dyskusji bo chcesz pomóc tak? Czy udowodnić mi, że nie potrafię(to akurat już wiem)? Nie pisz mi programu, napis z konkretnie co jest źle w programie z przerwaniem, wnieś jakiś pierwiastek merytoryczny, rzuć koncepcję, jak Deshipu(😃).

Link do komentarza
Share on other sites

Kiedyś modlił się Icek w synagogie:

-Oj dobre Boże, Ty mnie zrób żeby ja wygrał na loterii!

Na to dobry Bóg zza chmurki się wychyliwszy rzecze:

- Icek, ty daj mnie szansę, ty weź kiedyś zagraj!

Daj nam szansę...

Link do komentarza
Share on other sites

Ethanak toś się nie wysilił 😉 Jeśli napisałeś, bym popróbował czegoś prostszego to wrzuć jakiś przykład na którym mógłbym poćwiczyć to o czym rozmawiamy, jakiś kod, zadanie, cokolwiek.

Co mam ćwiczyć? Miganie diodami? W jaki sposób? Jakieś funkcje? Które? Co przeczytać by zrozumieć ten konkretny przykład? Merytorycznie, proszę....

Deshipu DZIĘKI(Twoje zdrowie), wezmę się za to w weekend, wtedy pewnie się znów tutaj odezwę🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.