Skocz do zawartości

BHBmacieg

Użytkownicy
  • Zawartość

    37
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

BHBmacieg wygrał w ostatnim dniu 24 marca

BHBmacieg ma najbardziej lubianą zawartość!

Reputacja

21 Dobra

O BHBmacieg

  • Ranga
    3/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Część, ominąłem póki co line followera bo chciałem połączyć zdalne sterowanie ze światłolubem oraz omijaniem przeszkód. Obecnie robot może być sterowany zdalnie, z możliwością płynnej regulacji prędkości jazdy. Osiągnięcie zarówno wartości maksymalnej jak i minimalnej sygnalizowane jest BUZZERem. Odpowiadają za to przyciski "vol up" oraz "vol down" na pilocie. Przycisk source natomiast powoduje zmianę trybu jazdy. W drugim trybie jazdy robot jeździ autonomicznie omijając przeszkody. Z przodu, jak poprzednio, przeszkody wykrywa za pomocą "czułek". Z tyłu posiada również czujnik ultradźwiękowy, który pozwala uniknąć tratowania obiektów za robotem podczas zawracania. W dowolnym momencie jednym kliknięciem mogę się przełączać między trybami. Zmiana trybu również sygnalizowana jest przez piknięcie BUZZERa. Kod: #include <Arduino.h> #define TSOP_PIN 3 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR 12 #define ROZNICA_MIN -400 #define ROZNICA_MAX 400 #define PWM_MAX 165 #define trigPin 8 #define echoPin 7 #define BUZZER 10 #define LED 13 #include <RC5.h> RC5 rc5(TSOP_PIN); //ifnormcaja o podłączeniu odbiornika //zmienne dla RC5 byte address; byte command; byte toggle; int predkosc = 40; //zmienna poczatkowa dla predkosci bool ZmianaTrybu = false; //zmienna dla określenia trybu jazdy void setup() { pinMode(L_DIR, OUTPUT); //konfiguracja pinów dla mostka H pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(BUZZER, OUTPUT); //konfiguracja pozostałych elementów digitalWrite(BUZZER, 0); pinMode(LED, OUTPUT); digitalWrite(LED, 0); pinMode(L_SIDE_SENSOR, INPUT_PULLUP); //koniguracja pinu jak przyckiski pinMode(R_SIDE_SENSOR, INPUT_PULLUP); randomSeed(analogRead(5)); //inicjalizacja generatora liczb losowych pinMode(trigPin, OUTPUT); //Deklaracja pinów dla czujnika zbliżeniowego pinMode(echoPin, INPUT); } void loop() { if (ZmianaTrybu == false) { //sprawdzenie obecnego trybu jazdy if (rc5.read(&toggle, &address, &command)) { //jeśli odebrano komendę switch(command) { case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 2: //do przodu leftMotor(predkosc); rightMotor(predkosc); break; case 4: //obrot w lewo leftMotor(-(predkosc-10)); rightMotor(predkosc-10); break; case 5: //stop StopMotors(); break; case 6: //w prawo leftMotor(predkosc-10); rightMotor(-(predkosc-10)); break; case 8: //do tyłu leftMotor(-predkosc); rightMotor(-predkosc); break; case 3: //łuk w prawo do przodu leftMotor(predkosc); rightMotor(predkosc-20); break; case 1: //łuk w lewo do przodu leftMotor(predkosc-20); rightMotor(predkosc); break; case 7: //łuk w lewo do tyłu leftMotor(-(predkosc-20)); rightMotor(-predkosc); break; case 9: //łuk w prawo do tyłu leftMotor(-predkosc); rightMotor(-(predkosc-20)); break; case 16: //zwiekszenie predkosci jazdy if (predkosc < 80) { //okreslenie maksymalnej dopuszczalnej predkosci predkosc++; } else { sygnalizacjaBuzzer(4); } break; case 17: //zmniejszenie predkosci jazdy if (predkosc > 40) { //okreslenie minimalnej dopuszczalnej predkosci predkosc--; } else { sygnalizacjaBuzzer(4); } break; case 56: ZmianaTrybu = !ZmianaTrybu; sygnalizacjaUruchomienia(); break; } } } else { //cześć dla światłoluba oraz omijania przeszkód int odczytLewy = analogRead(L_LIGHT_SENSOR); //odczytanie wartości z lewego czujnika int odczytPrawy = analogRead(R_LIGHT_SENSOR); //odczytanie wartości z prawego czujnika int roznica = odczytLewy - odczytPrawy; int los = random(5, 40) * 10; //wylosowanie liczby dla czasu obrotu int randomSpeed = random(2, 6) * 10; //wylosowanie predkosci jazdy do przodu if (roznica < ROZNICA_MIN) { //ewentualna korekcja skrajnych warotści róznic roznica = ROZNICA_MIN; } else if (roznica > ROZNICA_MAX) { roznica = ROZNICA_MAX; } int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -40, 40); //zmienna pozawalająca przeliczenie odczytów z czuników na zmianę prędkości silników leftMotor(30+zmianaPredkosci); //korekty prędkości zależnie od natężenia światła rightMotor(30-zmianaPredkosci); if (digitalRead(L_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po lewej stronie int odleglosc = zmierzOdlegosc(); //zmienna odczytująca dystans z czujnika US if (odleglosc > 30) //jeśli odległość jest większa niż 30 cm to robot zdąży wykonać pełny zadany ruch { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) //jeśli odległość mniejsza niż 30 cm sprawdzanie kolejnych odległości do momentu osiągnięcia wartości 8 cm { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); //zamiana wartości odległości delay(50); } } //obrót w miejscu w prawo leftMotor(randomSpeed); rightMotor(-randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po prawej stronie //jedź wstecz i wydawaj dźwięk int odleglosc = zmierzOdlegosc(); //powtarzamy co w poprzednim warunku if (odleglosc > 30) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); delay(50); } } //obrót w miejscu w lewo leftMotor(-randomSpeed); rightMotor(randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } TrybJazdy(); //funckja odpowiedzialna za zmianę trybu pracy } } void leftMotor(int V) { //funkcja odpowiedzialna za sterowanie lewym silnikiem if (V > 0) { //jeśli wartość prędkości więszka od 0 V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //do przodu analogWrite(L_PWM, V); //zadanie prędkości } else { V = abs(V); //wyciągnięcie wartości bezwzględnej V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //do tyłu analogWrite(L_PWM, V); //zadanie prędkości } } void rightMotor(int V) { //to samo co wyżej tylko dla prawego if (V > 0) { V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); analogWrite(R_PWM, V); } else { V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); analogWrite(R_PWM, V); } } void StopMotors() { //zatrzymanie silników analogWrite(L_PWM, 0); analogWrite(R_PWM, 0); } void sygnalizacjaBuzzer(int powtorzenia) { int i = 0; for (i = 0; i < powtorzenia; i++) { digitalWrite(BUZZER, HIGH); delay(200); digitalWrite(BUZZER, LOW); delay(200); } } void sygnalizacjaUruchomienia() { //sygnalizacja dźwiękowa startu int i = 0; for (i; i < 3; i++) { digitalWrite(BUZZER, HIGH); delay(200); digitalWrite(BUZZER, LOW); delay(200); } } int zmierzOdlegosc() //funkcja dla mierzenia odległości przez czujnik SC { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } void TrybJazdy() { //funckja odpowidzialna za zmianę trybu jazdy if (rc5.read(&toggle, &address, &command)) { switch(command) { case 56: ZmianaTrybu = !ZmianaTrybu; StopMotors(); sygnalizacjaUruchomienia(); break; } } } oraz krótki film z działania:
  2. Kolejna część kursu zakończona. Podobnie jak kolega @leepa79 również wykorzystałem krańcówki oraz czujnik HC-SR04. Z tym, że u mnie krańcówki wykrywają przeszkody przed robotem, a HC-SR04 pomaga nie wjechał w przeszkody tyłem. Tutaj kod: #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR 12 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define BUZZER 10 #define DIODA 13 #define ROZNICA_MIN -400 #define ROZNICA_MAX 400 #define trigPin 8 #define echoPin 7 bool START = false; //zmienna dla procedury startu void setup() { //konfiguracja pinów mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(DIODA, OUTPUT); pinMode(L_SIDE_SENSOR, INPUT_PULLUP); //koniguracja pinu jak przyckiski pinMode(R_SIDE_SENSOR, INPUT_PULLUP); randomSeed(analogRead(5)); //inicjalizacja generatora liczb losowych //konfigutacja pozostałych elementów pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //wyłączenie buzzera digitalWrite(DIODA, LOW); //wylaczenie diody pinMode(trigPin, OUTPUT); //Deklaracja pinów dla czujnika zbliżeniowego pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); //odczytanie wartości z lewego czujnika int odczytPrawy = analogRead(R_LIGHT_SENSOR); //odczytanie wartości z prawego czujnika int roznica = odczytLewy - odczytPrawy; int los = random(5, 40) * 10; //wylosowanie liczby dla czasu obrotu int randomSpeed = random(2, 6) * 10; //wylosowanie predkosci jazdy do przodu if (roznica < ROZNICA_MIN) { //ewentualna korekcja skrajnych warotści róznic roznica = ROZNICA_MIN; } else if (roznica > ROZNICA_MAX) { roznica = ROZNICA_MAX; } int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -40, 40); //zmienna pozawalająca przeliczenie odczytów z czuników na zmianę prędkości silnikó if (START == true) { //sprawdzenie warunku dla procedury staru leftMotor(30+zmianaPredkosci); //korekty prędkości zależnie od natężenia światła rightMotor(30-zmianaPredkosci); if (digitalRead(L_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po lewej stronie int odleglosc = zmierzOdlegosc(); //zmienna odczytująca dystans z czujnika US if (odleglosc > 30) //jeśli odległość jest większa niż 30 cm to robot zdąży wykonać pełny zadany ruch { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) //jeśli odległość mniejsza niż 30 cm sprawdzanie kolejnych odległości do momentu osiągnięcia wartości 8 cm { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); //zamiana wartości odległości delay(50); } } //obrót w miejscu w prawo leftMotor(randomSpeed); rightMotor(-randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po prawej stronie //jedź wstecz i wydawaj dźwięk int odleglosc = zmierzOdlegosc(); //powtarzamy co w poprzednim warunku if (odleglosc > 30) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); delay(50); } } //obrót w miejscu w lewo leftMotor(-randomSpeed); rightMotor(randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } } else if (odczytPrawy < 50) { //procedura startu po mocnym naświetleniu prawego czujnika START = !START; sygnalizacjaUruchomienia(); //wywołanie funkcji sygnalizującej uruchomienie BUZZEREM } else { //miganie diody sygnalizującej gotowość do startu MiganieNaGotowosc(); //wywołanie funkcji migającej diodą gotowości } } void leftMotor(int V) { //funkcja odpowiedzialna za sterowanie lewym silnikiem if (V > 0) { //jeśli wartość prędkości więszka od 0 V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //do przodu analogWrite(L_PWM, V); //zadanie prędkości } else { V = abs(V); //wyciągnięcie wartości bezwzględnej V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //do tyłu analogWrite(L_PWM, V); //zadanie prędkości } } void rightMotor(int V) { //to samo co wyżej tylko dla prawego if (V > 0) { V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 0); analogWrite(R_PWM, V); } else { V = abs(V); V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); analogWrite(R_PWM, V); } } void StopMotors() { //zatrzymanie silników analogWrite(L_PWM, 0); analogWrite(R_PWM, 0); } int zmierzOdlegosc() //funkcja dla mierzenia odległości przez czujnik SC { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } void sygnalizacjaUruchomienia() { //sygnalizacja dźwiękowa startu int i = 0; for (i; i < 3; i++) { digitalWrite(BUZZER, HIGH); delay(200); digitalWrite(BUZZER, LOW); delay(200); } } void MiganieNaGotowosc() { //funkcja odpowiedzialna za miganie diodą gotowości digitalWrite(DIODA, HIGH); delay(100); digitalWrite(DIODA, LOW); delay(100); } A tutaj film:
  3. A może i lepiej ale teraz te kwarantanny i inne straszne rzeczy. Działam na tym co mam w domu. Ale uwaga słuszna, przy najbliższej wizycie w sklepie z elektroniką poszukam. A raczej na pewno taki moduł będzie dostępny więc dorzucę do koszyka.
  4. Napisałem swój własny kod do multipleksowania wyświetlacza. Zanim zacząłem korzystać z gotowej biblioteki. W tym przypadku zdecydowałem się na użycie gotowej biblioteki, żeby po prostu sprawdzić jak ona funkcjonuje. Jak będzie chwila czasu to wrócę do tego pomysłu, spróbuję użyć własnego kodu odpowiedzialnego na multipleksowanie ekranu. W jaki sposób mogę zmierzyć czas dokonania pomiaru? Koniecznie muszę się zagłębić w ten przykład z biblioteki, który powoduje, że pomiar jest nieblokujący. W zasadzie to w całą zawartość tej biblioteki bo wydaję się niezwykle ciekawa. Nie ukrywam, że w wersji ostatecznej, wolałbym użyć wyświetlacz 7 segmentowy, ponieważ jest on mniejszy i bardziej czytelny z większej odległości niż wyświetlacz LCD. Chciałbym go też zintegrować z czujnikiem wilgotności, żeby na przykład po wciśnięciu odpowiedniego przycisku wyświetlacz pokazywał wartość wilgotności powietrza a nie temperaturę. Tylko czy jest to wykonalne, skoro z pokazaniem samej temperatury pojawiają się dość nieoczywiste problemy?
  5. W takim razie mea culpa. Źle zrozumiałem wpis na blogu. Dziękuję za uwagę. przeczytałem wpis na blogu raz jeszcze i teraz rozumiem. Na podstawie tego co napisałeś wynika, że kod @catalyst powinien działać, a mimo to nie działa. Bo przecież wskazuje przerwanie numer 0, a ono w przypadku UNO przypisane jest do pinu 2. Popraw mnie jeśli nie mam racji? Ja korzystam z funkcji digitalPinToInterrupt i za każdym razem przerwania działają u mnie jak należy.
  6. @Gieneq już sprawdziłem instrukcję obsługi mojego pieca. Jest tam przygotowana specjalna zworka, w którą należy się wpiąć i po prostu w momencie gdy temperatura spadnie później zadanej zamknąć obwód. To samo dzieje się gdy włączam go ręcznie za pomocą pokrętła umieszczonego na obudowie pieca. W ciągu kolejnych dni na pewno do układu dołożę jeszcze czujnik poziomu wilgotności, bo w zimie zdarza mi się mieć z nią problemy przez zbyt szczelne okna i chciałbym to też mieć pod kontrolą. A komentarzy tyle wstawiam również dla siebie. Wciąż jestem na etapie intensywnej nauki i symulatanicznie zajmuję się projektami "klasycznymi" jak i projektami pierwszych robotów/pojazdów sterowanych na różne sposoby. A tak jak mam wszystko zakomentowane to nie mam problemu żeby sobie przypomnieć co chciałem w danym miejscu uzyskać, nawet jeśli na obecną chwilę nie dziala to w 100% jakbym chciał. Na początku próbowałem zrealizować wyświetlanie temperatury na wyświetlaczu 7 segmentowym, jednak napotkałem problem z multipleksowaniem ekranów. Zaraz po uruchomieniu programu jest nawet ok, a potem częstotliwość odświeżania spada dramatycznie. Próbowałem tutaj wykorzystać bibliotekę SegSev. Wygląda tak jakby pomiar z cyfrowego czujnika temperatury trwał zbyt długo i ekran nie jest w stanie się tak szybko odświeżać. Mam rację czy coś innego jest tutaj problemem? Tutaj kod z tej próby: #include <SevSeg.h> //wczytanie niezbędnych bibliotek #include <OneWire.h> #include <DallasTemperature.h> #define czujnikTemp A5 //definicje pinów elementów #define przyciskMAX 2 #define przyciskMIN A0 SevSeg sevseg; //inicjacja wyświetalcza 7 seg OneWire oneWire(czujnikTemp); //wskazanie pinu czujnika temperatury DallasTemperature sensors(&oneWire); //przekazanie informacji do biblioteki void setup() { pinMode(przyciskMAX, INPUT_PULLUP); pinMode(przyciskMIN, INPUT_PULLUP); Serial.begin(9600); sensors.begin(); //inicjalizacja czujników byte numDigits = 2; //zdefiniowanie parametrów wyświetlacza 7 segmentowego byte digitPins[] = {9, 10}; byte segmentPins[] = {7, 5, 11, 4, 12, 8, 6}; bool resistorsOnSegments = true; // info, ze do segmentów podłączone są oporniki byte hardwareConfig = N_TRANSISTORS; //typ tranzystora sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments); } void loop() { sensors.requestTemperatures(); //pobranie temperatury z czujnika int temperaturaINT = sensors.getTempCByIndex(0); sevseg.setNumber(temperaturaINT, 2); //wyświetl temperaturę korzystająć z dwóch wyświetlaczy sevseg.refreshDisplay(); } i film z zachowania układu:
  7. @catalyst jeśli przycisk podłączony jest na Pinie 2 to czemu w kodzie usiłujesz wskazac PIN 0 jako ten odpowiedzialny za przerwanie? Zmień linijkę: attachInterrupt(0,alarm, FALLING); Na attachInterrupt(digitalPinToInterrupt(2), alarm, FALLING) Czemu nie korzystasz z funkcji digitalPinToInterrupt? Odpowiada ona za dobranie odpowiedniego pinu przerwań zależnie od płytki. Wtedy taki kod zadziała na każdym rodzaju płytki.
  8. Cześć, Wrzucam swoje rozwiązanie, tj termometr pokojowy z wyświetlaczem LCD oraz wskaźnikiem LED bazujący na cyfrowym czujniku temperatury. Wskazuje aktualną temperaturę, opcję pokazania najniższej i najwyżej odnotowanej temperatury oraz opcję włączenia/wyłączenia wskaźnika RGB LED - tak aby móc zostawić cały układ włączony na noc. Oczywiście w układzie są też dwa potencjometry - jeden do sterowania jasnością LCD (lub całkowitym wyłączeniem podświetlenia na noc) oraz drugi do manipulacji kontrastem. Docelowo chciałbym czegoś takiego użyć wraz z jakimś protokołem komunikacji bezprzewodowej i zrobić małą centralkę do sterowania włączaniem/wyłączeniem pieca gazowego w zależności od aktualnej temperatury w pokoju. W zasadzie to był główny powód mojego zainteresowanie arduino, po tym jak zobaczyłem ile kosztują takie centralki "gotowce" w sklepach. Wskaźnik LED dopasowany do temperatur jakie panują u mnie w pokoju, bo i tak jest wpięte na stałe na zasilacz i raczej nie będzie służył do pomiarów bardzo niskich czy wysokich temperatur. KOD: #include <Adafruit_NeoPixel.h> //zaimplementowanie bibliotek #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> #define czujnikTemp A5 //definicje elementów #define przyciskMAX 2 #define przyciskMIN 3 #define przyciskRESET A4 #define przyciskOnOffWskaznik A2 #define LedRGB A3 LiquidCrystal lcd(4, 5, 6, 7, 8, 9); //informacja o pinach wyświetlacza OneWire oneWire(czujnikTemp); //wskazanie pinu dla czujnika temperatury DallasTemperature sensors(&oneWire); //przekazanie informacji do biblioteki Adafruit_NeoPixel wskaznik = Adafruit_NeoPixel(8, A3, NEO_GRB + NEO_KHZ800); //zdefiniowanie nowego elementu RGB float tempMAX = 0; //aktualna temperatura maksymalna float tempMIN = 0; //aktualna temperatura minimalna bool wskaznikOnOff = false; //zmienna dla włączenia lub wyłączenia linijki void setup() { pinMode(przyciskMAX, INPUT_PULLUP); //zdefiniowanie pinów pinMode(przyciskMIN, INPUT_PULLUP); pinMode(przyciskRESET, INPUT_PULLUP); pinMode(przyciskOnOffWskaznik, INPUT_PULLUP); lcd.begin(16, 2); //inicjalizacja wyświetlacza LCD lcd.setCursor(0, 0); //ustawienie kursora sensors.begin(); //inicjalizacja czujników wskaznik.begin(); //inicjalizacja paska LED wskaznik.show(); tempMAX = sensors.getTempCByIndex(0); //wczytanie temperatury maksymalnej tempMIN = sensors.getTempCByIndex(0); //wczytanie temperatury minialnej } void loop() { sensors.requestTemperatures(); //pobranie temperatury z czujnika float temperatura = sensors.getTempCByIndex(0); //odczytanie temperatury dla LCD int tempINT = sensors.getTempCByIndex(0); //odczytanie temperatury dla paska LED if (temperatura > tempMAX) { //sprawdzenie czy aktualna temperatura jest większa od poprzedniej max i ustawieenie nwowego max tempMAX = temperatura; } if (temperatura < tempMIN) { //sprawdzebnie czy aktualna temperatura jest mniejsza od poprdzeniej i ustawienie noweg min tempMIN = temperatura; } if (digitalRead(przyciskMAX) == LOW) { //jeśli przycisk MAX wciśnięty //jeśli przycisk max wciśnięty MAXtemp(); //wywołanie funkcji pokazującej wartość max na LCD } else if (digitalRead(przyciskMIN) == LOW) { //jeżeli przycisk min wciśnięty //jeśli przycisk wciśniety MINtemp(); //wywołanie funkcji pokazującej wartości min na LCD } else if (digitalRead(przyciskRESET) == LOW) { //jeżeli przycisk RESET wciśnięty resetMaxMin(); //wywołanie funkcji wczytującej na nowo wartości MAX i MIN } if (digitalRead(przyciskOnOffWskaznik) == LOW) { //jeżeli przycisk OnOff wciśnięty wskaznikOnOff = !wskaznikOnOff; //zmiana wartości logicznej zmiennej if (wskaznikOnOff == true) { wskaznikON(); //wywołanie funkcji włączającej pasek LED } else { wskaznikOFF(); //wywołanie funkkcji wyłączającej pasek LED } } wskaznikRGB(tempINT); //wywołanie funkcji zapalającej odopwiednią ilość diod aktualnaTemp(); //wywołanie funkcji wyświetlającej wartość temperatury na LCD } void MAXtemp() { //funkcja odpowiedzalna za wyświetelenie wartości MAX na LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print("Max: " + String(tempMAX) + "*C"); delay(5000); } void MINtemp() { //to samo co wyżej tylko MIN lcd.clear(); lcd.setCursor(0, 0); lcd.print("Min: " + String(tempMIN) + "*C"); delay(5000); } void resetMaxMin() { //funkcja odpowiedzialna za reset wartosci MAX i MIN lcd.clear(); lcd.setCursor(0, 0); lcd.print("Min i max reset!"); tempMAX = sensors.getTempCByIndex(0); tempMIN = sensors.getTempCByIndex(0); delay(3000); } void aktualnaTemp() { //funkcja odpowiedzialna na wyświetelenie aktualnej temperatury na LCD sensors.requestTemperatures(); float temperatura = sensors.getTempCByIndex(0); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp: " + String(temperatura) + "*C"); delay(2000); } void wskaznikRGB (int temperatura) { //funkcja odpowiedzialna na podświetlenie odpowiedniej ilosci diod na pasku LED if (wskaznikOnOff == true) { wskaznik.clear(); if (temperatura >= 0) { temperatura = map(temperatura, 17, 30, 1, 8); int i = 0; for (i = 0; i < temperatura; i++) { wskaznik.setPixelColor(i, wskaznik.Color(10, 0, 0)); } } wskaznik.show(); } else { wskaznik.clear(); wskaznik.show(); } } void wskaznikON() { //funkcja odpowiedzialna za wyświetelenie info o włączeniu paska LED lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wskaznik RGB-ON"); delay(2000); } void wskaznikOFF() { //to samo co wyżej tylko o wyłączeniu lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wskaznik RGB-OFF"); delay(2000); } Oraz film z podstawowych funkcji:
  9. a ja trochę z innej parafii. Nie wrzucam prac domowych, bo jest ich sporo Uparłem się, że zrobię sobie wpisywanie cyfr z komputera i mam. W tym celu skorzystałem z przerwania realizowanego przez przycisk. Podczas przerwania, realizowana jest funkcja restartująca software'owo całą płytkę. Jeśli chodzi o funkcję resetującą arduino to dopiero staram się zgłębić jej działanie. Póki co wiem, że działa. Teoretycznie mógłbym korzystać z przycisku wbudowanego w płytkę ale jak rozumiem to jest pełny restart hardware'owy. Trwa on sporo dłużej no i dodatkowo chciałem sprawdzić działanie funkcji restartującej w razie jakbym kiedyś potrzebował sobie wyprowadzić taki element restartujący w momencie gdy sama płytka będzie gdzieś na przykład schowana. Dodatkowo po wpisaniu na przykład litery zamiast cyfry wyświetlacz pokazuje komunikat o błędzie (3 poziome kreski). Kod: #define SEG_C 11 #define SEG_E 12 #define SEG_D 4 #define SEG_B 5 #define SEG_G 6 #define SEG_A 7 #define SEG_F 8 #define WYSW_1 9 #define WYSW_2 10 #define PRZYCISK 2 int cyfra1 = 0; //zmienne dla wyświetlacza int cyfra2 = 0; void setup() { //konfiguracja pinów jako wyjścia pinMode(SEG_A, OUTPUT); pinMode(SEG_B, OUTPUT); pinMode(SEG_C, OUTPUT); pinMode(SEG_D, OUTPUT); pinMode(SEG_E, OUTPUT); pinMode(SEG_F, OUTPUT); pinMode(SEG_G, OUTPUT); pinMode(WYSW_1, OUTPUT); pinMode(WYSW_2, OUTPUT); pinMode(PRZYCISK, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(PRZYCISK), RESET, RISING); //przerwanie Serial.begin(9600); //rozpoczęście komunikacji z PC Serial.println("Podaj pierwszą cyfrę!"); //komunikat dla użytkownika while (Serial.available() == 0) { delay(50); //zatrzymanie programu } if (Serial.available() >0) { //zapisanie podanej liczby do zmiennej cyfra1 = Serial.read(); } Serial.println("Podaj drugą cyfrę!"); //komunikat dla użytkownika while (Serial.available() == 0) { delay(50); } if (Serial.available() >0) { //zapisanie podnej liczny do zmiennej cyfra2 = Serial.read(); } } void loop() { digitalWrite(WYSW_1, HIGH); //multipleksowanie - zapalenie jednej cyfry digitalWrite(WYSW_2, LOW); wyswietlacz(cyfra1); delay(10); wyswietlacz(cyfra2); digitalWrite(WYSW_2, HIGH); //multipleksowanie - zapalanie drugiej cyfry digitalWrite(WYSW_1,LOW); delay(10); } void wyswietlacz(int cyfra) { //w zaleznosci od podanej cyfry switch (cyfra) { case '0': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, LOW); break; case '1': digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); break; case '2': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, HIGH); break; case '3': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, HIGH); break; case '4': digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); break; case '5': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); break; case '6': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); break; case '7': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); break; case '8': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); break; case '9': digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, HIGH); break; default: digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, HIGH); break; } } void RESET() { //funckja odpowiadająca za restart arduino digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); asm volatile (" jmp 0"); } Film:
  10. Można. Ja często nie odpinam zasilania od Arduino jak wgrywam kolejna wersję kodu po USB. Nie powinno się zostawiać np samego usb w momencie jak w układzie masz elementy wymagające stosunkowo dużego prądu, na przykład serwomechanizm wlaśnie. Warto wtedy odłączyć jeden z przewodów dochodzący do serwa.
  11. Hej. Przyznam, ze nie czytałem poprzednich postów a pewnie dużo już takich robotów było, ale wrzucam i swojego pierwszego :). Dołożyłem z tyłu HC-R04 w celu uniknięcia taranowania przeszkód tyłem. Najpierw sprawdziłem na jakiej odległości robot jest w stanie wykonać ruch bez korzystania z czujnika HC-R04 a następnie dodałem kolejne warunki odpowiadające za mniejszą odległość. Użyłem też losowych wartości prędkości jazdy wprzód i obrotu. Całość w kodzie i na filmie . Tor jest celowo taki mały, bo był "zbudowany" do testów czujnika ultradźwiękowego. Jako, ze teraz czasu jest całkiem sporo to w planach mam dołożenie jeszcze kilku elementów, na przykład potencjometrów do sterowania bazowym czasem obrotu, czy prędkością jazdy. KOD: #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define L_SIDE_SENSOR A0 #define R_SIDE_SENSOR A1 #define BUZZER 10 #define trigPin 8 #define echoPin 7 void setup() { //konfiguracja pinów dla mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(L_SIDE_SENSOR, INPUT_PULLUP); //koniguracja pinu jak przyckiski pinMode(R_SIDE_SENSOR, INPUT_PULLUP); pinMode(BUZZER, OUTPUT); //definicja pinów i stanu dla buzzera digitalWrite(BUZZER, 0); randomSeed(analogRead(5)); //inicjalizacja generatora liczb losowych pinMode(trigPin, OUTPUT); //Deklaracja pinów dla czujnika zbliżeniowego pinMode(echoPin, INPUT); } void loop() { int los = random(5, 40) * 10; //wylosowanie liczby dla czasu obrotu int randomSpeed = random(2, 6) * 10; //wylosowanie predkosci jazdy do przodu //jedź do przodu leftMotor(randomSpeed); rightMotor(randomSpeed); if (digitalRead(L_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po lewej stronie int odleglosc = zmierzOdlegosc(); //zmienna odczytująca dystans z czujnika US if (odleglosc > 30) //jeśli odległość jest większa niż 30 cm to robot zdąży wykonać pełny zadany ruch { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) //jeśli odległość mniejsza niż 30 cm sprawdzanie kolejnych odległości do momentu osiągnięcia wartości 8 cm { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); //zamiana wartości odległości delay(50); } } //obrót w miejscu w prawo leftMotor(randomSpeed); rightMotor(-randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW) { //jeśli przeszkoda zostanie wykryta po prawej stronie //jedź wstecz i wydawaj dźwięk int odleglosc = zmierzOdlegosc(); //powtarzamy co w poprzednim warunku if (odleglosc > 30) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(1000); } else { while (odleglosc > 8) { leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); odleglosc = zmierzOdlegosc(); delay(50); } } //obrót w miejscu w lewo leftMotor(-randomSpeed); rightMotor(randomSpeed); digitalWrite(BUZZER, 0); delay(150 + los); //koniec warunku, wracamy do jazdy prosto } } void leftMotor(int V) { if (V > 0) { //jesli predkosc jest wieksza od 0 (dodatnia V = map(V, 0, 100, 0, PWM_MAX); //mapowanie wartosci predkosc w stosunku do PWM MAX digitalWrite(L_DIR, 0); //ustawienie kierunku analogWrite(L_PWM, V); //ustawienie predkosci } else { V = abs(V); //pobranie wartosci bezwzglednej podanej predkosci V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //ustawienie kierunku analogWrite(L_PWM, V); //ustawienie predkosci } } void rightMotor(int V) { if (V > 0) { //jesli predkosc jest wieksza od 0 (dodatnia V = map(V, 0, 100, 0, PWM_MAX); //mapowanie wartosci predkosc w stosunku do PWM MAX digitalWrite(R_DIR, 0); //ustawienie kierunku analogWrite(R_PWM, V); //ustawienie predkosci } else { V = abs(V); //pobranie wartosci bezwzglednej podanej predkosci V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //ustawienie kierunku analogWrite(R_PWM, V); //ustawienie predkosci } } void stopMotors() //funkcja dla zatrzymania robota (niewykorzystana) { analogWrite(L_PWM, 0); //wylaczenie silnika lewego analogWrite(R_PWM, 0); //wylaczenie silnika prawego } int zmierzOdlegosc() //funkcja dla mierzenia odległości przez czujnik SC { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; }
  12. Cześć, W ramach tej części kursu zaimplementowałem sobie mały alarm w szafce w biurku. Do układu wmontowany jest też czujnik PIR, jest też wpisany dla niego kod, lecz w tym przypadku nie jest on wykorzystywany. Taka specyfika szafki, że zanim wykryje ruch, wykryje otwarcie. Ale w kodzie sobie to zostawiłem bo chciałem, żeby układ był bardziej uniwersalny. tutaj kod: #define BUZZER 11 #define KONTAKTRON 10 #define PIR 1 #define listwaLED A0 #include <Keypad.h> //biblioteka klawiatury #include <Adafruit_NeoPixel.h> //bibioteka dla listwy led const byte ROWS = 4; //ile mamy wierszy const byte COLS = 4; //ile mamy kolumn byte rowPins[ROWS] = { 5, 4, 3, 2 }; //piny wierszy byte colPins[COLS] = { 6, 7, 8, 9 }; // piny kolumn int pinAlarmuPozycja = 1; //zmienne dla wpisywania pinu char pinCyfra1 = '1'; char pinCyfra2 = '2'; char pinCyfra3 = '3'; char pinCyfra4 = '4'; int ileCzasuMinelo = 0; //zmienna pomocnicza do odliczania czasu char keys[ROWS][COLS] = { //mapowanie klawiatury {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; Keypad klawiatura = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //inicjalizacja klawiatury Adafruit_NeoPixel listwa = Adafruit_NeoPixel(8, listwaLED, NEO_GRB + NEO_KHZ800); //konfiguracja listwy LED volatile int stanAlarmu = 1; //zmiennna mówiąca o aktualnym stanie alarmu void setup() { pinMode(BUZZER, OUTPUT); //konfiguracja pinów pinMode(KONTAKTRON, INPUT_PULLUP); pinMode(PIR, INPUT_PULLUP); listwa.begin(); listwa.show(); } void loop() { char klawisz = 0; //zmienna do przetrzymania znakow z klawiatury int i = 0; //zmienna pocnicza dla pętli switch (stanAlarmu) { //wykonywanie akcji odpowiedniej dla stanu alarmu case 1: //czuwanie listwa.clear(); listwa.setPixelColor(0, listwa.Color(0, 15, 0)); //dioda numer 1 świeci na zielono listwa.show(); klawisz = klawiatura.getKey(); if (klawisz == 'A') { //czy uzbroić alarm? for (i = 1; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(0, 0, 15)); //dioda i świeci na niebiesko listwa.show(); BuzzerPikniecie(); delay(710); } for (i = 1; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(15, 0, 0)); //dioda i świeci na czerwono listwa.show(); BuzzerPikniecie(); delay(710); } BuzzerPikniecie(); BuzzerPikniecie(); wylaczDiody(); //wylaczenie wszystkich diod stanAlarmu = 2; //zmiana stanu alarmu } break; case 2: //monitorowanie listwa.setPixelColor(7, listwa.Color(15, 0, 0)); //dioda numer 8 miga na czerwono listwa.show(); delay(50); listwa.setPixelColor(7, listwa.Color(0, 0, 0)); listwa.show(); delay(50); if (digitalRead(PIR) == HIGH) { stanAlarmu = 4; //natymiastowe wlaczenie alarmu } else if (digitalRead(KONTAKTRON) == HIGH) { //szansa na rozbrojenie ileCzasuMinelo = 0; //zerownie zmiennej stanAlarmu = 3; } break; case 3: //Rozbrajanie klawisz = klawiatura.getKey(); if (klawisz) { //Czy kolejna podana cyfra jest poprawna? if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) { //Jesli sprawdzamy 1 pozycje PINu pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna BuzzerPikniecie(); } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) { //Jesli sprawdzamy 2 pozycje PINu pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna BuzzerPikniecie(); } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) { //Jesli sprawdzamy 3 pozycje PINu pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna BuzzerPikniecie(); } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) { //Jesli sprawdzamy 4 pozycje PINu BuzzerPikniecie(); BuzzerPikniecie(); BuzzerPikniecie(); stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie } else { stanAlarmu = 4; //Blad w kodzie PIN - wlacz alarm pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie } } delay(50); ileCzasuMinelo++; //odliczanie czasu na wpisanie kodu if (ileCzasuMinelo <= 15) { for (i = 0; i < 2; i++) { listwa.setPixelColor(i, listwa.Color(0, 20, 0)); } listwa.show(); } else if (ileCzasuMinelo > 15 && ileCzasuMinelo <= 30) { for (i = 2; i < 4; i++) { listwa.setPixelColor(i, listwa.Color(20, 20, 0)); } listwa.show(); } else if (ileCzasuMinelo > 30 && ileCzasuMinelo <= 45) { for (i = 4; i < 6; i++) { listwa.setPixelColor(i, listwa.Color(20, 20, 0)); } listwa.show(); } else if (ileCzasuMinelo > 45 && ileCzasuMinelo <= 60) { for (i = 6; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(20, 0, 0)); } listwa.show(); } else { stanAlarmu = 4; } break; case 4: //sygnalizacja alarmu for (i = 0; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(255, 0, 0)); } listwa.show(); delay(100); for (i = 0; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(0, 0, 255)); } listwa.show(); BuzzerAlarm(); delay(100); klawisz = klawiatura.getKey(); if (klawisz == 'D') { noTone(BUZZER); stanAlarmu = 1; } break; } } void wylaczDiody() { //funkcja służąca do wyłączenia diod int i = 0; for (i = 0; i < 8; i++) { listwa.setPixelColor(i, listwa.Color(0, 0, 0)); } listwa.show(); } void BuzzerPikniecie() { tone(BUZZER, 600); delay(50); noTone(BUZZER); } void BuzzerAlarm() { tone(BUZZER, 2000); delay(30); tone(BUZZER, 1500); } I krótki film:
  13. Hej. Super cześć kursu. Kodów do prac domowych nie wrzucam, bo opierają się one na zmianach pojedynczych wartości. Jednak chciałbym się odnieść do posta @husadam5. U mnie było podobnie. Gdy pisałem 2 dni temu kody na użycie kontraktronu i wpięty był w pin RX (0) nie było żadnych problemów. Usiadłem dziś znów, pogrzebałem trochę w kodach i przywitał mnie błąd: stk500_getsync() attempt 1 of 10: not in sync: resp=0x3f. Już miałem obawę, że w jakiś sposób uszkodziłem płytkę. Podłączyłem drugie UNO, które mam na stanie i błąd ten sam, więc tą opcję wykluczyłem. Poszukałem trochę w internecie i znalazłem informację, że taki błąd powstaje podczas gdy mamy coś wpięte w piny 0 lub 1. Przepięcie kontraktronu w inny pin rozwiązało problem. Jednak w internecie nie piszą dlaczego tak się dzieje. Znacie odpowiedź dlaczego tak się dzieje?
  14. Ruszam z druga częścią kursu :). Lubie jak projekty są w jakimś stopniu interaktywne. Zatem użyłem dwóch potencjometrów do manipulowania wartościami dwóch kolorów. Wartość trzeciego koloru manipulowana jest z wykorzystaniem fotorezystora aby nadać "trochę przypadkowości". Dodałem tez dwa przyciski, jeden pozwala zmienić tryb świecenia - stałe vs zapalnie kolejnych Ledów po kolei. Drugi z przycisków ma swoje zastosowanie w trybie "stałym". Z jego wykorzystaniem możemy zmienić ilość zapalonych diod. Poniżej kod i film z działania układu. #include <Adafruit_NeoPixel.h> //dołączenie bilioteki dla paska LED #define fotorezystor A1 //definicje dla komponentów #define potencjometr1 A5 #define potencjometr2 A4 #define przyciskTrybu 2 #define przyciskIlosci 3 boolean tryb = false; //zmienna określająca aktualny tryb pracy int fotorezystorW; //zmienna dla fotorezystora int potencjometr1W; //zmienne dla potencjometrow int potencjometr2W; int kolor1; //zmienna dla koloru pierwszego int kolor2; //zmienna dla koloru drugiego int kolor3; //zmienna dla koloru trzeciego int ilosc = 8; //ide diod ma sie świecić //konfiguracja linijkki Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800); void setup() { pinMode(przyciskTrybu, INPUT_PULLUP); //zdefiniowanie piny dla przycisku trybu pinMode(przyciskIlosci, INPUT_PULLUP); //zdefioniowanie pinu dla przycisku linijka.begin(); //Inicjalizacja paska LED linijka.show(); } void loop() { if (ilosc <= 8 && ilosc >= 0) { //sprawdzenie czy wartosc ilosci diod miescie sie w zakresie wczytanieKolorow(); //wywołanie funkcji wczytującej kolory z ADC if (tryb == true) { //sprawdzenie, którego trybu chcemy użyć kilkaNaRaz(ilosc); //wywołanie funkcji kilku diod świecących na raz zmianaIlosci(); //wywołanie funkcji dla zmiany ilości diod } else { wszystkiePoKolei(); //wywołanie funkcji dla kolejno zapalających się diod } } else { //gdy ilosc wyjscie z zakresu ilosc = 8; } zmianaTrybu(); //wywołanie funkcji pozwalającej na zmianę trybu } void wczytanieKolorow() { //funkcja wczytująca kolotry z ADC potencjometr1W = analogRead(potencjometr1); potencjometr2W = analogRead(potencjometr2); fotorezystorW = analogRead(fotorezystor); kolor1 = map(potencjometr1W, 0, 1024, 0, 255); kolor1 = constrain(kolor1, 0, 255); kolor3 = map(fotorezystorW, 0, 1024, 0, 255); kolor3 = constrain(kolor3, 0, 255); kolor2 = map(potencjometr2W, 0, 1024, 0, 255); kolor2 = constrain(kolor2, 0, 255); } void kilkaNaRaz(int ile) { //funkcja zapewniająca świecene kilku diod jednocześnie int i = 0; for (i = 0; i < ile; i++) { linijka.setPixelColor(i, kolor1, kolor2, kolor3); } linijka.show(); delay(200); linijka.clear(); } void wszystkiePoKolei() {//funkcja zapewniająca zapalanie diod po kolei int i = 0; for (i = 0; i < 8; i++) { linijka.setPixelColor(i, kolor1, kolor2, kolor3); linijka.show(); delay(200); } linijka.clear(); } void zmianaTrybu() { //funkcja zapewniajaca zmianę trybu while (digitalRead(przyciskTrybu) == LOW) { tryb = !tryb; delay(1500); } } void zmianaIlosci() { //funkcja zapewniające zmianę ilości świecących diod while (digitalRead(przyciskIlosci) == LOW) { ilosc--; delay(1500); } }
  15. Pogrzebałem trochę, przeszedłem z funkcji switch case na zwykłe funkcje warunkowe if i o dziwo działa bez problemu. Wygląda tak jakby nie podwójne zagnieżdżanie odczytywania znaków było problemem. W wolnej chwili postaram się wrócić do switch case i naprawić kod tak aby działał poprawnie. Póki co prace domowe: 9.1. Obliczanie pola powierzchni wybranej figury String figura = ""; //odczytanie jaka figure chcemy wyliczyc String dlugoscBoku1 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku1INT = 0; //zmienan dla dlugosic boku INT String dlugoscBoku2 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku2INT = 0; //zmienan dla dlugosic boku INT String promien = ""; //zmienna dla promienia podana int promienINT = 0; //zmienna dla promienia String wysokosc = ""; //zmienan dla wysokosci podana int wysokoscINT = 0; //zmienna dla wysokosci void setup() { Serial.begin(9600); //rozpoczecie komunikacji z pc } void loop() { Serial.println("Pole jakiej figury checsz obliczyc? Prostokąt - p, Koło - k, Trójkąt - t"); //zapytanie jaka figure chcemy obliczyc czekaj(); if (Serial.available() > 0) { //jesli uzytkownik podal cos z klawiatury figura = Serial.readStringUntil('\n'); } if (figura == "k") { //jesli wybieramy koło Serial.println("Podaj długość promienia."); //prosimy użytkownika o podanie długości promienia czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika promien = Serial.readStringUntil('\n'); promienINT = promien.toInt(); } double poleKolo = kolo(promienINT); //obliczenie pola za pomocą funkcji Serial.println("Pole twojego koła to: " + String(poleKolo) + " [mm^2]"); } else if (figura == "p") { //jesli wybieramy prostokąt Serial.println("Podaj długość pierwszego boku."); //prosimy o podanie długości pierwszego boku czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika dlugoscBoku1 = Serial.readStringUntil('\n'); dlugoscBoku1INT = dlugoscBoku1.toInt(); } Serial.println("Podaj długość drugiego boku."); czekaj(); if (Serial.available() > 0) { //odczytanie wartosci podanej przez użytkownika dlugoscBoku2 = Serial.readStringUntil('\n'); dlugoscBoku2INT = dlugoscBoku2.toInt(); } int poleProstokat = prostokat(dlugoscBoku1INT, dlugoscBoku2INT); //obliczenie pola za pomocą funkcji Serial.println("Pole twojego prostokąta to: " + String(poleProstokat) + " [mm^2]"); } else if (figura == "t") { //jesli wybieramy trójkąt Serial.println("Podaj wysokość."); //prosimy użytkownika o podanie wysokości czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika wysokosc = Serial.readStringUntil('\n'); wysokoscINT = wysokosc.toInt(); } Serial.println("Podaj dlugość podstawy."); czekaj(); if (Serial.available() > 0) { //odczytanie wartosci podanej przez użytkownika dlugoscBoku1 = Serial.readStringUntil('\n'); dlugoscBoku1INT = dlugoscBoku1.toInt(); } double poleTrojkat = trojkat(dlugoscBoku1INT, wysokoscINT); //obliczenie pola za pomoca funkcji Serial.println("Pole twojego trójkąta to: " + String(poleTrojkat) + " [mm^2]"); } else { Serial.println("Podałeś zły argument!"); } } int prostokat(int a, int b) { //funkcja odpowiedzialna za obliczanie pola kwardratu int poleProstokat = 0; poleProstokat = a * b; return poleProstokat; } double kolo(double r) { //funkcja odpowiedzialna za obliczanie pola kola double poleKolo = 0; poleKolo = 3.14 * r * r; return poleKolo; } double trojkat(double a, double h) { //funkcja odpowiedzialna za obliczanie pola trojkata double poleTrojkat = 0; poleTrojkat = 0.5 * a * h; return poleTrojkat; } void czekaj() { while (Serial.available() == 0) { delay(50); } } 9.2. program z funkcją umożliwiającą zdefiniowanie pinu, na którym znajduje się dioda, czas przez jaki dioda ma świeci, czas przez jaki dioda ma być wyłączona oraz ile razy sekwnencja ma się powtórzyć. void setup() { zamigajLED(3, 2000, 1000, 5); zamigajLED(13, 2000, 1000, 5); } void loop() { } void zamigajLED(int PIN, int czasWlaczenia, int czasWylaczenia, int ile) { pinMode(PIN, OUTPUT); //konfiguracja pinu wyjscia for (int a = 0; a < ile; a++) { digitalWrite(PIN, HIGH); // zapalenie diody delay(czasWlaczenia); //wlaczenie na okreslony czas digitalWrite(PIN, LOW); //wylaczenie diody delay(czasWylaczenia); //wylaczenie na okreslony czas } } 9.3. Tutaj zbudowałem sobie prosty czujnik parkowania. Użyłem tutaj również buzzera, którego częstotliwość pikania jest zależna od odległości w jakiej znajduje się przedmiot. #define czerwona1 3 #define czerwona2 2 #define zolta1 5 #define zolta2 4 #define zielona1 7 #define zielona2 6 #define buzzer 8 #define echo 11 #define trigger 12 void setup() { pinMode(czerwona1, OUTPUT); //deklaracja pinów dla ledów pinMode(czerwona2, OUTPUT); pinMode(zolta1, OUTPUT); pinMode(zolta2, OUTPUT); pinMode(zielona1, OUTPUT); pinMode(zielona2, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(echo, INPUT); pinMode(trigger, OUTPUT); Serial.begin(9600); //rozpoczęcie komunikacji z PC } void loop() { if (zmierzOdleglosc() > 60) { //jesli powyzej metra diod0(); //wywołaj funkcje diod0 } else if ((zmierzOdleglosc() <= 60) && (zmierzOdleglosc() > 50)) { //jesli odleglosc w pierwszym zakresie diod1(); } else if ((zmierzOdleglosc() <= 50) && (zmierzOdleglosc() > 40)) { //jesli odlegosc w drugim zakresie diod2(); } else if ((zmierzOdleglosc() <=40) && (zmierzOdleglosc() > 30)) { //jesli odlegloscw trzecim zakresie diod3(); } else if ((zmierzOdleglosc() <= 30) && (zmierzOdleglosc() > 20)) { //jesli odlegosc w czwartym zakresie diod4(); } else if ((zmierzOdleglosc() <= 20) && (zmierzOdleglosc() > 10)) { //jesli odlegosc w piatym zakresie diod5(); } else if (zmierzOdleglosc() <= 10) { //jeśli odległość w szóstym zakresie diod6(); } delay(100); } void pikanieBuzzera(int czas) { //funkcja odpowiedzialna za pikanie buzzera digitalWrite(buzzer, HIGH); delay(czas); digitalWrite(buzzer, LOW); delay(czas); } void diod0() { //wszystkie zgaszone digitalWrite(zielona1, LOW); digitalWrite(zielona2, LOW); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); } void diod1() { //jedna zielona digitalWrite(zielona1, HIGH); digitalWrite(zielona2, LOW); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); } void diod2() { //dwie zielone digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(1000); } void diod3() { //dwie zielone, jedna zolta digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(600); } void diod4() { //dwie zielone, dwie zolte digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(400); } void diod5() { //dwie zielone, dwie zolte, jedna czerwona digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, HIGH); digitalWrite(czerwona2, LOW); pikanieBuzzera(150); } void diod6() { //wszystkie digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, HIGH); digitalWrite(czerwona2, HIGH); digitalWrite(buzzer, HIGH); } int zmierzOdleglosc() { //funkcja do pomiaru odległosci long czas, dystans; //deklaracja zmiennych digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); czas = pulseIn(echo, HIGH); //odczytanie czasu potrzebnego na odbicie i powrot dźwięku dystans = czas / 58; //przeliczenie czasu na dystans return dystans; } Film z działania czujnika: Zestaw do drugiej części kursu już leży i czeka na swoją kolej
×
×
  • Utwórz nowe...