Sylba Wrzesień 23, 2024 Udostępnij Wrzesień 23, 2024 Trochę skomplikowane zapisy warunków w instrukcjach if. Dnia 19.09.2024 o 20:42, T101 napisał: if (leftValue > rightValue && leftValue - rightValue > 500) To można skrócić do postaci leftValue - rightValue > 500 to oczywiste, że left Value musi być większe od rightValue. Dnia 19.09.2024 o 20:42, T101 napisał: else if (rightValue - leftValue && rightValue - leftValue > 500) Tak samo jak powyżej rightValue - leftValue > 500 Dnia 19.09.2024 o 20:42, T101 napisał: else if (leftValue > rightValue && leftValue - rightValue < 500 && leftValue - rightValue > 50 ) W tym miejscu wystarczyłoby leftValue - rightValue > 50; Dnia 19.09.2024 o 20:42, T101 napisał: else if (rightValue > leftValue && rightValue - leftValue < 500 && rightValue - leftValue > 50 ) warunek > 500 został sprawdzony jako pierwszy Dnia 19.09.2024 o 20:42, T101 napisał: else if (rightValue > leftValue && rightValue - leftValue < 500 && rightValue - leftValue > 50 ) Sytuacja jak wyżej. Pytanie czy wartości 500 i 50 zostały przyjęte na oko czy zmierzone. Co jeśli odczyty z czujników będą w przedziale (50; 500)? 1
T101 Wrzesień 24, 2024 Udostępnij Wrzesień 24, 2024 int leftValue = 0; int rightValue = 0; int roznica = 0; void setup() { pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); } void loop() { leftValue = analogRead(A5); rightValue = analogRead(A2); int roznica = leftValue - rightValue; Serial.println(leftValue); Serial.println(rightValue); if (roznica > 500) { digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); } else if (roznica < -500) { digitalWrite(10, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(6, LOW); } else if (roznica > 50) { digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); } else if (roznica < -50) { digitalWrite(9 ,HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(6, LOW); digitalWrite(10, LOW); } else { digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); } delay(2000); } Poprawiłem kod wykorzystując zmienną roznica. Wartości 500 i 50 oczywiście na oko na potrzeby zadania tylko ale jak testowałem to z latarką tzn. przesuwałem od lewej do prawej to wszystkie diody się zaświeciły. W przedziale (50; 500) no to np. odczyty czujników rightValue = 300 i leftValue = 480, więc warunek leftValue - rightValue > 50 zostały spełniony a więc zaświeciła by się dioda druga od lewej z numerem 7. 1
Sylba Wrzesień 24, 2024 Udostępnij Wrzesień 24, 2024 (edytowany) 3 godziny temu, T101 napisał: W przedziale (50; 500) no to np. odczyty czujników rightValue = 300 i leftValue = 480, więc warunek leftValue - rightValue > 50 zostały spełniony a więc zaświeciła by się dioda druga od lewej z numerem 7. To wszystko zależy od tego jakiego użyjesz fotorezystora i połączonego z nim szeregowo rezystora. Zgodnie ze schematem podanym w kursie mierzysz spadek napięcia na tym właśnie szeregowym rezystorze, a nie na fotorezystorze. Zakładając, że użyjesz fotorezystora, który przy natężeniu oświetlenia 10 lux ma rezystancję 8k i szeregowo połączonego rezystora 10k, to napięcie na tym szeregowym rezystorze będzie wynosiło około 2,78V i odczyt z pinu ok. 568. Przy natężeniu oświetlenia 500 lux rezystancja fotorezystora spadnie do ok. 0,5k napięcie na szeregowym rezystorze wzrośnie do 4,75V co da odczyt z pinu ok. 973. Jak widać w całym przedziale zmian natężenia oświetlenia od 10 do 500 lux odczyt z pinu będzie większy od 500. Spodziewać się można, że warunek różnicy >500 może być spełniony w bardzo wyjątkowej sytuacji gdy jeden fotorezystor będzie bezpośrednio mocno oświetlony, a drugi kompletnie zasłonięty. W sytuacji gdy rezystor szeregowy będzie miał rezystancję 1k zakres odczytów z pinu analogowego będzie zupełnie inny w granicach 115 do 675, ale różnica powyżej 50 i poniżej 500. Być może nawet trochę ponad 500. Edytowano Wrzesień 24, 2024 przez Sylba 1
Sylba Wrzesień 30, 2024 Udostępnij Wrzesień 30, 2024 Dnia 12.03.2024 o 19:40, FTNewbie napisał: Moje solucje. Zapewne nie najlepsze Zadanie 4.5: Wpis dość odległy, ale temat może być aktualny. Zadanie 4.5 w mojej ocenie wcale nie jest takie łatwe chociaż nić nadzwyczajnego program nie wykonuje. Wpisałem kod do Arduino Uno R3 i nic się nie dzieje. Żadnych informacji ani oznak życia LED. Ja zrobiłem coś takiego, być może przesadziłem. Ciekaw jestem opinii. /* Prosta gra w odgadywanie wartości ustawionej potencjometrem */ #define redLed 2 #define yelLed 4 #define grnLed 5 #define pot A2 //potentiomiter connected to analog pin 2 #define swt 7 //switch connected to digital pin 4 int ledOnTime = 2000; //led on time int swtPress = 0; //switch flag 1 as pressed int potRead = 0; //value read from potentiometer int playerInput = 0; //player input int maxDif = 50; //max difference int inputFlag = 0; //1 when player entered a number int attCnt = 0; //counter of attempts int end = 1; //game over marker //setup of print flags, 0 as not printed, 1 as printed int prnIntro = 0; int prnSetup = 0; int prnEnter = 0; int prnAtt1 = 0; int prnAtt2 = 0; int prnAtt3 = 0; int prnAtt = 0; int prnWin = 0; int prnLoss = 0; int prnEnd = 0; void setup() { Serial.begin(9600); //begin serial communication at speed 9600 bps while(!Serial) { //waith for serial port connected } Serial.println("\n"); //sets pin mode pinMode(redLed, OUTPUT); pinMode(yelLed, OUTPUT); pinMode(grnLed, OUTPUT); pinMode(pot, INPUT); pinMode(swt, INPUT_PULLUP); //sets leds off digitalWrite(redLed, LOW); digitalWrite(yelLed, LOW); digitalWrite(grnLed, LOW); } void loop() { //intro message if (prnIntro == 0) { txtIntro(); } if (prnSetup == 0) { txtSetup(); } //potentiometer read if (swtPress == 0) { while (digitalRead(swt) == HIGH) { delay(25); } potRead = analogRead(pot); Serial.println("Ustawienie potencjometru odczytane\n"); swtPress = 1; attCnt++; } //start of the game, attempt #1 if (prnAtt1 == 0) { txtAtt1(); } if (prnEnter == 0) { txtEnter(); } while (Serial.available() > 0) { //player input playerInput = Serial.parseInt(); txtNumber(); Serial.println(playerInput); //increase attempt counter and change input marker attCnt++; inputFlag = 1; } //evaluation of potentiometer read and player input if (inputFlag == 1) { int diff = playerInput - potRead; if (abs(diff) <= maxDif) { //player win txtWin(); Serial.println(potRead); digitalWrite(grnLed, HIGH); delay(ledOnTime); digitalWrite(grnLed, LOW); txtEnd(); while (end) {} } else { switch(attCnt) { case 2: //player attempt #2 txtAtt(); digitalWrite(yelLed, HIGH); delay(ledOnTime); digitalWrite(yelLed, LOW); txtAtt2(); prnEnter = 0; inputFlag = 0; break; case 3: //player attempt #3 txtAtt(); digitalWrite(yelLed, HIGH); delay(ledOnTime); digitalWrite(yelLed, LOW); txtAtt3(); prnEnter = 0; inputFlag = 0; break; case 4: //player loss txtLoss(); digitalWrite(redLed, HIGH); delay(ledOnTime); digitalWrite(redLed, LOW); txtEnd(); while(end) {} break; } } } } void txtIntro() { Serial.println("\nGRAMY W ZGADYWANKĘ\n"); Serial.println("Masz trzy próby by odgadnąć"); Serial.println("liczbę całkowitą od 0 do 1023"); Serial.println("ustawioną potencjometrem."); Serial.println("Możesz pomylić się o 50\n"); prnIntro = 1; } void txtSetup() { Serial.println("Ustaw potencjometr w dowolnym położeniu"); Serial.println("i naciśnij przycisk\n"); prnSetup = 1; } void txtEnter() { Serial.println("Wpisz liczbę od 0 do 1023"); prnEnter = 1; } void txtNumber() { Serial.print("Twoja liczba to: "); } void txtAtt1() { Serial.println("Pierwsza próba"); prnAtt1 = 1; } void txtAtt2() { Serial.println("\nDruga próba"); prnAtt2 = 1; } void txtAtt3() { Serial.println("\nTrzecia, ostatnia próba"); prnAtt3 = 1; } void txtAtt() { Serial.println("\nNie zgadłeś. Spróbuj jeszcze raz"); prnAtt = 1; } void txtWin() { Serial.println("\nTAK! ODGADŁEŚ!\n"); Serial.print("Ustawiona liczba to: "); prnWin = 1; } void txtLoss() { Serial.println("\nNIESTETY PRZEGRAŁEŚ\n"); Serial.println("Nie udało Ci się trzy razy odgadnąć"); prnLoss = 1; } void txtEnd() { Serial.println("\nTo już koniec."); Serial.println("Dziękuję za grę."); prnEnd = 1; }
Sylba Październik 1, 2024 Udostępnij Październik 1, 2024 Zainspirowany kodem igora z 27.05.2015r (zamieszczonym w jednym z pierwszych wpisów) zmodyfikowałem mój kod. Jest bardziej przejrzysty. Ma opcję kontynuacji gry, ale nie ma zakończenia. /* Prosta gra w odgadywanie wartości ustawionej potencjometrem wersja-2 */ #define redLed 2 #define yelLed 4 #define grnLed 5 #define pot A2 //potentiomiter connected to analog pin 2 #define swt 7 //switch connected to digital pin 4 int potRead = 0; //value read from potentiometer int playerInput = 0; //player input int inputDiff = 0; //difference of potentiometer and player input int maxDiff = 50; //max difference int ledOnTime = 2000; //led on time byte attCnt = 3; //counter of attempts bool tryAgain = true; //next attempt marker void setup() { Serial.begin(9600); //begin serial communication at speed 9600 bps while(!Serial) { //waith for serial port connected } Serial.println("\n"); //sets pin mode pinMode(redLed, OUTPUT); pinMode(yelLed, OUTPUT); pinMode(grnLed, OUTPUT); pinMode(pot, INPUT); pinMode(swt, INPUT_PULLUP); //sets leds off ledsLow(); //intro message txtIntro(); } void loop() { //potentiometer read if (tryAgain == true) { attCnt = 3; ledsLow(); txtSetup(); while (digitalRead(swt) == LOW) delay(20); //waiting for switch to be relased while (digitalRead(swt) == HIGH) delay(20); //waiting for switch to be pressed potRead = analogRead(pot); Serial.println("Ustawienie potencjometru odczytane\n"); } //start of the game switch(attCnt) { case 3: // attempt #1 attCnt--; txtAtt1(); txtEnter(); while (Serial.available() == 0); //waiting for player input playerInput = Serial.parseInt(); txtNumber(); Serial.println(playerInput); inputDiff = potRead - playerInput; break; case 2: // attempt #2 attCnt--; txtAtt2(); txtEnter(); while (Serial.available() == 0); //waiting for player input playerInput = Serial.parseInt(); txtNumber(); Serial.println(playerInput); inputDiff = potRead - playerInput; break; case 1: // attempt #3 attCnt--; txtAtt3(); txtEnter(); while (Serial.available() == 0); //waiting for player input playerInput = Serial.parseInt(); txtNumber(); Serial.println(playerInput); inputDiff = potRead - playerInput; break; } //result valuation if (abs(inputDiff) <= maxDiff) { //win of player txtWin(); Serial.println(potRead); digitalWrite(grnLed, HIGH); delay(ledOnTime); digitalWrite(grnLed, LOW); tryAgain = true; playAgain(); } else { if (attCnt > 0) { //next attempt txtAtt(); digitalWrite(yelLed, HIGH); delay(ledOnTime); digitalWrite(yelLed, LOW); tryAgain = false; } else { //player loss txtLoss(); digitalWrite(redLed, HIGH); delay(ledOnTime); digitalWrite(redLed, LOW); tryAgain = true; playAgain(); } } } //functions void txtIntro() { Serial.println("\nGRAMY W ZGADYWANKĘ\n"); Serial.println("Masz trzy próby by odgadnąć"); Serial.println("liczbę całkowitą od 0 do 1023"); Serial.println("ustawioną potencjometrem."); Serial.println("Możesz pomylić się o 50\n"); } void txtSetup() { Serial.println("Ustaw potencjometr w dowolnym położeniu"); Serial.println("i naciśnij przycisk\n"); } void txtEnter() { Serial.println("Wpisz liczbę od 0 do 1023"); } void txtNumber() { Serial.print("Twoja liczba to: "); } void txtAtt1() { Serial.println("Pierwsza próba"); } void txtAtt2() { Serial.println("\nDruga próba"); } void txtAtt3() { Serial.println("\nTrzecia, ostatnia próba"); } void txtAtt() { Serial.println("\nNie zgadłeś. Spróbuj jeszcze raz"); } void txtWin() { Serial.println("\nTAK! ODGADŁEŚ!\n"); Serial.print("Ustawiona liczba to: "); } void txtLoss() { Serial.println("\nNIESTETY PRZEGRAŁEŚ\n"); Serial.println("Nie udało Ci się trzy razy odgadnąć"); } void playAgain() { Serial.println("\nJeśli chcesz kontynuować grę"); Serial.println("naciśnij przycisk\n"); while (digitalRead(swt) == HIGH) delay(20); //waiting for switch to be pressed } void ledsLow() { //sets all leds LOW digitalWrite(redLed, LOW); digitalWrite(yelLed, LOW); digitalWrite(grnLed, LOW); }
T101 Październik 12, 2024 Udostępnij Październik 12, 2024 Dnia 24.09.2024 o 21:22, Sylba napisał: To wszystko zależy od tego jakiego użyjesz fotorezystora i połączonego z nim szeregowo rezystora. Zgodnie ze schematem podanym w kursie mierzysz spadek napięcia na tym właśnie szeregowym rezystorze, a nie na fotorezystorze. Zakładając, że użyjesz fotorezystora, który przy natężeniu oświetlenia 10 lux ma rezystancję 8k i szeregowo połączonego rezystora 10k, to napięcie na tym szeregowym rezystorze będzie wynosiło około 2,78V i odczyt z pinu ok. 568. Przy natężeniu oświetlenia 500 lux rezystancja fotorezystora spadnie do ok. 0,5k napięcie na szeregowym rezystorze wzrośnie do 4,75V co da odczyt z pinu ok. 973. Na początek to przepraszam za dość opóźnioną odpowiedź ale skupiłem się na kolejnych tematach w kursie. Jeśli mówimy o schemacie podanym w kursie to tam był wpięty fotorezystor i rezystor i tak właśnie nie do końca ten schemat rozumiem bo fotorezystor jest wpięty pomiędzy zasilaniem a pinem A5 z którego funkcja analogWrite(A5) sczytuje napięcie a rezystor jest wpięty w ten sposób tak jakby nie ingerował w ten obwód tylko "jest z boku" wpięty do obwodu skierowanego do masy co mi wygląda jakby spadek napięcia był mierzony tylko na fotorezystorze. Może to i głupie pytanie ale od początku na schemacie dla mnie wyglądało to dziwnie czemu rezystor nie jest bezpośrednio pomiędzy fotorezysotorem.
Sylba Październik 12, 2024 Udostępnij Październik 12, 2024 3 godziny temu, T101 napisał: Jeśli mówimy o schemacie podanym w kursie to tam był wpięty fotorezystor i rezystor i tak właśnie nie do końca ten schemat rozumiem bo fotorezystor jest wpięty pomiędzy zasilaniem a pinem A5 z którego funkcja analogWrite(A5) sczytuje napięcie a rezystor jest wpięty w ten sposób tak jakby nie ingerował w ten obwód tylko "jest z boku" wpięty do obwodu skierowanego do masy co mi wygląda jakby spadek napięcia był mierzony tylko na fotorezystorze. Gałąź, z której napięcie podawane jest na pin A5 składa się z dwóch elementów połączonych szeregowo - rezystora podłączonego do masy i fotorezystora, który z drugiej strony jest wpięty do zasilania Vcc=5 V. Napięcie mierzone jest pomiędzy złączem rezystor-fotorezystor i masą, a więc praktycznie jest to napięcie na rezystorze, który razem z fotorezystorem tworzy dzielnik napięcia. Przy małym natężeniu oświetlenia rezystancja fotorezystora jest duża co powoduje, że napięcie na rezystorze jest małe. Przykład: jeśli rezystancja rezystora wynosi 10k, a rezystancja fotorezystora 100k to napięcie na rezystorze wyniesie 5*10/(10+100)=0,45V. Przy dużym natężeniu oświetlenia rezystancja fotorezystora maleje i np. będzie 1k. Wówczas napięcie na rezystorze wyniesie: 5*10/(10+1)=4,55V. 1
migdas Listopad 25, 2024 Udostępnij Listopad 25, 2024 (edytowany) Zadanie 4.5 #include <Arduino.h> #define GREEN_LED 10 #define YELLOW_LED 11 #define RED_LED 12 #define BUTTON_1 8 int odczytPotencjometru = -1; bool aktualnyStanPrzycisku = LOW; bool ostatniStanPrzycisku = LOW; int odebraneDane = 0; int licznikProb = 0; void setup() { Serial.begin(9600); pinMode(GREEN_LED, OUTPUT); pinMode(YELLOW_LED, OUTPUT); pinMode(RED_LED, OUTPUT); pinMode(BUTTON_1, INPUT_PULLUP); digitalWrite(GREEN_LED, LOW); digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, LOW); } void loop() { // Przycisk reaguje tylko raz po wciśnięciu aktualnyStanPrzycisku = digitalRead(BUTTON_1); if (aktualnyStanPrzycisku == LOW && ostatniStanPrzycisku == HIGH) { odczytPotencjometru = analogRead(A5); Serial.println("Podaj liczbę: "); } ostatniStanPrzycisku = aktualnyStanPrzycisku; // Przyjmij dane od użytkownika i sprawdź wynik if (Serial.available() > 0 && odczytPotencjometru > -1) { odebraneDane = Serial.readStringUntil('\n').toInt(); if (odczytPotencjometru - odebraneDane >= -50 && odczytPotencjometru - odebraneDane <= 50) { Serial.println("Dobrze!"); digitalWrite(GREEN_LED, HIGH); digitalWrite(YELLOW_LED, LOW); } else { Serial.println("Źle"); licznikProb++; digitalWrite(YELLOW_LED, HIGH); if (licznikProb == 3){ digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, HIGH); } } } } Moja implementacja sterowaniem Ledami przy pomocy potencjometru: // Kontroluj 5 Ledów potencjometrem #include <Arduino.h> #define LED_1 8 #define LED_2 9 #define LED_3 10 #define LED_4 11 #define LED_5 12 int tablicaLed[] = {LED_1, LED_2, LED_3, LED_4, LED_5}; int poprzedniStanLed = -1; // Inicjalizacja zmiennej z wartością, która nie jest używana w mapowaniu int odczytanaWartosc; void setup() { // Ustawienie pinów jako wyjście i ustawienie ich stan na LOW for (int i = 0; i < 5; i++) { pinMode(tablicaLed[i], OUTPUT); digitalWrite(tablicaLed[i], LOW); } } void loop() { odczytanaWartosc = analogRead(A5); odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 0, 4); // Włączenie diody LED według odczytu digitalWrite(tablicaLed[odczytanaWartosc], HIGH); // Wyłączenie diody LED, jeśli zmieniła się wartość if ((odczytanaWartosc != poprzedniStanLed) && poprzedniStanLed != -1) { digitalWrite(tablicaLed[poprzedniStanLed], LOW); } // Przypisanie wartości, na potrzeby warunku wyłączenia poprzedniStanLed = odczytanaWartosc; } Edytowano Listopad 25, 2024 przez migdas 1
PanMajster Styczeń 11, 2025 Udostępnij Styczeń 11, 2025 (edytowany) Hej teraz tutaj trochę zaśmiecę int odczytanaWartosc = 0; float napiecie = 0; //przelicznik napicecia na V void setup() { // put your setup code here, to run once: Serial.begin(9600); //Uruchomienie komunikacji przez USART } void loop() { // put your main code here, to run repeatedly: odczytanaWartosc = analogRead(A5); //odczytana wartosc napiecia napiecie = odczytanaWartosc * (5.0/1024.0); Serial.println(napiecie); // wysyłamy ją do terminala) delay(400); //przerwa w odczycie wyników } Zaczytujemy napięcie mikrokontrolerem jak w zadaniu praktycznym. Chcąc sprawdzić jak będzie reagować dioda wpiąłem ją w układ dokładając rezystor 330ohm żeby nie spalić diody jak rozkręcę potencjometr na maxa. Ku mojemu zdziwieniu skręcając potencjometr nawet do "0" przynajmniej tak mi pokazuje w monitorze portu szeregowego 0V dioda dalej świeci. Kręcąc potencjometrem wraz z dodanym rezystorem otrzymuje max 3,07V minimum 0V Sprawdziłem multimetrem Wyniki cały czas ok 1,769V krecac w jedna i druga stronę potencjometrem, W monitorze portu dalej miedzy 3 a 0V Z czego to wynika? Wątpię żeby arduino źle zaczytywało. Ale przy zerowym napięciu dioda nie powinna świecić bo jest poniżej prądu przewodzenia. Czy arduino zaczytuje wyniki w innym miejscu? Ale caly prad idzie przez diode wiec powinna gasnąc i zapalać sie? EDIT: Ok juz wiem ze w zlym miejscu umieściłem diodę . powinna byc przy zielonym kabelku.. Edytowano Styczeń 11, 2025 przez PanMajster 1
PanMajster Styczeń 11, 2025 Udostępnij Styczeń 11, 2025 int odczytanawatosc = 0; //zmienna do przechowywania z odczytu fotorezystora float napiecie = 0;//Wartość przeliczona na napięcie w V bool Vwyslane = false; void setup() { pinMode(8, OUTPUT); //Sterowanie dioda Serial.begin(9600); } void loop() { //uruchomienie komunikacji z andruino odczytanawatosc = analogRead(A5); //odczytanie wartosci z pinu 5 napiecie = odczytanawatosc * (5.0/1024.0); //Przeliczenie wartości na napięcie if (odczytanawatosc <150 && !Vwyslane){ //jezeli wartosc powyzej 150 digitalWrite(8, HIGH); //wlacz diode Serial.println(napiecie);//Wysyłamy zmierzone napięcie Vwyslane = true; delay (60); } else if (odczytanawatosc >= 150){ digitalWrite(8,LOW); //wylacz diode Vwyslane = false; delay (60); } } Zadanie domowe 4.4. Proszę o sprawdzenie. Czy można było to zrobić jakoś "łatwiej"?
Sylba Styczeń 12, 2025 Udostępnij Styczeń 12, 2025 10 godzin temu, PanMajster napisał: if (odczytanawatosc <150 && !Vwyslane){ //jezeli wartosc powyzej 150 komentarz powinien być: if (odczytanawatosc <150 && !Vwyslane){ //jezeli wartosc ponizej 150 Skoro warunek if (odczytanawatosc <150 && !Vwyslane){ //jezeli wartosc ponizej 150 to wystarczy else{ digitalWrite(8,LOW); //wylacz diode Vwyslane = false; delay (60); } Jaką funkcję pełni delay (60); Przydałoby się jakieś zabezpieczenie przed włączaniem diody w wyniku chwilowego spadku odczytanej wartości poniżej 150. Innymi słowy, dioda zostaje włączona jeśli odczytana wartość natężenia oświetlenia będzie poniżej 150 przez np. 5s. 1
ethanak Styczeń 12, 2025 Udostępnij Styczeń 12, 2025 Drobiazg (kiedyś sprawa wałkowana na forum): dzielisz przez 1023 (maksymalna wartość ADC dla 5V) a nie 1024. Dlaczego... a jaki wynik dostaniesz dla 5V na wejściu jeśli będziesz dzielić przez 1024?
Sylba Styczeń 12, 2025 Udostępnij Styczeń 12, 2025 8 minut temu, ethanak napisał: Drobiazg (kiedyś sprawa wałkowana na forum): dzielisz przez 1023 (maksymalna wartość ADC dla 5V) a nie 1024. Dlaczego... a jaki wynik dostaniesz dla 5V na wejściu jeśli będziesz dzielić przez 1024? Temat szeroko dyskutowany czy 1023, czy 1024. Dzielisz przez 1024, a mnożysz przez wartość odczytaną z pinu analogowego czyli maksymalnie przez 1023. Dla przykładu zakres napięcia, który chcemy mierzyć to 5v. Po podzieleniu przez 1024 uzyskujemy rozdzielczość pomiaru 5/1024=0,0048828125 V. Zmianie zdygitalizowanej wartości o 1 odpowiada zmianie napięcia o 0,0048828125 V. Innymi słowy jeśli napięcie jest większe od 0, ale mniejsze od 0,0048828125 V to zdygitalizowana wartość będzie 0. Dopiero gdy napięcie będzie większe od 0,0048828125 V zdygitalizowana wartość będzie 1. Błąd dygitalizacji wynosi od 0 do 0,0048828125 V. Więcej na ten temat można przeczytać tu.
ethanak Styczeń 12, 2025 Udostępnij Styczeń 12, 2025 1 godzinę temu, Sylba napisał: Dla przykładu zakres napięcia, który chcemy mierzyć to 5v Czyli maksymalne wskazanie będzie nie 5V a 4.995V - jesteś pewien że o to chodziło?
Sylba Styczeń 12, 2025 Udostępnij Styczeń 12, 2025 (edytowany) To wynika z procesu kwantyzacji. Najprościej to pokazać na przykładzie jednobitowego przetwornika a/c, który ma dwa stany 0 i 1. Jeśli przy pomocy tego przetwornika chcemy zmierzyć napięcie w zakresie np. 0-2V, to przetwornik dla wartości 0-1 ustawia bit na 0, a dla wartości 1-2V bit ma wartość 1. Błąd kwantyzacji wynosi od 0 do 1V. Stan bitów przetwornika mapujemy na wartości zakresu pomiarowego dzieląc zakres pomiarowy przez 2 (ilość stanów przetwornika) i mnożąc przez zakres pomiarowy czyli 2V. W rezultacie dla rzeczywistego napięcia w granicach 0-1V mapowana wartość wynosi 0V, a dla rzeczywistego napięcia z przedziału 1-2V mapowana wartość to 1V. Maksymalny błąd mapowanej wartości wyniesie -1V. Jeśli przy mapowaniu podzielimy zakres 2V/1 to po zmapowaniu dla zakresu rzeczywistych napięć 0-1V obliczona wartość będzie 0V, a dla napięć z przedziału 1-2V obliczona wartość wyniesie 2V. Tu maksymalny błąd pokazywanej wartość w stosunku do rzeczywistej zmienia się od -1V do +1V. Temat błędów kwantyzacji przetworników a/c jest dobrze wyjaśniony w tej instrukcji. Edytowano Styczeń 12, 2025 przez Sylba
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »