Skocz do zawartości

Czujnik jakości powietrza


Pomocna odpowiedź

kur... siedzę teraz w barze i kończę piwo a nienawidzę pisania na jakimś macanym ekranie...

mniej więcej tak jak piszesz, jeśli jak wrócę do domu to jeszcze będę pamiętać to pokażę kawałek kodu.

yield  - albo delay - powoduje przekazanie sterowania do firmware esp. jeśli tego nie zrobisz - po chwili watchdog zatrzyma twój program.

co do wyboru proste: if (naciśnięty) for (;;) myloop().

Link do komentarza
Share on other sites

To nie pij za dużo, żebyś nie zapomniał. też nie lubię pisać na dotykowcach...:-/

3 minuty temu, ethanak napisał:

yield  - albo delay - powoduje przekazanie sterowania do firmware esp

jak, po co, czemu...

Link do komentarza
Share on other sites

7 godzin temu, SOYER napisał:

1. Można wgrać szkic z dwoma pętlami i wybierać (jakoś) która ma się wykonywać?

Takich pętli możesz sobie zrobić "milion+" 😉 Nie myśl o tej pętli loop jako czym świętym, czego nie da się zastąpić to zwykła pętla - możesz w niej zrobić wszystko. Możesz również wstawić w jej wnętrzu inne pętle nieskończone. Późna godzina, więc pozwolę sobie na "pseudokod".

Mamy przycisk "lewy" i "prawy" i wybieramy nimi odpowiednią pętle, która ma się wykonywać podczas pracy urządzenia. Warunek jest taki, że przyciski muszą być wciśnięte (lub nie) podczas włączania zasilania, później nie muszą być trzymane. Zależnie od tego co było wybrane przyciskami to urządzenie może działać zupełnie inaczej. Wersja super prosta:

int ktoraPetla;

setup() {
	//dekalracje pinów
	//[...]

	//wybór "pętli"
	if (LEWY jest wciśnięty) {
		ktoraPetla = 0;
	} else if (PRAWY jest wciśniety) {
		ktoraPetla = 1;
	} else {
		ktoraPetla = 2;
	}

	//Jakieś tam inne ustawienia
}

loop() {
	if (ktoraPetla == 0) {
		while(1) {
			//Startuje pierwsza wersja programu
			//Od teraz while działa jak nasz loop
		}
	} else  if (ktoraPetla == 1) {
		while(1) {
			//Startuje druga wersja programu
			//Od teraz while działa jak nasz loop
		}
	} else {
		while(1) {
			//Startuje trzecia wersja programu
			//Od teraz while działa jak nasz loop
		}
	}
}

 

Link do komentarza
Share on other sites

Z drobną różnicą:

jeśli jest to ESP8266 trzeba nieco zmodyfikować program, coś w stylu:

while(1) {
  moja_petla();
  yield();
}

aby nasz procesorek miał możliwość zajęcia się swoimi procesorkowymi sprawami typu obsługa stosu TCP i takie tam nudne drobiazgi.

Przy okazji, ja robię nieco inaczej:

void setup()
{
  /* tu nudne ustawienia */
  if (!digitalRead(KEY_PIN)) { // ktoś trzyma klawisz przy włączeniu?
    delay(500);
    if (!digitalRead(KEY_PIN)) { // twardy gość, naprawdę trzyma
      for(;;) {
        petla_serwisowa();
        yield();
      }
    }
  }
  
  /* tu reszta kodu funkcji setup, w loop juz się nie przejmuję
   * pętlą serwisową, a klawisz może być wykorzystany do innych celów
   */
}  
    

Każdy sposób zresztą jest dobry.

Edytowano przez ethanak
  • Lubię! 1
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

Miałem dzisiaj trochę czasu to w miarę ogarnąłem program mojego czujnika, zgrałem to z Blynkiem, L293 od otwierania dopływu powietrza, przekaźnikiem do włączania wentylatorka. Od strony softu, w miarę by było, teraz muszę to jakoś zabudować, ale niech pochodzi parę dni "na golasa", może jeszcze mi przyjdzie do głowy jaki osprzęt. W międzyczasie postaram się ogarnąć OTA, może sobie poradzę, ale czarno to widzę....

 

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

Dzisiaj wyrzeźbiłem obudowę, jutro może ogarnę przewody...   

DSC_0124.JPGDSC_0123.thumb.JPG.61fb876cad93e588dd01697cb7a19abb.JPG DSC_0125.JPG

DSC_0126.JPG

Dnia 10.12.2018 o 16:21, SOYER napisał:

Pytanie, jak obejść problem konieczności podłączania i odłączania przewodów od PMS5003 podpiętych pod TXi RX nodeMCU za każdym wgrywaniem nowej wersji softu...??

