Skocz do zawartości

Biblioteki, zieloni użytkownicy, zegar i lodówka


SOYER

Pomocna odpowiedź

Zgodnie z prośbą kopiuję tutaj mój post z komentarzy pod artykułem z kursu Arduino:

Mam problem z DHT, ciągle wyskakuje mi błąd kompilacji dla płytki Arduino, exit status 1...

Co oznacza(co robi) ten zapis: DHT dht;

Wydaje mi się, że mam problem z bibliotekami, bo problem pojawia się od razu po ich zadeklarowaniu. Czy zależnie od tego którą mam "wersję"(cc, lub org) powinienem zainstalować różne biblioteki?

Instalowałem zgodnie z info z części 2, zainstalowane poprawnie, wpisywałem takie i takie i razem i osobno i ciągle ten błąd kompilacji.

Dlaczego wasza biblioteka jest w "", a program ją wpisuje w<>?

[ Dodano: 23-11-2017, 12:01 ]

Dobra doszedłem do tego, że działa mi biblioteka SimpleDHT, zainstalowałem jej przykład:

[code]int pinDHT11 = 13; 
SimpleDHT11 dht11; 

void setup() { 
 Serial.begin(9600); 
} 

void loop() { 
 // start working... 
 Serial.println("================================="); 
 Serial.println("Sample DHT11..."); 

 // read without samples. 
 byte temperature = 0; 
 byte humidity = 0; 
 int err = SimpleDHTErrSuccess; 
 if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) { 
   Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000); 
   return; 
 } 

 Serial.print("Sample OK: "); 
 Serial.print((int)temperature); Serial.print(" *C, "); 
 Serial.print((int)humidity); Serial.println(" H"); 

 // DHT11 sampling rate is 1HZ. 
 delay(1500); 
}

działa i wyświetla wartości ok, ale pozmieniałem to dla siebie:


#include <SimpleDHT.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza


int pinDHT11 = 13;
SimpleDHT11 dht11;
void setup() {
}

void loop() {
byte temperature = 0;
byte humidity = 0;
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print((int)humidity);
lcd.print("%RH");
lcd.setCursor(0, 1);
lcd.print((int)temperature);
lcd.print("*C");

delay(1500);
}[/code]

i wyświetla mi wartości dla temperatury i wilgotności 0 i 0... Dlaczego?

Rozumiem, że w pierwszym przypadku program skądś bierze wartość byte temperatury i wilgotności, ale nie widzę skąd, a w moim programie po prostu wyświetla przypisaną wartość... jak to naprawić?

Przepraszam ale nie udało mi się zamknąć tego w ramki.

Dzięki mojemu koledze 😅 Elvisowi po raz kolejny udało mi się rozwiązać problem i program zaczął działać. WIELKIE DZIĘKI ELVIS!! 😃

Niestety wszyscy mieli do mnie pretensje, że nie wiem tak prostej rzeczy, a już cały miesiąc nauki za mną... Ja wiedziałem tylko, że jeśli mam Arduino z dopiskiem "org" to powinenem korzystać z innych bibliotek niż gdybym miał "cc" tak?

Nie wiedziałem o tym, że jeśli dane "akcesorium" do arduino ma różne biblioteki to też różne polecenia i komendy wtedy się wpisuje.

Dalej mi nie działają te biblioteki do DHT11, zalecane w kursie.

Kiedyś jak na tym forum zapytałem co to te biblioteki i jak to się je, to odpowiedź można zawrzeć w zdaniu: "to taki kod który ktoś wymyślił do obsługi peryferii arduino ale w zasadzie większość jest do kitu i lepiej stworzyć je samemu".

To forum jest Forbot-a, Forbot reklamuje swoje niektóre kursy jako te dla kompletnie zielonych, ja właśnie dlatego się nimi zainteresowałem. Więc proszę nie mieć pretensji jeśli w komentarzach do kursu podstawowego dla początkujących pytam o podstawy.

Pytałem kiedyś o zmienne millis. Znowu nieoceniony i niezawodny okazał się Elvis(DZIĘKI), ale ktoś mi tam napisał przykład o zegarze i gotowaniu jajka. Super, ale ja nawet nie wiedziałem, że arduino ma takie coś jak jakiś "zegar" od milisekund który liczy w górę, a po ok 50 dniach się zeruje i liczy na nowo... Ja jestem jak dziecko w elektronice. Nikt nie powie 3-latkowi, weź z lodówki jajko, ugotuj go w 3 minuty w wodzie na piecu, a zegar wisi nad lodówką.

Ten dzieciak ani nie wie co to zegar, ani nie potrafi odczytywać z niego godzin, wody może naleje jajko wsadzi do garnka, ale jak nie będzie piec do prądu podłączony to nie będzie miał pojęcia co jest grane. Dla nas to oczywiste ale nie dla niego.

Ja i pewnie większość początkujących jesteśmy jak te dzieci (za rączkę i do baru).

To tyle, może na marginesie dyskusji toczącej się w dziale dla zielonych. Jakieś uwagi? 😅 :mrgreen:

