Skocz do zawartości

leepa79

Użytkownicy
  • Zawartość

    42
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

leepa79 wygrał w ostatnim dniu 4 stycznia 2017

leepa79 ma najbardziej lubianą zawartość!

Reputacja

6 Neutralna

O leepa79

  • Ranga
    3/10

Informacje

  • Płeć
    Mężczyzna
  1. Pesjar, To będzie trzeba inaczej zrobić Sam bym chciał wiedzieć jak. Może Treker nas naprowadzi na odpowiedni trop. Po wciśnięciu przycisku na pilocie (tego '56') wykona się instrukcja wewnątrz i na koniec napotka 'break' więc nie będzie to tak działało jak chcemy Zaciekawił mnie ten problem. Do tej pory instrukcji switch case używałem do raczej prostych zadań typu 'po wciśnięciu przycisku na pilocie --> jedź prosto' lub zapal lampkę i wykonaj jakiś odczyt jak np tu: case 144: //instrukcja dla listwy LED zwiekszanie if(jasnosc < 255) {jasnosc = jasnosc+51;} Serial.println(jasnosc); analogWrite(diodaPin, jasnosc); zamigajLED(); //funkcja kontrolki odbioru ekranDane(); //odczyt danych z czujnikow ekranLed(); //czasowe podswietlenie wyswietlacza break; A tutaj chcemy, żeby po wciśnięciu przycisku instrukcja wew działała w pętli. Da się tak w ogóle? A może da się odczytywać sygnały z pilota inaczej, np if'em? Pomoże ktoś znaleźć odpowiednie tory? Tak czy siak idę googlować, może coś wyszukam.
  2. Pesjar, W środowisku Arduino jest fajny 'trik' - jak klikniesz za nawiasem klamrowym to zobaczysz wyżej taki prostokąt i już wiesz gdzie się zaczyna i kończy dany blok. Bardzo pomocne na etapie działania 'kopiuj --> wklej' Sam jestem początkującym i też mi się zdarza tak działać...Co do Twojego kodu to na początku skasowałbym wszystko od 'case 56:' do ostatniego nawiasu klamrowego przed 'void leftMotor'. Przed 'void leftMotor' Powinny Ci zastać trzy nawiasy i zobacz czego każdy dotyczy (metodą z obrazka powyżej). Potem wróć do lekcji o odbiorniku IR (RC5) i ekspander I/O, serwo i zobacz jak to tam wyglądało (wskazówka - int zmierzOdleglosc() nie siedzi w void loop() ). Dla własnej nauki poprawiłem Twój kod, ale oczywiście nie zabiorę Ci tej przyjemności w zabawie i nie podam go na forum. A u mnie kod na takim etapie: #include "Adafruit_MCP23008.h" //Dodanie biblioteki Adafruit_MCP23008 ekspander; //Deklaracja "ekspandera" //adrs biblioteki https://github.com/adafruit/Adafruit-MCP23008-library //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 //Piny silnikow #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny krancowek #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR A0 #define BUZZER 10 //Pin buzzera //Pin czujnika swiatla #define LIGHT_SENSOR A1 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 //Oswietlenie miganie const int ledPin1 = 1; const int ledPin2 = 0; int stan = LOW; unsigned long previousMillis = 0; const long interval = 500; void setup() { ekspander.begin(); //Rozpoczęcie komunikacji na domyslnym adresie 0x20 //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Konfiguracja pinow od czujnikow pinMode(L_SIDE_SENSOR, INPUT_PULLUP); pinMode(R_SIDE_SENSOR, INPUT_PULLUP); //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); //Deklaracja pinów jako wyjscia (oswietlenie) ekspander.pinMode(2, OUTPUT); ekspander.pinMode(3, OUTPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); //Wylaczenie oswietlenia digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); ekspander.digitalWrite(2, 0); ekspander.digitalWrite(3, 0); } void loop() { //Zapalenie swiatel int odczyt = analogRead(LIGHT_SENSOR); if(odczyt < 950){ digitalWrite(ledPin1, 0); digitalWrite(ledPin2, 0); ekspander.digitalWrite(2, LOW); ekspander.digitalWrite(3, LOW); delay(100); }else{ light(); } //Krancowki if (digitalRead(L_SIDE_SENSOR) == LOW) { //Jesli przeszkoda po lewej stronie //Jedz do tylu i w prawo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(50); rightMotor(10); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW){ //Jesli przeszkoda po prawej stronie //Jedz do tylu w lewo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(10); rightMotor(50); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } //Czy wykryto przeszkode w zakresie 0-35 cm if (zmierzOdleglosc() > 35) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 35) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(350); //Obracaj w prawo przez 350 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 35) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(350); //Obracaj w lewo przez 350 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem delay(1000); leftMotor(35); //Obrot w miejscu o 180 st w prawo rightMotor(-35); delay(850); } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } int zmierzOdleglosc() { 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 leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu 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); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } void light(){ unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (stan == LOW) { stan = HIGH; } else { stan = LOW; } digitalWrite(ledPin1, stan); digitalWrite(ledPin2, !stan); ekspander.digitalWrite(2, 1); ekspander.digitalWrite(3, 1); } } Czyli próba zastosowania 'millis' dla migania diod z tyłu i ucieczka w sytuacji gdzie po lewej i po prawej przeszkoda poniżej 35 cm.
  3. Czujnik najszybszym sposobem - klej na gorąco No i oczywiście czekam na dodatkowe moduły - widziałem, że shield już w sprzedaży.
  4. I jak zwykle mój 'poszukiwacz' #include "Adafruit_MCP23008.h" //Dodanie biblioteki Adafruit_MCP23008 ekspander; //Deklaracja "ekspandera" //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 //Piny silnikow #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny krancowek #define L_SIDE_SENSOR A2 #define R_SIDE_SENSOR A0 #define BUZZER 10 //Pin buzzera //Pin czujnika swiatla #define LIGHT_SENSOR A1 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 void setup() { ekspander.begin(); //Rozpoczęcie komunikacji na domyslnym adresie 0x20 //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Konfiguracja pinow od czujnikow pinMode(L_SIDE_SENSOR, INPUT_PULLUP); pinMode(R_SIDE_SENSOR, INPUT_PULLUP); //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); //Deklaracja pinów jako wyjscia ekspander.pinMode(0, OUTPUT); ekspander.pinMode(1, OUTPUT); ekspander.pinMode(2, OUTPUT); ekspander.pinMode(3, OUTPUT); //Wylaczenie oswietlenia ekspander.digitalWrite(0, 0); ekspander.digitalWrite(1, 0); ekspander.digitalWrite(2, 0); ekspander.digitalWrite(3, 0); } void loop() { //Zapalenie swiatel int odczyt = analogRead(LIGHT_SENSOR); if(odczyt < 950){ ekspander.digitalWrite(0, LOW); ekspander.digitalWrite(1, LOW); ekspander.digitalWrite(2, LOW); ekspander.digitalWrite(3, LOW); delay(100); }else{ ekspander.digitalWrite(0, HIGH); ekspander.digitalWrite(1, HIGH); ekspander.digitalWrite(2, HIGH); ekspander.digitalWrite(3, HIGH); delay(100); } //Krancowki if (digitalRead(L_SIDE_SENSOR) == LOW) { //Jesli przeszkoda po lewej stronie //Jedz do tylu i w prawo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(50); rightMotor(10); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW){ //Jesli przeszkoda po prawej stronie //Jedz do tylu w lewo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(10); rightMotor(50); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } //Czy wykryto przeszkode w zakresie 0-35 cm if (zmierzOdleglosc() > 35) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 35) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(350); //Obracaj w prawo przez 350 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 35) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(350); //Obracaj w lewo przez 350 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } int zmierzOdleglosc() { 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 leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu 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); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } Do oświetlenia wykorzystane czujniki z fotorezystorami z kursu.
  5. robert10, pewnie już wcześniej instalowałeś biblioteki (we wcześniejszych lekcjach) więc powinno być ok. Próbowałeś jeszcze tego kroku: "Po ponownym uruchomieniu środowiska biblioteka będzie zainstalowana i gotowa do działania". I jeszcze taka porada. Ja zawsze dodaję tak biblioteki:
  6. No to ja zacznę: Lampa i pasek LED sterowany pilotem z odczytem temp i wilgotności. Kierując się tylko informacjami z kursów (tak jak już to wcześniej wspominałem) poskładałem coś takiego. Podpatrzyłem jedynie jak podłączyć moduł przekaźnika RM0. A więc mamy tu odbiornik podczerwieni z kursu elektroniki II #7, stabilizator napięcia z kursu elektroniki #8, wyświetlacz z kursu arduino #7, tranzystor BC547 (sterowanie paskiem LED) zastosowany w lekcjach elektroniki i arduino, tak samo jak LED i przyciski, czujnik DS18B20 oraz czujnik DHT11 z ostatnich lekcji arduinoII. Część z czujnikiem DS18B20 robiłem chwilę przed lekcją w ramach przygotowania i jest trochę inaczej niż w kursie (to będę dziś poprawiał). Kod w wersji wczesnej alfa cały czas modyfikowany - wczoraj przypisałem do przycisków włączanie i wyłączanie led i lampy tzn. włączanie i wyłączanie na jednym przycisku. Potem chcę coś zrobić z czasowym podświetleniem wyświetlacza (void ekranLed() ). Ten delay strasznie mrozi kod Zabawa jest super. Chciałem wykorzystać pilot z kursu budowy robotów, ale tam do jednego przycisku przypisane są dwa kody, a to trochę mi skomplikowało myśl - więc poczekam jeszcze na stosowną lekcję. No i kod - proszę nie krzyczeć - w wolnych chwilach poprawiam go //ODCZYT KODOW Z PILOTA //#include <IRremote.h> //#define irPin 11 //IRrecv irrecv(irPin); //decode_results results; // //void setup() { // Serial.begin(9600); // irrecv.enableIRIn(); //} // //void loop() { // if (irrecv.decode(&results)) { // Serial.print("0x"); // Serial.println(results.value, HEX); // delay(250); // irrecv.resume(); // } //} // Czytnik numerów seryjnych czujników DS18B20 // //#include <OneWire.h> // //// Numer pinu cyfrowego do którego podłaczyłęś czujniki //const byte ONEWIRE_PIN = 2; // //OneWire onewire(ONEWIRE_PIN); // //void setup() //{ // while(!Serial); // Serial.begin(9600); //} // //void loop() //{ // byte address[8]; // // onewire.reset_search(); // while(onewire.search(address)) // { // if (address[0] != 0x28) // continue; // // if (OneWire::crc8(address, 7) != address[7]) // { // Serial.println(F("Błędny adres, sprawdz polaczenia")); // break; // } // // for (byte i=0; i<8; i++) // { // Serial.print(F("0x")); // Serial.print(address[i], HEX); // // if (i < 7) // Serial.print(F(", ")); // } // Serial.println(); // } // // while(1); //} #include <IRremote.h> //Dolaczenie bibloteki dla scalonego odbiornika IR //https://github.com/shirriff/Arduino-IRremote/zipball/master #include <LiquidCrystal.h> //Dołączenie bilbioteki wyswietlacza #include <OneWire.h> //Bibloteki dla termometru #include <DS18B20.h> #include "DHT.h"//Biblioteka dla czujnika wilg / temp #define irPin 2 //pin odbiornika IR #define diodaPin 9 //pin listwy LED #define diodaPin1 8 //pin kontrolki odbioru z pilota #define lampa 7 //pin sterowania lampa (przekaźnik RM0) #define PodLed 12 //podswietlenie wyswietlacza #define ONEWIRE_PIN 13 //pin termometru #define przON A0 #define przOFF A1 #define DHT11_PIN A3 //Pin czujnika wilg / temp IRrecv irrecv(irPin); decode_results results; DHT dht; byte address[8] = {0x28, 0x5, 0xD2, 0x4B, 0x8, 0x0, 0x0, 0x79}; //adres termometru OneWire onewire(ONEWIRE_PIN); //nie mam pojecia co - dla termometru DS18B20 sensors(&onewire); LiquidCrystal lcd(3, 4, 5, 6, 10, 11); //Informacja o podłączeniu nowego wyświetlacza int jasnosc = 0; // zmienna dla jasnosi listwy LED int lampaStatus = LOW; int diodaStatus = LOW; int lampaStatus1 = LOW; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(diodaPin, OUTPUT); //deklaracja pinow wyjsciowych pinMode(diodaPin1, OUTPUT); pinMode(lampa, OUTPUT); pinMode (PodLed, OUTPUT); pinMode (przON, INPUT_PULLUP); pinMode (przOFF, INPUT_PULLUP); sensors.begin(); //znow cos dla termometru sensors.request(address); dht.setup(DHT11_PIN);//Czujnik wilgotnosci } void loop() { if (digitalRead(przON) == LOW) { //Jeśli przycisk wciśnięty lampaStatus = ~lampaStatus; digitalWrite(lampa, lampaStatus); //Włącz /wyłącz lampe delay(250); } if (digitalRead(przOFF) == LOW) { //Jeśli przycisk wciśnięty diodaStatus = ~diodaStatus; digitalWrite(diodaPin, diodaStatus); //Wyłącz /wyłącz ledy delay(250); } if (sensors.available()) { float temperature = sensors.readTemperature(address); Serial.print(temperature); Serial.println(F(" 'C")); sensors.request(address); } if (irrecv.decode(&results)) { switch (results.value) { case 0x6170807F: //instrukcja dla listwy LED zwiekszanie if(jasnosc < 255) {jasnosc = jasnosc+51;} Serial.println(jasnosc); analogWrite(diodaPin, jasnosc); zamigajLED(); //funkcja kontrolki odbioru ekranDane(); ekranLed(); break; case 0x617040BF: //instrukcja dla listwy LED zmniejszanie if(jasnosc > 0) {jasnosc = jasnosc-51;} Serial.println(jasnosc); analogWrite(diodaPin, jasnosc); zamigajLED(); ekranDane(); ekranLed(); break; case 0x617020DF: //instrukcja dla listwy LED pelny analogWrite(diodaPin, 255); zamigajLED(); break; case 0x6170A05F: //instrukcja dla listwy LED wylaczony analogWrite(diodaPin, 0); zamigajLED(); break; case 0x617048B7: //instrukcja dla lampy lampaStatus1 = ~lampaStatus1; digitalWrite(lampa, lampaStatus1); //Włącz lampe zamigajLED(); break; } irrecv.resume(); } } void zamigajLED() { //kontrolka odbioru pilota digitalWrite(diodaPin1, HIGH); //Włączenie diody delay(200); //Odczekanie 0,2 sekundy digitalWrite(diodaPin1, LOW); //Wyłączenie diody delay(200); //Odczekanie 0,2 sekundy } void ekranDane(){//Wyswietlenie 'danych' na ekranie delay (50); lcd.display(); lcd.begin(16, 2); //Deklaracja typu wyswietlacza lcd.clear(); //Wyczyszczenie wyswietlacza lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("LED: "); //Wyświetlenie tekstu lcd.print(jasnosc); //Wyświetlenie tekstu if (sensors.available() || (dht.getStatusString() == "OK")) { //Pobranie informacji o wilgotnosci int wilgotnosc = dht.getHumidity(); //Pobranie informacji o temperaturze int temperatura = dht.getTemperature(); float temperature = sensors.readTemperature(address); Serial.print(temperature); Serial.println(F(" 'C")); lcd.setCursor(0, 1); //Ustawienie kursora lcd.print("T1:"); //Wyświetlenie tekstu lcd.setCursor(3, 1); //Ustawienie kursora lcd.print(temperature); //Wyświetlenie tekstu lcd.setCursor(10, 0); //Ustawienie kursora lcd.print("W: "); lcd.setCursor(12, 0); lcd.print(wilgotnosc); lcd.setCursor(9, 1); //Ustawienie kursora lcd.print("T2:"); lcd.setCursor(12, 1); lcd.print(temperatura); sensors.request(address); } //Odczekanie wymaganego czasugo delay(dht.getMinimumSamplingPeriod()); } void ekranLed(){ //Podswietlenie ekranu (czasowe) digitalWrite (PodLed, HIGH); delay (3000); digitalWrite (PodLed, LOW); }
  7. Treker mam nadzieję, że choroba odpuściła jak nie to życzę szybkiego powrotu do zdrowia. Dałem dziś wycisk robotowi. Trasa z paneli, nierówna. Słabe oświetlenie, ale dał radę. Kod - wariant 3 - jedynie dostosowałem 'GRANICA' do panujących warunków. Przy prędkościach prawy/rewyMotor ponad (50) wyskakuje na takiej powierzchni z trasy. Myślę, że na równym podłożu i lepszym oświetleniu da radę więcej.
  8. Światłolub otrzymał dodatkowe 'oczy'. Czujnik odległości HC-SR04 i krańcówki z poprzedniej lekcji. #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define trigPin A4 #define echoPin A3 #define L_SIDE_SENSOR 7 #define R_SIDE_SENSOR A2 #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define BUZZER 10 #define LED 13 #define ROZNICA_MIN -300 #define ROZNICA_MAX 300 int bip = 0; //Zmienna na potrzeby 'bipania' void setup() { //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); //Konfiguracja pinów HC-SR04 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Konfiguracja pinow od czujnikow pinMode(L_SIDE_SENSOR, INPUT_PULLUP); pinMode(R_SIDE_SENSOR, INPUT_PULLUP); //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera pinMode(LED, OUTPUT); randomSeed(analogRead(5)); //Inicjalizacja generatora } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; migLed(); //Miganie diody przed jazda stopMotors(); while (odczytPrawy < 600 || odczytLewy < 600 ){//Kiedy mocniejsze swiatlo //Bipnij 3 razy if (bip < 3){ BUZZASTER(); bip++; }else{ int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; //Pomiar odleglosci long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; //W przod leftMotor(50); rightMotor(50); int los = random(5, 20) * 10; //Dodajemy losowo od 50 do 200 ms obrotu //Jesli przeszkoda if (dystans < 15) { stopMotors(); delay(150); leftMotor(-40); rightMotor(-40); delay(500); leftMotor(-35); rightMotor(35); delay(140+los); } if (digitalRead(L_SIDE_SENSOR) == LOW) { //Jesli przeszkoda po lewej stronie //Jedz do tylu i w prawo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(50); rightMotor(10); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (digitalRead(R_SIDE_SENSOR) == LOW){ //Jesli przeszkoda po prawej stronie //Jedz do tylu w lewo leftMotor(-40); rightMotor(-40); digitalWrite(BUZZER, 1); delay(700); leftMotor(10); rightMotor(50); digitalWrite(BUZZER, 0); delay(800); //Koniec warunku wracamy do jazdy prosto } if (roznica < ROZNICA_MIN) { //Jeśli roznica mniejsza od dopuszczalnej roznica = ROZNICA_MIN; //To ustaw najmniejszą dopuszczalną wartość } else if (roznica > ROZNICA_MAX) { //Jeśli różnica większa od dopuszczalnej roznica = ROZNICA_MAX; //To ustaw największą dopuszczalną wartość } //Przeliczenie odczytow z czujnikow na zmiane predkosci silnikow int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -45, 45); //Dodajemy lub odejmujemy wyliczoną zmianę od prędkosci bazowej leftMotor(30+zmianaPredkosci); rightMotor(30-zmianaPredkosci); } } } void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu 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); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } void migLed() { digitalWrite(LED, 1); delay(200); digitalWrite(LED, 0); delay(200); } void BUZZASTER() { digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); delay(500); } i film Teraz jest samodzielnym zwierzakiem
  9. To i ja wrzucę coś od siebie. Zadanie 7.1 widzę tak: #define LM35 A3 #define LM35_1 A2 void setup(){ Serial.begin(9600); } void loop(){ //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu float temperatura = ((analogRead(LM35) * 5.0) / 1023.0) * 100; float temperatura1 = ((analogRead(LM35_1) * 5.0) / 1023.0) * 100; float roznica = 0.0; if(temperatura - temperatura1 > 0){ roznica = temperatura - temperatura1; }else{ roznica = temperatura1 - temperatura; } //Wyslanie przez UART aktualnej temperatury Serial.print("Temp 1: "); Serial.print(temperatura); Serial.print("*C \t"); Serial.print("Temp 2: "); Serial.print(temperatura1); Serial.print("*C \t"); Serial.print("Roznica: "); Serial.print(roznica); Serial.println("*C"); delay(3000); } No i jeszcze termometr z funkcją MIN/MAX. Na płytce mam jeszcze wyświetlacz 7 seg z poprzedniej lekcji więc wykorzystałem go Millis to już mi po nocach się śni - strasznie słabo z przykładami w tym temacie po polskiej stronie internetów, a słabo się czegoś uczy nie znając eng od technicznej strony. No więc mamy kod - może komuś się przyda jakaś jego część: #include "SevSeg.h" SevSeg sevseg; //Instantiate a seven segment controller object #define LM35 A3 #define przMIN 9 #define przMAX 10 float tempMAX = 0; //Aktualna temperatura maksymalna float tempMIN = 150; //Aktualna temperatura minimalna int tempMAXI; int tempMINI; void setup(){ Serial.begin(9600); byte numDigits = 2; //Ilosc wyswietlaczy byte digitPins[] = {A5, A4}; //Piny sterujace wyswiet ---> tranzystory byte segmentPins[] = {7, 5, 2, 4, 3, 8, 6}; //Piny <---> segmenty bool resistorsOnSegments = true; // Use 'true' if on digit pins byte hardwareConfig = N_TRANSISTORS; // See README.md for options sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments); //Konfiguracja przyciskow pinMode(przMIN, INPUT_PULLUP); pinMode(przMAX, INPUT_PULLUP); } void loop(){ //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu float temperatura = ((analogRead(LM35) * 5.0) / 1024.0) * 100; if (temperatura > tempMAX) { //Jesli aktualna temperatura jest wyzsza od maksymalnej tempMAX = temperatura; //to ustaw aktualną, jako maksymalną. //Wyslanie przez UART temperatury maksymalnej Serial.print("Nowa wartosc max: "); Serial.print(tempMAX); Serial.println("*C"); } if (temperatura < tempMIN) { //Jesli aktualna temperatura jest niższa od minimalnej tempMIN = temperatura; //to ustaw aktualną, jako minimalną. //Wyslanie przez UART temperatury minimalnej Serial.print("Nowa wartosc min: "); Serial.print(tempMIN); Serial.println("*C"); } // Wyswietl na 7 segmentowym if(digitalRead(przMAX) == LOW){//Podglad tem przy wcisnietym przycisku tempMAXI=tempMAX; sevseg.setNumber(tempMAXI, 2); //Wyswietl temp MAX, korzystając z dwóch wyswietlaczy sevseg.refreshDisplay(); }else{ //Przyklad uzycia millis w wyswietlaczach 7 segm (bez delay) --> DEMO static unsigned long timer = millis(); static int deciSeconds = 0; if (millis() >= timer + 1000) { deciSeconds++; timer = millis(); if (deciSeconds == 60) { //Prawie jak minuta ;) deciSeconds = 0; } sevseg.setNumber(deciSeconds, 1); } sevseg.refreshDisplay(); } if(digitalRead(przMIN) == LOW){ tempMINI=tempMIN; sevseg.setNumber(tempMINI, 2); //Wyswietl temp MIN, korzystając z dwóch wyswietlaczy sevseg.refreshDisplay(); } } CDN.
  10. A więc "default:" dzięki za radę. Teraz już wszystko wygląda ładnie. Jedziemy dalej. Następne zadanie robię na bazie tego poprzedniego. Mam już szkic i dwa problemy. Pierwszy - jak pogodzić ten delay (pińcet) który pomaga mi w kontrolowaniu zakłóceń w przycisku z tym szybkim delayem na dwóch wyświetlaczach? Drugi - przycisk odliczający od 99 do zera, ale tu jakoś dojdę do sedna (mam nadzieję) trochę się oderwałem od lekcji bo światłolub czekał Oglądałem też te przykłady z SevSeg i tu z przykładami jakoś to poszło, ale nie idę dalej póki nie rozwiąże poprzednich zadań.
  11. Zadanie 6.1 - oczywiście w moim, pokrętnym, stylu Zdradzę Wam sekret - staram się wykonać zadania tylko z pomocą tych kursów, tzn. mam przygotowane materiały do nauki, ale póki kursy trwają staram się korzystać tylko z nich. Książki po kursie Chociaż ostatnio miałem problem przy kursie Arduino II z default: w case: bo nie było przykładu na lekcji. Chyba czas na posiłkowanie się źródłami zewnętrznymi bo po napisaniu tego zadania przed oczami pojawił mi się mem z kotkiem "Andrzej to jeb... Zatem przedstawiam kod: #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define R_LIGHT_SENSOR A0 #define L_LIGHT_SENSOR A1 #define BUZZER 10 #define LED 13 int bip = 0; //Zmienna na potrzeby 'bipania' void setup() { //Konfiguracja pinow od mostka H pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode(LED, OUTPUT); //Konfiguracja LED //Konfiguracja pozostalych elementow pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, 0); //Wylaczenie buzzera } void loop() { int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; migLed(); stopMotors(); while (odczytPrawy < 600 || odczytLewy < 600 ){ if (bip < 3){ BUZZASTER(); bip++; }else{ JAZDA(); } } } void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu 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); digitalWrite(R_DIR, 0); //Kierunek: do przodu analogWrite(R_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(R_DIR, 1); //Kierunek: do tyłu analogWrite(R_PWM, V); //Ustawienie predkosci } } void stopMotors() { analogWrite(L_PWM, 0); //Wylaczenie silnika lewego analogWrite(R_PWM, 0); //Wylaczenie silnika prawego } void migLed() { digitalWrite(LED, 1); delay(200); digitalWrite(LED, 0); delay(200); } void BUZZASTER() { digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); delay(500); } //Jazde wrzucilem tu zeby miec czysto w loop podczas 'wymyslania' zadania domowego :) void JAZDA(){ int odczytLewy = analogRead(L_LIGHT_SENSOR); int odczytPrawy = analogRead(R_LIGHT_SENSOR); int roznica = odczytLewy - odczytPrawy; if (roznica > 50) { //Jesli obliczona roznica jest wieksza leftMotor(30); //To skręcamy w prawo rightMotor(-30); } else if (roznica < -50){ //Jesli obliczona roznica jest mniejsza leftMotor(-30); //To skręcamy w lewo rightMotor(30); } else { //W pozostałych przypadkach jedziemy prosto leftMotor(30); rightMotor(30); } } i film
  12. Treker, Na początku miałem takie rozwiązanie: //Wyswietlacz #define SEG_C 2 #define SEG_E 3 #define SEG_D 4 #define SEG_B 5 #define SEG_G 6 #define SEG_A 7 #define SEG_F 8 //Przyciski #define przDod 9 #define przUja 10 #define przRes 11 #define przLicz 12 int i = 0; void setup() { Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia //Konfiguracja pinow jako wyjscia 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); //Konfiguracja dla przyciskow pinMode(przDod, INPUT_PULLUP); pinMode(przUja, INPUT_PULLUP); pinMode(przRes, INPUT_PULLUP); pinMode(przLicz, INPUT_PULLUP); } void loop() { wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu if(digitalRead(przDod) == LOW){//Jesli przDod wcisniety i++; //Dodaj 1 do wartosci wyswietlacz(i); //Wrzuc na wyswietlacz Serial.println(i); //Wrzuc na port delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przUja) == LOW){//Jesli przDod wcisniety i--; //Wartosc w dol wyswietlacz(i); //Wrzuc na wyswietlacz Serial.println(i); //I serial delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przRes) == LOW){//Jesli przRes wcisniety i=0; //Wyzeruj wyswietlacz(i); //I wrzuc na wyswietlacz Serial.println("Reczny restet"); //Plus komentarz na serialu Serial.println(i); delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przLicz) == LOW){//Jesli przLicz wcisniety for (i ; i > 0; i--) { //Petla odliczania do zera wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu Serial.println(i); delay(1000); //Poczekaj 1000 ms (że niby sekunda ;) ) } } } void wyswietlacz(int cyfra) { //Instrukcja switch ustawia odpowiednie stany na wyjsciach //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; case 10: 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); delay(1000); i=0; wyswietlacz(i); delay(500); break; } } Czyli case 10 Ale nie wiedziałem jak zrobić błąd dla wartości poniżej zera. To jest wspaniała wiadomość. Ostatnio częściej zaglądam na forum i zastanawiam się jak to wszystko ogarniasz? Robicie naprawdę świetną robotę, więc z tej okazji wielkie dzięki - nie pierwsze i nie ostatnie.
  13. Moja interpretacja zadania 6.1 #define SEG_C 2 #define SEG_E 3 #define SEG_D 4 #define SEG_B 5 #define SEG_G 6 #define SEG_A 7 #define SEG_F 8 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean start = true; //Poczatek wpisu String wpis = ""; //Wpisana liczba ile int ile = 0; //Jakas zmienna na potrzeby wyswietlacza ;) void setup() { Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia //Konfiguracja pinow jako wyjscia 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); } void loop() { while (start == true) //Kiedy podano cyferki lub inne liczbusie { Serial.println("Podaj cyfre z zakresu 0-9"); //Tekst jakis while(Serial.available() == 0) //Poczekaj na wpisanie cyfry {} if(Serial.available() > 0) //Jeśli cyfra zostanie wpisana { wpis = Serial.readStringUntil('\n'); //Odczytaj cyfre ile = wpis.toInt(); //Zmien String na int wyswietlacz(ile); //Wrzuc to co odczytales na wyswietlacz Serial.print("Podana cyfra: "); //Pokaz na porcie co wpisales Serial.println(ile); delay(1000); //Delay to przeklenstwo kazdego prgramu... } } } void wyswietlacz(int cyfra) { //Instrukcja switch ustawia odpowiednie stany na wyjsciach //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; } //Jesli liczba inna niz z zakresu 0-9 wyswietl blad if (cyfra > 9 || cyfra < 0){ error(); Serial.println("Bledna cyfra - podaj cyfre z zakresu 0-9"); delay(1000); } } //Symbol bledu na wyswietlaczu void error(){ 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); } I fotka Teraz mała kawa i biorę się za dodawanie przycisków i zadanie 6.2 - mam nadzieję, że nie zapomnę o PULLUPach PS mała płytka stykowa powędrowała na robota (z kursu) podczas odklejania płytki z tej podstawki z kursu zobaczyłem jak wygląda płytka od środka - bardzo ciekawe doświadczenie ED: Zadanie 6.2 jednak nie udało mi się na bazie poprzedniego kodu (zbyt mała wiedza) Ale 'naskrobałem' coś takiego //Wyswietlacz #define SEG_C 2 #define SEG_E 3 #define SEG_D 4 #define SEG_B 5 #define SEG_G 6 #define SEG_A 7 #define SEG_F 8 //Przyciski #define przDod 9 #define przUja 10 #define przRes 11 #define przLicz 12 int i = 0; void setup() { Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia //Konfiguracja pinow jako wyjscia 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); //Konfiguracja dla przyciskow pinMode(przDod, INPUT_PULLUP); pinMode(przUja, INPUT_PULLUP); pinMode(przRes, INPUT_PULLUP); pinMode(przLicz, INPUT_PULLUP); } void loop() { wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu if(digitalRead(przDod) == LOW){//Jesli przDod wcisniety i++; //Dodaj 1 do wartosci wyswietlacz(i); //Wrzuc na wyswietlacz Serial.println(i); //Wrzuc na port delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przUja) == LOW){//Jesli przDod wcisniety i--; //Wartosc w dol wyswietlacz(i); //Wrzuc na wyswietlacz Serial.println(i); //I serial delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przRes) == LOW){//Jesli przRes wcisniety i=0; //Wyzeruj wyswietlacz(i); //I wrzuc na wyswietlacz Serial.println("Reczny restet"); //Plus komentarz na serialu Serial.println(i); delay(500); //Delay dla poprawnego działania przycisku } if(digitalRead(przLicz) == LOW){//Jesli przLicz wcisniety for (i ; i > 0; i--) { //Petla odliczania do zera wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu delay(1000); //Poczekaj 1000 ms (że niby sekunda ;) ) } } } void wyswietlacz(int cyfra) { //Instrukcja switch ustawia odpowiednie stany na wyjsciach //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; } //Jesli liczba inna niz z zakresu 0-9 wyswietl blad if (cyfra > 9 || cyfra < 0){ error(); //Smieszny tekst zamrazajacy program na kilka sekund Serial.println("Bledna cyfra - podaj cyfre z zakresu 0-9"); delay(500); Serial.print("Nastapi"); delay(1000); Serial.print(" automatyczny"); delay(1000); Serial.println(" reset licznika"); delay(500); i=0; //Wyzerowanie licznika wyswietlacz(i); delay(500); } } //Symbol bledu na wyswietlaczu void error(){ 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); } Jeszcze film i lecę dalej. ED2:
  14. ZombiZiomek, Podłącz do A1/A0 i wgraj ten kod testowy z postu powyżej odpal 'Monitor portu szeregowego' i wg wskazówek. Po tym pewnie wszystko się wyjaśni. U mnie jest ok, ale z ciekawości odpaliłem kod test_czuj.txt
  15. Właściwie w tym wypadku takim programem testowym był odczyt z czujników przez UART. Działało dobrze dlatego czułem, że gdzieś coś przeoczyłem. Najgorsze u początkujących (w tym u mnie) jest sytuacja, w której kopiuje się część kodu. W programie, w którym wklepywałem ręcznie (na pinach A4/A5) działało dobrze, a w drugim oknie kod 'wpisywałem' metodą kopiuj wklej i boom - coś nie działa. Trzeba odejść od takich nawyków od początku
×
×
  • Utwórz nowe...