Skocz do zawartości

leepa79

Użytkownicy
  • Zawartość

    43
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

leepa79 zajął 1. miejsce w rankingu.
Data osiągnięcia: 4 stycznia 2017.

Treści użytkownika leepa79 zdobyły tego dnia najwięcej polubień!

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

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

Osiągnięcia użytkownika leepa79

Wynalazca

Wynalazca (6/19)

  • Za 5 postów
  • Za 25 postów
  • To już rok!
  • To już 5 lat!
  • Młodszy Juror

Odznaki

8

Reputacja

  1. Hej. Wpadłem tu tylko, żeby podziękować ekipie za kursy. "Przeszedłem" kurs lutowania, arduino I i II, elektroniki I i II, techniki cyfrowej i robotów. Coś tam majsterkuję i wykorzystałem tę wiedzę w wielu projektach - lubię zegarki, trzeba mi rotomat - arduino mamy to. Oświetlenie w akwarium ze wschodem i zmierzchem - znów wiedza z kursów. Automatyczne oświetlenie w garażu na bazie arduino i forbot. Automatyczne żaluzje - już wiecie. Nie, nie płacą mi za reklamę. Chciałem tylko podziękować. Teraz trzeba mi automatyczny dozownik nawozów do akwarium, jestem na etapie: /* LOUVE2013 Dozownik nawozów ver. 0.09 jedna pompa Arduino UNO pompa uruchamiana poprzez moduł przekaźnika 1-kanał - 5V - 10A/250V - kontrola LED https://botland.com.pl/przekazniki/8463-modul-przekaznika-1-kanal-styki-10a250vac-cewka-5v.html przekaźnik na pinie 6 Moduł RTC DS3231 I2C - zegar czasu rzeczywistego https://botland.com.pl/moduly-rtc/3790-modul-rtc-ds3231-i2c-zegar-czasu-rzeczywistego-bateria.html?gclid=CjwKCAjwx6WDBhBQEiwA_dP8rds3HvxfW2x37zm___qsU70BlSy9cxhsE1-CWzvcfEOKCzcOCY-2URoCp8EQAvD_BwE pompa perystaltyczna model G328 12V Tube 3mm x 5mm TODO 1) wyświetlacz WYŚWIETLACZ LCD 1602 2x16 znaków + KONWERTER i2C - wyświetl czas, temp i włączenie pompy 2) 1602 ARDUINO Keypad shield MODUŁ WYŚWIETLACZ LCD - menu edycja dozowania LOUVE2013 */ #include <Wire.h> #include <DS3231.h> #define przekaznik 6 int godzina_ON=18; //włączenie pompy godzina int minuta_ON=41; int sekunda_ON=00; int godzina_OFF=18; //wyłączenie pompy godzina int minuta_OFF=41; int sekunda_OFF=15; DS3231 clock; RTCDateTime dt; void setup() { Serial.begin(9600); pinMode(przekaznik, OUTPUT); digitalWrite(przekaznik, HIGH); // Initialize DS3231 Serial.println("Initialize DS3231");; clock.begin(); // Set sketch compiling time clock.setDateTime(__DATE__, __TIME__); } void loop() { dt = clock.getDateTime(); //czas clock.forceConversion(); //temperatura // For leading zero look to DS3231_dateformat example Serial.print("Raw data: "); Serial.print(dt.year); Serial.print("-"); Serial.print(dt.month); Serial.print("-"); Serial.print(dt.day); Serial.print(" "); Serial.print(dt.hour); Serial.print(":"); Serial.print(dt.minute); Serial.print(":"); Serial.print(dt.second); Serial.println(""); Serial.print("Temperature: "); Serial.println(clock.readTemperature()); delay(1000); if((godzina_ON==dt.hour)&&(minuta_ON==dt.minute)&&(sekunda_ON==dt.second)) //jeśli - włącz pompę { digitalWrite(przekaznik, LOW); Serial.println("POMPA ON"); } if((godzina_OFF==dt.hour)&&(minuta_OFF==dt.minute)&&(sekunda_OFF==dt.second)) //jeśli - wyłącz pompę { digitalWrite(przekaznik, HIGH); Serial.println("POMPA OFF"); } } Oczywiście po tych kursach wszystko działa, ale idziemy dalej. Marzy mi się część trzecia kursu - wyświetlacz, wprowadzanie danych... Jeszcze raz WIELKIE DZIĘKI. Pozdrawiam
  2. 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.
  3. 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.
  4. Czujnik najszybszym sposobem - klej na gorąco 🙂 No i oczywiście czekam na dodatkowe moduły - widziałem, że shield już w sprzedaży.
  5. 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.
  6. 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:
  7. 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); }
  8. 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.
  9. Ś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 😉
  10. 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.
  11. 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ń.
  12. 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
  13. 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.
  14. 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:
  15. 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
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.