Wracając do programu z DHT, dlaczego switch nie włącza diod?:

[code]#include <SimpleDHT.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

int maphum;
int pinDHT11 = 13;
SimpleDHT11 dht11;
#define led1 10 
#define led2 12
#define led3 9
#define led4 11 
#define led5 8
void setup() {
 pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT); 
 pinMode(led3, OUTPUT); 
 pinMode(led4, OUTPUT); 
 pinMode(led5, OUTPUT); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW);
 Serial.begin(9600);
}

void loop() {
 byte temperature = 0;
 byte humidity = 0;
 dht11.read(pinDHT11, &temperature, &humidity, NULL);
 maphum = map(((int)humidity), 5, 100, 1, 5);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wilg.: ");
 lcd.print((int)humidity);
 lcd.print("%RH");
 lcd.setCursor(0, 1);
 lcd.print("Temp.: ");
 lcd.print((int)temperature);
 lcd.print("*C");
 switch(maphum){
   case '1':
   digitalWrite(led1, HIGH);
   break;
   case '2':
   digitalWrite(led2, HIGH);
   break;
   case '3':
   digitalWrite(led3, HIGH);
   break;
   case '4':
   digitalWrite(led4, HIGH);
   break;
   case '5':
   digitalWrite(led5, HIGH);
   break;
 }
 Serial.println(maphum);

 delay(1500);

}[/code]

Jeśli zrobię to na if-ach działa, ale chciałem prościej i znowu coś poknociłem, choć wydaje się ok...

P.S. co robię nie tak z tagami, że mi raz działa tagowanie kodu, a raz nie?

Link do komentarza
Share on other sites

Możesz się jednak postarać i dać ten program w tagi [ code ]? Strasznie ciężko się to czyta. Ja wiem, jesteś jak dziecko i nic nie wiesz, ale myślę, że właśnie tu jesteś żeby się uczyć, więc może warto się postarać?

Może też warto jednak by było zrobić jakiś tutorial z C/C++ w pewnym momencie — to ci powinno rozwiązać wiele problemów, jak na przykład ten, że "1" ma w C wartość 1, natomiast "'1'" ma wartość 49 (potrafisz zgadnąć czemu 49?). Usuń znaki "'" z twoich "case" to zadziała.

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

Dzięki Deshipu, choć nie wiem po co ten sarkazm.

#include <SimpleDHT.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

int maphum;
int pinDHT11 = 13;
SimpleDHT11 dht11;
#define led1 10 
#define led2 12
#define led3 9
#define led4 11 
#define led5 8
void setup() {
 pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT); 
 pinMode(led3, OUTPUT); 
 pinMode(led4, OUTPUT); 
 pinMode(led5, OUTPUT); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW);
 Serial.begin(9600);
}

void loop() {
 byte temperature = 0;
 byte humidity = 0;
 dht11.read(pinDHT11, &temperature, &humidity, NULL);
 maphum = map(((int)humidity), 5, 100, 1, 5);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wilg.: ");
 lcd.print((int)humidity);
 lcd.print("%RH");
 lcd.setCursor(0, 1);
 lcd.print("Temp.: ");
 lcd.print((int)temperature);
 lcd.print("*C");
 switch(maphum){
   case 1:
   digitalWrite(led1, HIGH);
   break;
   case 2:
   digitalWrite(led2, HIGH);
   break;
   case 3:
   digitalWrite(led3, HIGH);
   break;
   case 4:
   digitalWrite(led4, HIGH);
   break;
   case 5:
   digitalWrite(led5, HIGH);
   break;
 }
 Serial.println(maphum);

 delay(1500);
}

Działa, ale właśnie w kursie było napisane, że warunki case wpisujemy w ' ', a nie w " ". Nikt nic nie napisał, o tym żeby wpisywać bez niczego. Odnosi się to tylko do cyfr?

I nie, nie wiem dlaczego '1' to 49... 🙁

To tutaj uczę się podstaw, jak w pierwszej klasie pisania. Nie mam za bardzo czasu na inne fora, oglądam jeszcze filmy Mirka Zelenta na YT i zamówiłem książkę Pratta o C++. Na więcej nie mam czasu. Patrz która godzina, a jestem po 14h w pracy, ALE CHCĘ SIĘ UCZYĆ.

Nie zniechęcajcie, naprawdę proszę 😐

Sam na ile potrafię to odpowiadam "zielonym bardziej", ale co ja jeszcze potrafię...

Jestem Wam naprawdę wdzięczny za wszelką pomoc, szanuję wasz poświęcony czas, rozumiem zniechęcenie(czasami), ale bądźcie jak Elvis, surowy i zgryźliwy ale niesamowicie pomocny i niezawodny 😅

Link do komentarza
Share on other sites

Nie wiem czemu mnie oskarżasz o sarkazm, jestem całkowicie poważny i piszę dosłownie to co mam na myśli.

Jak zapewne wiesz, komputer nic nie wie o literkach, liczbach, cyfrach i innych takich i w swojej pamięci ma tylko zera i jedynki. To od naszego programu zależy jak dany kawałek pamięci, z zawartymi w nich zerami i jedynkami zostanie zinterpretowany. I w odwrotnym kierunku, kiedy w naszym programie umieszczamy liczby, napisy i znaki, to kompilator zamienia je na zera i jedynki, żeby komputer mógł ich używać.

I teraz jak naiszesz "1", to kompilator to przerobi na "0000000000000001" w pamięci (bo domyślnie int ma 16 bitów). Jak napiszesz "'1'", to kompilator zrozumie, że masz na myśli znak ASCII o takim właśnie symbolu, więc weźmie tablicę znaków, znajdzie, że '1' ma numerek 49 i przerobi to na "00110001" (bo domyślnie char ma 8 bitów). A jak napiszesz ""1"", to komputer zrozumie, że chcesz napis, więc weźmie ten znak '1' i dopisze za nim znak '\0' oznaczający koniec napisu i dostaniesz w pamięci "0011000100000000". Oczywiście każdy z tych wyników jest inny i w momencie porównywanie w poleceniu switch będzie inaczej traktowany — dlatego niestety trzeba myśleć i wiedzieć, co w danym miejscu nasza zmienna oznacza.

Mam nadzieję, że to trochę rozjaśniło? Jeśli nie, to pozostaje się odwołać do książek, w których jest to znacznie lepiej wyjaśnione. Generalnie książki i oficjalne specyfikacje stanowią nieocenione źródło informacji, szczególnie gdy się ma mało czasu.

  • 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

Dzięki Deshipu, trochę rozjaśniło, tak trochę się domyślałem, że chodzi o ASCII, ale nie chciałem robić śmiechu...

Operacje bitowe to dla mnie czarna magia(na razie?).

Czyli młodym zalecasz generalnie unikać cyfr w switch-u, a jeśli już używać(jako cyfry w systemie dziesiętnym) to pisać zawsze "gołe", bez ' ' i bez " " bo inaczej znaczą zupełnie co innego( niż w systemie dziesiętnym). Dobrze kombinuję 🤣 ?

Link do komentarza
Share on other sites

Nic nie zalecam. Zalecam myśleć co się robi.

W przykładzie, na którym się opierałeś pisząc swój switch, zmienna zapewne zawierała znaki wprowadzane z klawiatury i przesyłane przez port szeregowy. Dlatego były to kody ASCII i dlatego należało użyć "'". W twoim przypadku zmienna zawiera liczby, a nie znaki ASCII. Ponieważ C oraz C++ mają dość luźne podejście do typów i wszystko im jedno, czy napiszesz znak czy liczbę, to kompilator nie zgłosił błędu, tylko posłusznie porównywał wartość zmiennej 1 do kodu znaku '1' (który sobie wewnętrznie przetłumaczył na 49) i stwierdzał, że są różne, więc nie wywoływał kodu w danym case-ie. Bardziej współczesny język programowania by zgłosił błąd o próbie porównania liczby ze znakiem, ale w Arduino nie ma tak dobrze.

Link do komentarza
Share on other sites

Tak było, bo w kursie był przykład z pierwszymi literami nazw kolorów(c,z,itp), a tutaj "zmapowałem" od 1 do 5 wskazania wilgotnościomierza. Więc myślałem, że skoro zmapowałem 1-5 to nauczony lekcją z kursu, od 1 do 5 wstawiłem w ' '. Źle zrobiłem 😅

Link do komentarza
Share on other sites

Niestety wszyscy mieli do mnie pretensje, że nie wiem tak prostej rzeczy, a już cały miesiąc nauki za mną... Ja wiedziałem tylko, że jeśli mam Arduino z dopiskiem "org" to powinenem korzystać z innych bibliotek niż gdybym miał "cc" tak?

Różne wersje środowiska, to tylko różne metody instalacji bibliotek (tych samych). W jednej wersji wbudowane było narzędzie do łatwego pobierania bibliotek, a w drugim robiło się to ręcznie. Tak, czy inaczej pliki bibliotek były te same. Nie warto też sobie "zawracać głowy" różnymi wersjami IDE, bo to zaszłości po kłótniach twórców tej platformy. Teraz wszystko wychodzi już na prostą i nie będzie takich problemów.

To forum jest Forbot-a, Forbot reklamuje swoje niektóre kursy jako te dla kompletnie zielonych, ja właśnie dlatego się nimi zainteresowałem. Więc proszę nie mieć pretensji jeśli w komentarzach do kursu podstawowego dla początkujących pytam o podstawy.

Zapewniam, że nikt nie ma pretensji 😉 Jeśli jakieś tematy z komentarzy wykraczają poza tematy omawiane w danym artykule to staramy się przenosić dyskusję do innych tematów, aby nie robić zamieszania. Gdybyśmy tego nie robili, to nowe osoby musiałyby później "przebijać" się przez XX stron komentarzy, które ich nie dotyczą 😉

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.