Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Witam wszystkich, jest to mój pierwszy post, więc chciałbym wszystkich serdecznie przywitać. Dopiero zaczynam zabawę z Arduino, dlatego korzystam z kursu(bardzo dobrze mi się uczy z niego 🙂 ). Z pozostałymi pracami nie miałem problemu, natomiast przy tej mam problem. Da się przerobić kod tak aby informacja o napięciu była wysyłana raz? Kombinowałem z nawiasami jednak nie bardzo mi to wyszło. Pozdrawiam 🙂

Zadanie domowe 4.4:

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog=0; 
int kontrola=0;
float napiecie=0;
void setup() {
 Serial.begin(9600);
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
}

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
 prog=analogRead(A3);

 if (odczytanaWartosc < prog) {
    digitalWrite(8, HIGH);//Włączenie diody  
    kontrola=analogRead(A3);
    napiecie=kontrola * (5.0/1023.0);
    Serial.println(napiecie);



 }else {
    digitalWrite(8, LOW);//Wyłączenie diody      
 }

 delay(50);



}
Link do komentarza
Share on other sites

vernun, musisz dorobić dodatkową zmienną, która będzie informowała program, czy wysłał już informacje po zmianie napięcia, czy nie 🙂 Nie chce dawać Ci gotowego rozwiązania - kombinuj!

Link do komentarza
Share on other sites

Udało się! Dzięki ! Czas na kolejne zadanko 😃

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog=0; 
int kontrola=0;
float napiecie=0;
int info=0;

void setup() {
 Serial.begin(9600);
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
}

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
 prog=analogRead(A3);

 if (odczytanaWartosc < prog) {
    digitalWrite(8, HIGH);//Włączenie diody  
    if (info==0){
    kontrola=analogRead(A3);
    napiecie=kontrola * (5.0/1023.0);
    Serial.println(napiecie);
    info=info+1;

  }


 }else {
   info=0;
    digitalWrite(8, LOW);//Wyłączenie diody  

 }

 delay(50);




}
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

Pytanie mam do zadania 4.4, wpadłem na pomysł, żeby napisać kod w taki sposób, że będzie wyświetlana wartość napięcia wyjściowego oraz progu wtedy, gdy jedna z nich się zmieni. Użyłem pomocniczej zmiennej temp, do której przypisałem wartość napięcia tuż przed końcem pętli void loop i kombinowałem z różnymi warunkami w ifach, gdzie chciałem ją jakoś porównać z bieżącą wartością napięcia , i zauważyłem, że wartość wyświetla się zawsze, niezależnie od warunku. Czy to dlatego, że wartość np. rezystancji potencjometru zmienia się cały czas, ze względu na różne zakłócenia czy coś takiego?

Link do komentarza
Share on other sites

MateuszW, te schematy montażowe pochodzą z darmowego programu Fritzing. Można w nim również wykorzystywać proste płytki uniwersalne.

Synergia, umieść kod. Będzie znacznie łatwiej pomóc.

Przy okazji zapytam, czy są tu jacyś zainteresowani kolejną częścią kursu 🙂? Bo pytań brak już powątpiewam powoli 😉

Link do komentarza
Share on other sites

vernun, świetnie nowa część pojawi się dziś lub jutro. Zależy czy zdążę dorobić kilka zdjęć, bo na ostatni moment uznałem jednak, że kilka spraw należałoby wytłumaczyć na większej ilości przykładów - stąd opóźnienie. Mam jednak nadzieje, że dwie kolejne części w krótkim odstępie wynagrodzą wszystkim czekanie.

Link do komentarza
Share on other sites

Teker, dzięki za info, właśnie wczoraj pobrałem sobie Fritzinga:) a co do kolejnej części kursu to ja myślałem że już dawno gotowa tylko dajesz czas na dokładne przyswojenie materiału z ósmej części kursu elektroniki 🙂

Link do komentarza
Share on other sites

a co do kolejnej części kursu to ja myślałem że już dawno gotowa tylko dajesz czas na dokładne przyswojenie materiału z ósmej części kursu elektroniki.

Tak, gotowa była, ale jak tak siedziałem nad nią i sprawdzałem ostatni raz, to postanowiłem poprawić trochę... i przepisałem połowę 😉 Czasami tak mam 😋 Ale masz rację, znajomość stabilizatorów z kursu elektroniki będzie konieczna!

