Skocz do zawartości

VVasyl

Użytkownicy
  • Zawartość

    20
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

Wszystko napisane przez VVasyl

  1. Udało mi się znaleźć odpowiedź. https://www.arduino.cc/en/reference/ethernet Temat do zamknięcia.
  2. Mam układ podpięty pod Arduino (ethernet shield, wyświetlacz, dwa termometry), do którego postanowiłem dodać czujnik ruchu, który ma zapalać podświetlenie wyświetlacza. W tym celu wpiąłem odpowiednio czujnik, i napisałem prosty program do testu: #define podswietlenie 9 #define ruch 11 void setup() { pinMode (ruch, INPUT); pinMode (podswietlenie, OUTPUT); } void loop() { digitalWrite(podswietlenie, digitalRead(ruch)); } Program działa w porządku. Postanowiłem go dodać do mojego programu głównego i tu się zaczyna mój problem. Po włączeniu wyświetlacz świeci się cały czas. Co do tej pory sprawdziłem: -zmiana wyświetlacza na LED -zmiana pinu -zmiana miejsca pojawienia się komendy w programie -dopisanie tuż przy wywołaniu digitalWrite zmiennej a=a+1 w celu zobaczenia czy pętla przechodzi przez to miejsce i wyświetlenie wartości a W końcu zacząłem zakomentowywać całe bloki i poszczególne linijki kodu i wychodzi mi na to, że gdy zakomentowane jest Ethernet.begin(mac, ip) zmiana stanu na pinie odpowiadającym za podświetlenie działa poprawnie. Co mogę w takim przypadku zrobić? Poniżej cały program: #include <OneWire.h> #include <DS18B20.h> #include <SPI.h> #include <Ethernet.h> #include <LiquidCrystal.h> LiquidCrystal lcd(3, 4, 5, 6, 7, 8); //Informacja o podłączeniu nowego wyświetlacza // Numer pinu do którego podłaczasz czujnik #define ONEWIRE_PIN 2 #define podswietlenie 10 // pin do ktorego podlaczone jest podswietlenie #define ruch 11 // pin czujnika ruchu // Adresy czujników byte addressWew[8] = {0x28, 0xEE, 0xD9, 0x4, 0x22, 0x16, 0x2, 0xA6}; byte addressZew[8] = {0x28, 0xFF, 0xC, 0x9D, 0x92, 0x16, 0x4, 0x55}; OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 }; IPAddress ip(192,168,0,14); //<<< ENTER YOUR IP ADDRESS HERE!!! // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): EthernetServer server(80); void setup() { pinMode (ruch, INPUT); pinMode (podswietlenie, OUTPUT); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); server.begin(); //start wyświetlacza lcd.begin(16, 2); //start termometrów sensors.begin(); sensors.request(addressWew); sensors.request(addressZew); } void loop() { if (sensors.available()) { float temperatureWew = sensors.readTemperature(addressWew); float temperatureZew = sensors.readTemperature(addressZew); // listen for incoming clients /* EthernetClient client = server.available(); if (client) { // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // client.println("<cke:html><cke:body bgcolor=#FFFFFF>TEST</cke:body></cke:html>"); client.print("Wew: "); client.print(temperatureWew); client.print(" 'C "); client.print("Zew: "); client.print(temperatureZew); client.print(" 'C "); client.print("Ruch:"); client.print(digitalRead(ruch)); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } */ lcd.setCursor(0, 0); lcd.print("Wew: "); lcd.print(temperatureWew); lcd.print(" 'C "); lcd.setCursor(0, 1); lcd.print("Zew: "); lcd.print(temperatureZew); lcd.print(" 'C "); sensors.request(addressWew); sensors.request(addressZew); } digitalWrite(podswietlenie, digitalRead(ruch)); // dlaczego to nie działa? }
  3. Napisałem, że przez C2 ponieważ brałem pod uwagę oznaczenia z górnego obrazka, a nie dolnego.
  4. Wydaje mi się, że powinno być C2. Edit: Link pod artykułem już przenosi do tego wątku. Może nie działał bo nie było żadnego komentarza?
  5. Klikając w następnej części kursu w: przenosi do https://www.forbot.pl/forum/index.php __________ Komentarz dodany przez: Treker Nie mogę u siebie odtworzyć takiego błędu. Spróbuj napisać komentarz bezpośrednio w temacie powiązanym z tamtym artykułem: https://www.forbot.pl/forum/topics66/kurs-elektroniki-ii-9-czujnik-przeszkod-sterownik-serwa-vt12473.htm Postaram się jeszcze poobserwować sprawę
  6. Będzie możliwość zakupu samych płytek? W pomarańczowej ramce na początku artykułu powinno być miedzi, a nie miedzy
  7. Włączyłem program ponownie i działa tak jak można było się tego spodziewać. Nie mam pojęcia, dlaczego wczoraj mimo stałej użytej jako ziarno dostawałem przy każdym włączeniu programu inne wyniki. Bardzo fajny artykuł, udało mi się w końcu przez niego przebrnąć (trzecie podejście!). Fajnie jak w tekście pojawiają się linki (np. do Wikipedii) rozszerzające zagadnienie.
  8. 10.1 Zmieniając randomSeed(analogRead(0)); na np. randomSeed(2); nie zaobserwowałem żadnej różnicy w działaniu programu. W przypadku, gdy ziarno było jakąś stałą liczbową nie udało mi się znaleźć, żadnego schematu generowania liczb losowych przy kolejnych próbach włączenia programu. 10.2 void setup() { Serial.begin(9600); pinMode(9, INPUT_PULLUP); randomSeed(analogRead(0)); } void loop() { while (digitalRead(9) == HIGH) { //Zatrzymujemy się w pustej pętli delay(100); //W pętli wprowadzamy małe opóźnienie, aby niwelować zakłócenia } Serial.println(random(1,7)); // kostka o polach 1-6 delay(200); // opóźninienie by nie losować więcej niż jednej liczby na raz }
  9. Znając zakres, w którym będziemy dokonywać pomiarów możemy znacznie ograniczyć pojawanie się błędów na wykresie. Wystarczy, że zamiast błędnie zmierzonej wartości wyświetlimy poprzednią. #define trigPin 12 #define echoPin 11 int zmierzona=0; // zmierzona wartość int odl=0; // wyświetlana odlagłość void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejści pinMode(13, OUTPUT); } void loop() { delay(100); zmierzona = zmierzOdleglosc(); if (zmierzona < 200) // czy zmierzona wartość mieści się w zakresie { odl = zmierzona; } Serial.println(odl); } 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; }
  10. To wyniki moich pomiarów. Zwieszając rezystancję opornika zmniejszamy napięcie między bramką[G], a podłożem i tym samym zamykamy kanał, którym może płynąć prąd między drenem[D], a źródłem(zwiększa się tym samym opór złącza, ponieważ "trudniej" jest przepłynąć ładunkowi). Dla opornika 1M kanał jest prawie całkowicie zatkany i płynie jedynie minimalny prąd. Podłączając opornik do masy tak na prawdę zwieramy bramkę[G], podłoże i źródło.
  11. Zmieniłem rezystory i efekt jest wyraźny (szeroka histereza). Już nie mam żadnych wątpliwości, dzięki za pomoc.
  12. Prąd jest jak już pisałem minimalny. Więc w jaki sposób wpływa on na napięcie różnicowe? Szczególnie, że zmierzone napięcie z opornikiem R6 i bez niego jest takie same.
  13. W takim razie można usuwać. Dlaczego? Wpinam woltomierz tak jak na poniższym rysunku i mierzę napięcie w dwóch skrajnych położeniach potencjometru, a następnie usuwam opornik R6 i powtarzam pomiar. Zgodnie z tym co zostało napisane na końcu artykułu zmierzone napięcie powinno być odpowiednio wyższe i niższe w czasie pierwszego pomiaru w porównaniu z pomiarem bez opornika R6 a są dokładnie takie same.
  14. W zestawie są oporniki 470 Om, a na schemacie (R1 i R2) 47000 Om. Pomyłka? Edit: Obejrzałem zdjęcia z kursu i widzę, że tam faktycznie są podłączone oporniki 47k. Dodatkowo zacząłem przeglądać wszystkie części jakie mam i zauważyłem, że dostałem oporniki 56k, chociaż na spisie części w botlandzie (link) są oporniki 56 om. Coś tu nie gra
  15. Program mierzy odległość i wyświetla ją na LCD w cm oraz przedstawia formie graficznej. Przy pomiarze poniżej 5 cm włącza się buzzer. Co muszę wpisać w miejsce "*" by zamiast gwiazdek na ekranie pojawiały się prostokąty? #include <LiquidCrystal.h> //Dołączenie bilbioteki LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza #define trigPin 12 #define echoPin 11 void setup() { pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście pinMode(13, OUTPUT); lcd.begin(16, 2); //Deklaracja typu } void loop() { zakres(0,5); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print(zmierzOdleglosc()); //Wyświetlenie tekstu lcd.print(" cm"); delay(200); lcd.clear(); int gwiazki = map(zmierzOdleglosc(), 0, 50, 16, 0); for (int i = 0; i < gwiazki; i++) { lcd.setCursor(i, 1); //Ustawienie kursora lcd.print("*"); //Wyświetlenie gwiazdek } } 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 zakres(int a, int b) { int jakDaleko = zmierzOdleglosc(); if ((jakDaleko > a) && (jakDaleko < b)) { digitalWrite(13, HIGH); //Włączamy buzzer } else { digitalWrite(13, LOW); //Wyłączamy buzzer, gdy obiekt poza zakresem } }
  16. Zadanie 8.3 #include <LiquidCrystal.h> //Dołączenie bilbioteki LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza String odebraneDane = ""; //Pusty ciąg odebranych danych void setup() { Serial.begin(9600); lcd.begin(16, 2); //Deklaracja typu } void loop() { if(Serial.available() > 0) { //Czy Arduino odebrano dane odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane int ilosc = odebraneDane.toInt(); lcd.clear(); if (ilosc > 16) { lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Za maly ekran"); //Komunikat } else { lcd.setCursor(0, 0); //Ustawienie kursora lcd.print(ilosc); //Wyświetlenie ilosci gwiazdek for (int i = 0; i < ilosc; i++) { lcd.setCursor(i, 1); //Ustawienie kursora lcd.print("*"); //Wyświetlenie gwiazdek } delay(1000); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Ile gwiazdek?"); //Komunikat } } }
  17. 3 bardzo krótkie mignięcia następnie jedno ok. sekundowe i program jest wgrany.
  18. Zadanie 8.4 zrobione dla dwóch "silników" wraz ze zmianą kierunku "obrotu". void setup() { pinMode(6, OUTPUT); // sterowanie predkoscia silnika 1 digitalWrite(6, HIGH); pinMode(5, OUTPUT); digitalWrite(5, HIGH); // sterowanie predkoscia silnika 2 pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop() { digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo digitalWrite(8, HIGH); digitalWrite(12, LOW); //Silnik nr 2 - obroty w lewo digitalWrite(13, HIGH); for (int i = 0; i <= 255; i++) //rozpedzanie { analogWrite (6,i); analogWrite (5,i); delay(30); } for (int j = 255; j >= 0; j--) //zwalnianie { analogWrite (6,j); analogWrite (5,j); delay(30); } digitalWrite(7, HIGH); //Silnik nr 1 - obroty w prawo digitalWrite(8, LOW); digitalWrite(12, HIGH); //Silnik nr 2 - obroty w prawo digitalWrite(13, LOW); for (int i = 0; i <= 255; i++) //rozpedzanie { analogWrite (6,i); analogWrite (5,i); delay(30); } for (int j = 255; j >= 0; j--) //zwalnianie { analogWrite (6,j); analogWrite (5,j); delay(30); } } Przy wgrywaniu programu dioda udająca obroty w prawo drugiego silnika miga. Z czego to wynika? Drobne uwagi techniczne: 1. W schemacie mostka jest Vs i Vss, w opisie w artykule Vc i Vcc. 2. A nie tylko?
  19. Tak, problemy wynikały właśnie z użycia tylko jednego przycisku (program uruchamiał się i o razu zatrzymywał). Jednak wystarczyło dodać kilka opóźnień i uwzględnić to przy mierzeniu czasu (stoper nie mierzy od 0 tylko od 0,2!).
  20. 7.4 źle przeczytałem polecenie i mój stoper ma tylko jeden przycisk #include <LiquidCrystal.h> //Dołączenie bilbioteki LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza float czas =0; int stan =0; void setup() { lcd.begin(16, 2); //Deklaracja typu pinMode(10, INPUT_PULLUP); //Przycisk } void loop() { if (digitalRead(10) == LOW) // przycisniecie { lcd.clear(); delay(200); stan = 1; czas = 0.2; // uwzglednienie poprzedniego delay while (stan == 1) { lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Pomiar czasu"); //Wyświetlenie tekstu czas = czas + 0.1; lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(czas); lcd.print(" s"); delay (100); if (digitalRead(10) == LOW) // kolejne przycisniecie { stan = 0; delay(200); // usuniecie zaklocen } } } lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("Ostatni pomiar"); lcd.setCursor(0, 1); //Ustawienie kursora lcd.print(czas); lcd.print(" s"); delay(200); // usuniecie zaklocen }
×
×
  • Utwórz nowe...