Skocz do zawartości

Pomocna odpowiedź

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)?

  • Lubię! 1
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. 

  • Lubię! 1
(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 przez Sylba
  • Lubię! 1
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;
}

 

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);
}

 

  • 2 tygodnie później...
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.

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.

ard_3_4.thumb.png.89a1c8ae46f59d366ea2a22b39ebf453.png

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.

  • Pomogłeś! 1
  • 1 miesiąc później...
(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 przez migdas
  • Lubię! 1
  • 1 miesiąc później...
(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?

IMG_20250111_162725.jpg

EDIT: Ok juz wiem ze w zlym miejscu umieściłem diodę . powinna byc przy zielonym kabelku..

Edytowano przez PanMajster
  • Lubię! 1
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"?

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.

  • Pomogłeś! 1

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?

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.

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?

 

(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 przez Sylba

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ę »
×
×
  • Utwórz nowe...