Skocz do zawartości

Pomocna odpowiedź

Cierbo, kod nie jest może najprostszy, ale wygląda poprawnie. Przejrzyściej byłoby gdybyś najpierw zrobił if'a sprawdzającego, na którym fotorezystorze jest większy odczyt i dopiero dalej zajął się odpowiednim wyświetleniem stanu na LEDach. Warto też pamiętać o komentarzach. Masz jakiś konkretny problem? Jeśli tak, to zadaj pytanie, wtedy łatwiej będzie udzielić pomoc.

Treker, otóż żadne z diod się nie zapala nie wiedzieć dlaczego, oraz jak zrobić if'a sprawdzającego? Prosze o drobną wskazówkę.

Cierbo, zacznijmy od tego, czy w terminalu widzisz poprawnie odczytane informacje? Sprawdzałeś, czy możesz sterować samymi diodami (bez tego całego algorytmu) - wyeliminujesz wtedy niepewność, czy układ jest poprawnie połączony i będziemy mogli ruszyć dalej ze sprawdzaniem 🙂

Wybacz, że pisze z taką częstotliwością ale dużo mam na głowie... Wracając, wartości odczytane w terminalu są poprawne, układ również jest poprawnie podłączony 🙂

Cierbo, jednak coś musi być źle. Spójrz na swoje warunki - nie ma tam takiej możliwości, aby żadna z diod nie świeciła. Z tego co piszesz wychodzi, że w praktyce wszystkie są wyłączone, więc coś tu nie gra 🙂

Ok. Podłączyłem wszystko jeszcze raz na płytkę i teraz świecą te diody... nie wiem co tam popaprałem xd Teraz układ reaguje następująco, po stronie gdzie jest ciemno tam święcą diody, natomiast tam gdzie występuje silne źródło światła to gasną diody. W zasadzie układ pokazuje po której stronie jest ciemniej. Wychodzi na to, że zrobiłem na odwrót niż w zadaniu było wymagane. Gdybym wiedział w jakim programie robicie te rysunki graficzne z arduino i płytką stykową to bym to lepiej zobrazował 🙂

Wspomniałeś wcześniej o if sprawdzającym, jak się za to zabrać?

Cierbo, w takim razie musisz tylko zamienić podłączenie czujników (zamień fizycznie czujnik lewy z prawym). Wtedy będzie działało i nie będziesz musiał nic już w programie zmieniać 🙂

  • 4 tygodnie później...

A to moje rozwiązania zadań. Treker, już mi zwracałeś uwagę na brak komentarzy 🙂 Wiem, że są przydatne, ale w tych kodach wszystko jest wg mnie wystarczająco czytelne 🙂

Zadanie 4.5 (kiepsko, niepełna funkcjonalność)

// ***** DEFINES *****
#define switch 12
#define red 8
#define yellow 7
#define green 6
#define potencjometr A4

// ***** VARIABLES *****
int odczyt = 0;
int liczba = 0;
boolean wcisniety = false;
byte licznik = 0;

// ***** SETUP *****
void setup() {
 Serial.begin(9600);
 pinMode(switch, INPUT_PULLUP);
 pinMode(red, OUTPUT);
 pinMode(yellow, OUTPUT);
 pinMode(green, OUTPUT);
 digitalWrite(red, LOW);
 digitalWrite(yellow, LOW);
 digitalWrite(green, LOW);

 Serial.println("Witaj! Przekrec potencjometr i wcisnij przycisk.");

}

// ***** LOOP *****
void loop() {
 odczyt = analogRead(potencjometr);
 //Serial.println(odczyt);
 //Serial.println(wcisniety);
   if (digitalRead(switch) == LOW) {
   Serial.println("Podaj liczbe: ");
   wcisniety = true;
   delay(500);
   }

    if (wcisniety == true) {
     if (Serial.available() > 0) {
       liczba = Serial.parseInt();
       if ( (abs(liczba - odczyt)) < 50 ) {
         digitalWrite(red, LOW);      
         digitalWrite(yellow, LOW);
         digitalWrite(green, HIGH);
         Serial.println("YOU WIN!");
       } else if (licznik == 2) {
         digitalWrite(red, HIGH);      
         digitalWrite(yellow, LOW);
         digitalWrite(green, LOW);
         Serial.println("Przegrales...");
       } else {
         digitalWrite(red, LOW);      
         digitalWrite(yellow, HIGH);
         digitalWrite(red, LOW);
         Serial.println("Zle, Podaj liczbe: ");
         licznik = licznik + 1;
       }
     }
    }


}