Link do komentarza
Share on other sites

Udało się(tak mi się wydaje) zrobić punkt 4.5. 😃

Tylko w jednym miejscu miałem problemy i musiałem zaczerpnąć pomocy(zaznaczyłem miejsce w kodzie). Myślałem, żeby zmienną na wpisanie liczby dać w int i użyć odpowiednika scanf, ale przerosło mnie to jeszcze 🙁

Oto mój kod(pewnie dużo zbędnego kodu)

Zadanie 4.5.:

#define yellow 8
#define blue 9
#define red 10
#define button 2

int odczyt = 0;
int poczatek=0;
int proby=0;
int liczniknap=0;
int licznikliczby=0;
String liczba="";
int liczba_int=0; //ten fragment zapożyczony

void setup() {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(10,OUTPUT);

}

void loop() {
odczyt = analogRead(A0);


 if (digitalRead(button) == LOW && proby<3) { 
   digitalWrite(blue, LOW);
   digitalWrite(yellow, HIGH); 
   delay(10);
   if(liczniknap==0){
   Serial.println("Podaj liczbe:");
   liczniknap=1;
   delay(10);
   } 
   digitalWrite(yellow,LOW);
}


else {
  if(poczatek==0){
      Serial.println("Witaj w mojej grze aby zagrac nacisnij przycisk!");
      Serial.println("Zasady sa proste, ustaw pokretlo w dowolnej pozycji.\nPrzyjmie ono wartosc od 0 do 1031.");
      Serial.println("Twoim zadaniem jest zgadnac jaka to liczba(mozesz pomylic sie o 50).");
      Serial.println("Masz 3 proby.\nPo odgadnieciu liczby zapali sie niebieska dioda\nPo pierwszym i drugim bledzie zolta\nNatomiast po trzecim czerwona");
      }
      liczniknap=0;

   if(licznikliczby==0 && Serial.available() > 0){
     liczba=Serial.readStringUntil('\n');
     liczba_int=liczba.toInt();
     Serial.println("Twoja liczba to:");
     Serial.println(liczba_int);
     licznikliczby=1;

       if(odczyt-50<=liczba_int && odczyt+50>=liczba_int){
         Serial.println("Wygrales");
         digitalWrite(blue,HIGH);
         Serial.println("Aby zagrac jeszcze raz, nacisnij guzik 'reset'");
        }

else if(proby==0){
 digitalWrite(yellow,HIGH);
        Serial.println("Niestety nie udalo sie");
        Serial.println("Pozostalo prob:2");
        Serial.println("Aby sprobowac jeszcze raz nacisnij guzik\n");
        }

       else if(proby==1){
        digitalWrite(yellow,HIGH);
        Serial.println("Niestety nie udalo sie");
        Serial.println("Pozostalo prob:1");
        Serial.println("Aby sprobowac jeszcze raz nacisnij guzik\n");
   	}
         else if(proby==2){
          digitalWrite(yellow,LOW);
          digitalWrite(red,HIGH);
          Serial.println("Niestety nie udalo sie");
          Serial.println("Pozostalo prob:0");  
          Serial.println("Koniec gry");  
          Serial.println("Taka liczbe ustawiles:");
          Serial.println(odczyt);
        }

   proby=proby+1;
  if ((digitalRead(button) == LOW && proby>=3)|| proby>3){
     Serial.println("Gra skonczona!");
     Serial.println("Aby zagrac jeszcze raz, nacisnij guzik 'reset'");
  }
}
}

licznikliczby=0;
poczatek=1;
}
Link do komentarza
Share on other sites

@Treker

kod 4.4

zaznaczam, że zdaję sobie sprawę, że komentarze po angielsku raczej nie stoją na zbyt wysokim poziomie, natomiast postanowiłem komentować i nazywać zmienne właśnie w tym języku, aby trenować , bo ja wiem, informatyczny (ewentualnie techniczny angielski), a nuż się kiedyś przyda.

Warunek, a o który pisałem jest na samym dole zakomentowany

#define blue 8

int readValue=0; // value of voltage in bits
float realVoltage=0; //real voltage on A5
int thresholdValue=0; //threshold value for potentiometer
boolean temp = false; //variable to check if voltage on voltage divider was changed
//float temp1 = 0;                 
void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
pinMode(blue,OUTPUT);