Z tym poradziłem sobie przy pomocy programowego Serial-a, zdefiniowałem TX i RX na innych pinach. Nie muszę już odłączać PMS do wgrania programu, a druga sprawa, jak PMS byl podlączony do standardowych TX RX na nodeMCU to nie wiem czemu miałem problemy z prawidłowym odczytem z DHT11... raz czytał prawidlowo, raz nie, po podłączeniu PMS do software seriala problem zniknął...😲

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

Udało mi się umieścić moduły w obudowie, podłączyłem wszystko z wyjątkiem gniazda zasilania, muszę jakieś kupić.

Obudowa podzielona jest na dwie komory, w przedniej jest esp, przetwornica, L293 i rtc, a z tyłu PMS, DHT i przekaźnik do wentylatora.

Zamysł jest taki, że esp otwiera dopływ powietrza do jednego z dolotów z tyłu obudowy, włącza się wentylator który wdmuchuje, wymienia powietrze w tylnej komorze. Wentylator się wyłącza i zamyka się dopływ w dolocie. Wyświetlacz pokazuje temperaturę i wilgotność wdmuchanego powietrza. Potem system czeka 10 min, jednocześnie wyświetlajac czas, datę i wyniki pomiaru PMS, oraz sprawdzając w tle wilgotność w komorze pomiarowej. Kiedy minie 10 min i wilgotność jest poniżej 75%, włącza się PMS, a po 30 sekundach wykonywany jest pomiar, wyniki są wysyłane do BLYNKa, a PMS zostaje uśpinony. Potem cały cykl od nowa. Jeśli po 10 min. wilgotność jest wyższa, to pomiar zostanie wykonany jak tylko jej wartość spadnie poniżej progu.

Miały być dwie obudowy, jedna z czujnikami, druga z esp i wyświetlaczem. Wyszła jedna, nawet lepiej bo urządzenie zrobiło się przenośne.:)

Opisywany wcześniej problem z DHT, pojawił się znowu. Poszperałem w necie i okazało się, że biblioteka jest winna zamieszaniu, podobno źle współpracuje z esp. Dziwne bo tej samej używam w arduino mega od roku i 100% prawidłowych pomiarów. Ale z ciekawości ją zmieniłem, trochę szkic przerobiłem i faktycznie teraz śmiga. 100% prawidłowych pomiarów:-)

1544812790403-1144429169.jpg

1544812836601-1329887436.jpg 1544812883113897306402.jpg 15448129070311300468730.jpg

1544812964345-1698804296.jpg

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

(edytowany)
Dnia 22.11.2018 o 00:17, marek1707 napisał:

i wtedy zacząć zapamiętywać dane. Ja uśredniam z 4 albo 8 kolejnych ramek.

marek1707, tak czytam teraz ten mój wątek i Twoje rady i zapomniałem w swoim szkicu o tym uśrednianiu kilku kolejnych odczytów. Czy to ważne? Robi różnicę? Teraz ja po prostu wybudzam czujnik, daję mu popracować 30 sekund, a następnie polecenie odczytania danych i od razu zapis i kolejne uśpienie...

Uśredniać wynik? Wywalić kilka pierwszych odczytów i zapisać dopiero któryś tam? Np. pętla for, sześć odczytów po kolei i dopiero szósty traktujemy jako wiarygodny??

Edytowano przez SOYER
Link do komentarza
Share on other sites

Żaden pojedynczy odczyt nie będzie "wiarygodny", ale przecież nie musisz robić wszystkiego od razu. Uśrednianie daje fajne, łagodne wykresy. U mnie, gdy uśredniam 4 lub 8 kolejno wyplutych wyników (po odczekaniu pierwszych 6-8 sekund od włączenia czujnika) wciąż widać "kaszę" na linii. Gdy wstawiłem filtr moving average o długości 4, uśredniający za 4 ostatnie takie strzały czyli za 4 minuty, jest OK. Stacje monitorowania dają przecież wyniki uśredniane za 15 i więcej minut, niektóre za całą godzinę - to nie łapanie pcheł. Ważne jest średnie zapylenie a nie to przynoszone przez podmuchy wiatru czy przejeżdżający traktor. Zrób, popatrz jak to wygląda i sam coś wymyśl. Wcale nie twierdzę, że to co zrobiłem jest już dobre. I napisz oczywiście jakie masz wyniki 🙂 U mnie dziś tragedia, nawet oficjalnie Wawa jest na czerwono (jakość "ZŁA") a przecież polskie normy są kuriozalnie łagodne jak mały chomik. Gdy na mapie http://powietrze.gios.gov.pl/pjp/current mamy poziom choćby "UMIARKOWANY" to powietrze wg norm WHO jest TRAGICZNE. Na moim czujniku od wczorajszego popołudnia(?) mam 50-60, 80-90 i 120ug/m3 odpowiednio dla PM1.0, PM2.5 i PM10. Nie otwieram okien a oczyszczasz powietrza robi z tego wewnątrz mieszkania 20-30-40 co też w zasadzie posyła ludzi do piachu a przynajmniej do lekarza. Chyba czas stąd spieprzać...😠

