Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Myślę na wykorzystaniem arduino jako programatora i przerobić robota na płytkę uniwersalną. Mam tez zakupione trzy czujniki odbiciowe więc może jakiś LF prosty, oczywiście z wykorzystaniem arduino.

Udostępnij ten post


Link to post
Share on other sites

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



}

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
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);




}

Udostępnij ten post


Link to post
Share on other sites

vernun, popraw trochę wcięcia w kodzie i będzie idealnie,

Udostępnij ten post


Link to post
Share on other sites

A ja mam takie pytanie:

Czego używacie do tworzenia tych schematów graficznych z płytkami stykowymi i czy jest coś podobnego do płytek uniwersalnych.

Udostępnij ten post


Link to post
Share on other sites

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?

Udostępnij ten post


Link to post
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 😉

Udostępnij ten post


Link to post
Share on other sites

Jak najbardziej jestem zainteresowany! Skupiam się na zadaniu domowym 4.5. jak na razie, więc jeszcze trochę mi zostało 🙂

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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 🙂

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
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;
}

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
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);
}

Udostępnij ten post


Link to post
Share on other sites

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ę »

×