digitalWrite(blue, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:

   readValue = analogRead(A5); //read value of voltage(in bits) on voltage divider output
   realVoltage = readValue*(5.0/1023.0);//true voltage value 
   thresholdValue = analogRead(A4);


   if(readValue<thresholdValue)//if read value is lower than threshold value
                            //switch blue led on
     {

       digitalWrite(blue,HIGH);
       if(temp == false)//if temp is false send value once
       {
         Serial.print("\nvalue of voltage on voltage divider:\n");
         Serial.print(realVoltage);
         Serial.print("\nvalue of threshold voltage\n");
         Serial.print(thresholdValue*(5.0/1023.0));
         temp = true;//make temp true to prevent from sending value more times
         }
     }
       else//if read value is greater don't do anything
       {
         temp = false;
         digitalWrite(blue,LOW);
         }
        /* if( (temp1 < thresholdValue*(5.0/1023.0) + 0.01 ) && (temp1 > thresholdValue*(5.0/1023.0) - 0.01 ) )
         {
           Serial.println(thresholdValue*(5.0/1023.0));
           delay(250);
         }
       temp1= (thresholdValue*(5.0/1023.0));  */

}

kod 4.5

Chciałem zrobić dodatkowe zabezpieczenie przed zbyt szybko wpisaną liczbą(zmienna temp, komentarze są), ale coś nie wychodzi, może po prostu się nie da?

Oczywiście wiem, że nie jest to optymalnie napisane, ale działa 😃

//declaration of directives
#define red 4
#define yellow 5
#define green 6
#define button 13