Link do komentarza
Share on other sites

Ja odczytuję pojedynczy wynik, co 10 min i od razu do wykresu, także tenże jest poskakany... rano przeniosłem czujnik z ciekawości w ustronne spokojne miejsce i wyniki od razu spadły: PM1=3, PM2.5=7, PM10=11. Kilka dni stał przy jednym "umownie szczelnym" oknie i wyłapywał bez problemu to co na zewnątrz. Wyniki w okolicach 30-40-70. Jak sasiad rozpalił w warsztacie i dym poszedł na to okno to poleciało 80-110-140 chyba jak dobrze pamiętam.... Wczorajszy ranek był tragiczny, zresztą to bylo widać na pierwszy rzut oka za okno, dzisiaj było lepiej....

Wyniki z "cichej okolicy":

DSC_0137.thumb.JPG.15a8c1bbfcf50a94c5a1b71a1bdf65f7.JPG

Wykres za wczoraj, idealnie widać pika jak wieczorem ludzie zaczęli dokładać do pieca-))):

DSC_0138.thumb.JPG.c2d3bb05d3c7178cebce1c2b75d7691d.JPG

Link do komentarza
Share on other sites

Od wczoraj wiatr i deszcz, odczyty pocecialy w dół, niewiarygodne, że takie wyniki też mogą być...

DSC_0147.thumb.JPG.f0d067fb859be4828ef4e94c7ce5246c.JPGDSC_0148.thumb.JPG.115f38885fe1124614e630f099a27b6a.JPG

To czym my oddychaliśmy w poprzednie dni???

W miedzyczasie umieścilem czujnik na docelowym miescu, zrobiłem podlączenie przewodów doprowadzających i odprowadzających powietrze z zewnątrz, zrobłem przelotki przez ściany i półeczkę na czujnik.

DSC_0143.thumb.JPG.6303d7f8f9516cb44e3b7dd8099805bb.JPGDSC_0146.thumb.JPG.a3da0f0cfed856a6959a8ce51a672ba5.JPGDSC_0142.thumb.JPG.6b075c3517ec93fd8a5959db256604ca.JPG

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

(edytowany)

Hej, dzięki za miłe słowa;-).

Mam chwile czasu i usiadłem do tego OTA  i kilku "pętli głównych" wybieranych przyciskiem.

Dnia 12.12.2018 o 00:31, Treker napisał:

Wersja super prosta:


int ktoraPetla;

setup() {
	//dekalracje pinów
	//[...]

	//wybór "pętli"
	if (LEWY jest wciśnięty) {
		ktoraPetla = 0;
	} else if (PRAWY jest wciśniety) {
		ktoraPetla = 1;
	} else {
		ktoraPetla = 2;
	}

	//Jakieś tam inne ustawienia
}

loop() {
	if (ktoraPetla == 0) {
		while(1) {
			//Startuje pierwsza wersja programu
			//Od teraz while działa jak nasz loop
		}
	} else  if (ktoraPetla == 1) {
		while(1) {
			//Startuje druga wersja programu
			//Od teraz while działa jak nasz loop
		}
	} else {
		while(1) {
			//Startuje trzecia wersja programu
			//Od teraz while działa jak nasz loop
		}
	}
}

ok, wersja naprawdę prosta i łapię o co biega, tylko o co chodzi z ta "1" w

while(1)

??

Teraz Ethanak dzięki za

Dnia 12.12.2018 o 06:42, ethanak napisał:

while(1) {

moja_petla();

yield();

}

dobrze wiedzieć, niż potem kombinować. Rozumiem, że ten yield(); wstawiam za kodem z OTG?

 

Dnia 12.12.2018 o 06:42, ethanak napisał:
Dnia 12.12.2018 o 06:42, ethanak napisał:

Przy okazji, ja robię nieco inaczej:



void setup()
{
  /* tu nudne ustawienia */
  if (!digitalRead(KEY_PIN)) { // ktoś trzyma klawisz przy włączeniu?
    delay(500);
    if (!digitalRead(KEY_PIN)) { // twardy gość, naprawdę trzyma
      for(;;) {
        petla_serwisowa();
        yield();
      }
    }
  }
  
  /* tu reszta kodu funkcji setup, w loop juz się nie przejmuję
   * pętlą serwisową, a klawisz może być wykorzystany do innych celów
   */
}  

 

Czy ta pętla_serwisowa() uruchamia się w setup-ie?

for(;;) tam mam wstawić ile razy ma sie wykonać? Tzn. ile, przy np. OTG i wgrywaniu prze neta nowego programu? Czy też ma zostać "(;;)"??

Edytowano przez SOYER
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.