Zadanie 4.6 (To mi całkiem fajnie wyszło 😃)

// ***** DEFINES *****
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6
#define goraADC A4
#define dolADC A5

// ***** VARIABLES *****
int gora = 0;
int dol = 0;
int balans = 0;

// ***** SETUP *****
void setup() {
 Serial.begin(9600);
 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);  
}

// ***** LOOP *****
void loop() {
 gora = analogRead(goraADC);
 dol = analogRead(dolADC);
 balans = gora - dol;
 Serial.println(balans);
 delay(100);

 if (balans > 150) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, HIGH);
 }

 else if (balans <= 150 && balans > 50) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, HIGH);
   digitalWrite(led5, LOW);
 } 

 else if (balans <= 50 && balans >= -50) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, HIGH);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 

 else if (balans < -50 && balans >= -150) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, HIGH);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 

 else if (balans < -150) {
   digitalWrite(led1, HIGH);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 


 }

koba94, dla Ciebie pewnie są teraz jasne, ale gdy publikujesz je w Internecie i piszesz, że coś nie działa. To mi (czy komuś innemu) jest ciężko analizować program, jeśli nie wiemy, co miałeś na myśli. Jakie masz dokładniej problemy w zadaniu 4.5?

int i = 0; //Definicja zmiennych
int odczyt = 0;
int wartosc = 0;

void setup() {
 for (i=8; i<=12; i++) { //pętla definiująca diody na pinach od 8 do 12 jako OUTPUT
   pinMode(i, OUTPUT);
 }
}

void loop() {
 odczyt = analogRead(A5); //pobieranie danych z piny A5
 wartosc = map(odczyt, 0, 1023, 1, 5); //mapowanie wartości
 for (i=8; i<=12; i++) { //kolejna pętla, dzięki której wybieramy piny od 8 do 12
  if ((i-7) == wartosc) { 
/*warunek, jesli pin -7 jest równy zmapowanej wartości, załącza HIGH, w przeciwnym wypadku jest to low. Można skrócić ten krok i w warunku zastosować samo i, ale wtedy w mapowaniu zamiast cyfr od 1-5 musimy zmapować od 8-12*/
    digitalWrite(i, HIGH);
  } else {
    digitalWrite(i, LOW);
  }
 }
 delay(50);
}

Witam mam problem przy zadaniu 4.4, mianowicie w miejscu żeby Arduino wysłało komunikat o napięciu na dzielniku z fotorezystorem TYLKO RAZ. Po zgaszeniu światła lampka się zapala i wysyła jeden komunikat do PC, ale po zgaszeniu lampa nie gaśnie. Dopiero powtórne wgranie programu gasi lampkę. Mój kod:

int prog=0;
int fotorezystor=0;
float napiecie=0;
void setup() {
 // put your setup code here, to run once:
 pinMode(8, OUTPUT);
 digitalWrite(8, LOW);
 Serial.begin(9600);
}
void loop() {
 // put your main code here, to run repeatedly:
 prog=analogRead(A5);
 fotorezystor=analogRead(A4);
   napiecie=5/1023*fotorezystor;
   //Serial.println(odczytanaWartosc1);
   delay(500);
   if (fotorezystor<prog) {
     digitalWrite(8, HIGH);
     Serial.println(fotorezystor);
     while (fotorezystor) {}
   }
   else {
     digitalWrite(8, LOW);
   }
}
  fotorezystor=analogRead(A4);
...
   if (fotorezystor<prog) {
...
     while (fotorezystor) {}
   }

W ifie używasz innego warunku niż w while'u.

napiecie=5/1023*fotorezystor;

To nie jest obliczane jako float, bo żaden z elementów po prawej nie jest typu float.

Poza tym nigdzie nie używasz tej zmiennej.

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...