int potentiometerValue=0;
int i=1;
String number ="";
int int_number=0;
int attempts_number;
boolean start = true; //start variable
boolean temp = false;//temporary variable to prevent from reading datas before it can be read 
//for example before pressing a button
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
//pins as outputs
pinMode(red,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(green,OUTPUT);

pinMode(button,INPUT_PULLUP);//buton pin
//switch leds off
digitalWrite(red,LOW);
digitalWrite(yellow,LOW);
digitalWrite(green,LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
 if(start == true)
      {
        temp=false;//make programme incapable of reading number before it is desired

        digitalWrite(red,LOW);
        digitalWrite(yellow,LOW);
        digitalWrite(green,LOW);

        attempts_number=3;


           Serial.println("The game started!");
           Serial.println("Move potentiometer and press button!");

               while(digitalRead(button) == HIGH){}//void loop to wait as long as button isn't pressed
               while(digitalRead(button) == LOW)//if button is pressed
                 {
                   digitalWrite(red,LOW);
                   digitalWrite(yellow,LOW);
                   digitalWrite(green,LOW);

                     }


                       while(attempts_number >0)
                         {
                             potentiometerValue=analogRead(A5);//read value of potentiometer

                             Serial.println("give me a number!(from 0 to 1023)");
                             while(Serial.available() == 0)//wait for the number from user
                             {
                             temp=true;
                                 }//now user is capable of writing the number

                             if((Serial.available() > 0) && (temp=true))//if user gave the number
                              {        
                                   number = Serial.readStringUntil('\n');
                                   Serial.println("your number: ");
                                   Serial.println(number);//print number on the screen
                                   int_number = number.toInt();//convert string to int

                                   //victory condition
                                   if((int_number > potentiometerValue - 50) && (int_number < potentiometerValue + 50))
                                     {
                                           digitalWrite(green,HIGH);
                                           digitalWrite(red,LOW);
                                           digitalWrite(yellow,LOW);
                                           Serial.println("Congratulations! You won!");
                                           attempts_number = 0;
                                             }

                                   else //if number is outside of potentiometer value (+/- 50)
                                     {
                                         if(attempts_number>1)//if user has more than 1 attempt
                                             {
                                                   attempts_number-=1;//decrease attempts by 1
                                                   digitalWrite(yellow,HIGH);
                                                   digitalWrite(red,LOW);
                                                   digitalWrite(green, LOW); 
                                                   Serial.println("You have ");
                                                   Serial.print(attempts_number);
                                                    Serial.print(" attempt(s)!\n");
                                                 }  
                                           else//if user has no attempts
                                               {
                                                   digitalWrite(red,HIGH);
                                                   digitalWrite(yellow,LOW);
                                                   digitalWrite(green,LOW);
                                                   Serial.println("Unfortunately you lost!");
                                                   attempts_number=0;
                                                   }   
                                       }
                               }  
                           }

            start=false;//at the end of "if" make start false to be able to ask user if he wants play again
                   }
                  if(start==false)
                    { 
                    Serial.println("Do you want play once again? (if yes press button)");//ask
                        }
                   while(digitalRead(button) == HIGH)//if button isn't pressed new game is impossible
                     {
                         start=false;
                         }
                  if(digitalRead(button) == LOW)//if button is pressed new game is possible
                  {
                       start = true;
                       delay(2000);
                     //  i=0;
                     }
}

kod 4.6

nie do końca jestem pewny czy o to chodziło 😋

//declaration of directives
#define red1 5
#define yellow 6
#define red2 7

int first=0;//voltage output on first photoresistor
int second=0;//voltage output on second photoresistor

void setup() {
 // put your setup code here, to run once:
 pinMode(red1,OUTPUT);
 pinMode(yellow,OUTPUT);
 pinMode(red2,OUTPUT);

Serial.begin(9600);

digitalWrite(red1,LOW);
digitalWrite(yellow,LOW);
digitalWrite(red2,LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
//read voltage value on photoresistors
first = analogRead(A5);
second = analogRead(A0);
       if(first > second)
           {
               digitalWrite(red1,HIGH);
               digitalWrite(yellow,LOW);
               digitalWrite(red2,LOW);

               Serial.print("\nfirst voltage: ");
               Serial.print(first*(5.0/1023.0));
               Serial.print("\nsecond voltage: ");
               Serial.print(second*(5.0/1023.0));
               delay(500);
             }
             else if(first == second)
             {
               digitalWrite(red1,LOW);
               digitalWrite(yellow,HIGH);
               digitalWrite(red2,LOW);

               Serial.print("\nfirst voltage: ");
               Serial.print(first*(5.0/1023.0));
               Serial.print("\nsecond voltage: ");
               Serial.print(second*(5.0/1023.0));
               delay(500);
             }

             else if(first < second)
             {
               digitalWrite(red1,LOW);
               digitalWrite(yellow,LOW);
               digitalWrite(red2,HIGH);

               Serial.print("\nfirst voltage: ");
               Serial.print(first*(5.0/1023.0));
               Serial.print("\nsecond voltage: ");
               Serial.print(second*(5.0/1023.0));
               delay(500);
             }
}

jeśli ktoś przebrnie, bardzo chętnie wysłucham krytycznych uwag włącznie z błędnym użyciem języka angielskiego 😃

I oczywiście, że czekamy na nowy odcinek!

Link do komentarza
Share on other sites

Widzę, że się rozkręciliście z zadaniami domowymi 🙂 wasze kody nie są złe (pomijając fakt, że dużo czytania a przedtem pisania) ale ja to bym zrobił tak:

4.5

#define zolty1 12
#define zolty2 11
#define czerwony 10
#define zielony 9
#define przycisk 3
#define potencjometr A5

long odczytPot=0;
long podanaLiczba = 0;
int proby=1;

void setup() {
 for(int i=9; i<=12; i++) {
   pinMode(i, OUTPUT);
   digitalWrite(i, LOW);
 }

 pinMode(przycisk, INPUT_PULLUP);
 Serial.begin(9600);  
}

void loop() {
 Serial.println("Wdus przycisk");
 proby=1;
 while(digitalRead(przycisk)==HIGH) {}
 odczytPot=analogRead(potencjometr);
 for(int i=9; i<=12; i++) 
   digitalWrite(i, LOW);

 while(proby<4){
   Serial.print("Podaj liczbe: ");
   while(Serial.available()==0) {}
   podanaLiczba = Serial.parseInt();
   Serial.println(podanaLiczba);
   long roznica=odczytPot-podanaLiczba;
   if(abs(roznica)<=50){
     Serial.println("Wygrales wycieczke");
     break;
   }
   digitalWrite(13-proby, HIGH);
   proby++;
 }
 for(int i=9; i<=12; i++) 
   digitalWrite(i, LOW);

 if(proby<3)    
   digitalWrite(zielony, HIGH);
 else digitalWrite(czerwony, HIGH);
}
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.