Skocz do zawartości

bakardi92

Użytkownicy
  • Zawartość

    19
  • Rejestracja

  • Ostatnio

Reputacja

5 Neutralna

O bakardi92

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. @SOYER Twoja szkoła w 100% najprostsza i najskuteczniejsza!!! Dzięki wielkie! Generalnie ten kawałek kodu który wstawiłeś wcześniej otworzył mi oczy na nowe możliwości, gdyby nie to to bym dalej z tym walczył. Czy masz może gdzieś kawałek kodu z wykorzystaniem tej biblioteki millis() ? Szukam, czytam i ciężko mi ogarnąć jak ją użyć w praktyce... A prawdopodobnie Twój kod po raz kolejny by mnie naprowadził na trop
  2. Więc tak udało mi się zrobić menu, a konkretnie kolejne screeny do wpisywania danych.Zobaczcie filmik. Koło kręci się raz w lewo raz w prawo. Czas kręcenia i stopu oczywiście ustala się na screenie. https://photos.app.goo.gl/bzjzZkpdUYvF5qov7 Mam ostatnie pytanie, czy macie pomysł jak zrealizować kręcenie kołem poprzez funkcję millis() a nie delay jak mam teraz? Delay blokuje mi kontroler na amen a millis pod tym względem byłby idealny. Oczywiście dodaję kod źródłowy, może komuś się przyda do budowy własnego menu. Całość postawiona na switch caseach. Kod jest dość nieczytelny a to dlatego że jak go pisałem to miałem sporo pomysłów do sprawdzenia, a jak chciałem zrobić go bardziej przejrzystego to już było za późno... #include <Keypad.h> #include <LiquidCrystal_I2C.h> #include <DHT.h> LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); DHT dht; const byte ROWS = 4; const byte COLS = 4; byte rowPins[ROWS] = {5, 4, 3, 2}; byte colPins[COLS] = {6, 7, 8, 9}; char keys[ROWS][COLS] = { {'.', '7', '4', '1'}, {'0', '8', '5', '2'}, {'#', '9', '6', '3'}, {'D', 'C', 'B', 'A'}}; Keypad klawiatura = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); unsigned long saveTime = 0; unsigned long currentTime = 0; // motor steering #define in2 13 #define in1 12 #define ena 11 int A = 0; //glowny switch w petli loop int B=1; //sterowanie silnikami int count=1; bool lock = 1; bool lock1=0; String string1 = String(); String string2 = String(); String string3 = String(); String string4 = String(); String string5 = String(); String string6 = String(); String string7 = String(); byte diameter = 0; float speedd = 0; byte runn = 0; byte stop1 = 0; byte reverse = 0; byte stop2 = 0; byte repeat = 0; int timee = 0; int speedd2 = 0; void setup() { Serial.begin(9600); Serial.println("It's working"); lcd.begin(16, 2); lcd.backlight(); dht.setup(10); pinMode(ena, OUTPUT); //MOTOR STEERING - PWM pinMode(in1, OUTPUT); //MOTOR STEERING - LEFT/RIGHT pinMode(in2, OUTPUT); //MOTOR STEERING - LEFT/RIGHT } void loop() { Serial.print("main loop"); char klawisz = klawiatura.getKey(); float temperature = ((analogRead(A0) * 5.0) / 1024.0) * 100; int wilgotnosc = dht.getHumidity(); int temperatura = dht.getTemperature(); switch (A) { case 0: if (lock == 1) { lcd.clear(); lcd.home(); lock = 0; lcd.print("COLSON CASTORS"); lcd.setCursor(0, 1); lcd.print("BY KEN & MARCIN"); } if (klawisz == 'A') { A++; } break; case 1: if (lock == 0) { lock = 1; lcd.clear(); lcd.print("DHT11"); lcd.setCursor(0, 1); lcd.print(temperature); //LM35 lcd.print((char)223); //LM35 lcd.print("C"); //LM35 lcd.setCursor(0, 1); lcd.print(temperature);//lm35 lcd.print((char)223); lcd.print("C"); lcd.setCursor(6, 0); lcd.print(temperatura);//dht11 lcd.print(char(223)); lcd.print("C"); lcd.setCursor(11, 0); lcd.print(wilgotnosc); lcd.print("%RH"); lcd.setCursor(9,1); lcd.print("PWM:"); lcd.print(speedd2); } /* if (dht.getStatusString() == "OK") // ta opcja tez dziala ale jest bez odswiezania 2 sekund jak poizej { saveTime = millis(); lcd.setCursor(6, 0); lcd.print(temperatura); lcd.print(char(223)); lcd.print("C"); lcd.setCursor(11, 0); lcd.print(wilgotnosc); lcd.print("%RH"); lcd.setCursor(0, 1); lcd.print(temperature);//lm35 lcd.print((char)223); lcd.print("C"); }*/ if (dht.getStatusString() == "OK" && millis() - saveTime >= 2000UL) // jesli minely 2 sekundy i dht jest gotowy to wysyla wynik { saveTime = millis(); lcd.setCursor(0, 1); lcd.print(temperature);//lm35 lcd.print((char)223); lcd.print("C"); lcd.setCursor(6, 0); lcd.print(temperatura);//dht11 lcd.print(char(223)); lcd.print("C"); lcd.setCursor(11, 0); lcd.print(wilgotnosc); lcd.print("%RH"); } if (klawisz == 'A') { A++; } break; case 2: if (lock == 1) { lcd.clear(); lcd.home(); lcd.print("WHEEL (diameter)"); lcd.setCursor(0, 1); lock = 0; if (diameter != 0){ lcd.print(diameter); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra1 = String(klawisz); string1.concat(cyfra1); diameter = string1.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("WHEEL (diameter)"); diameter=0; string1=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { A++; } if (klawisz == 'B') { ; A--; } break; case 3: if (lock == 0) { lcd.clear(); lcd.home(); lock = 1; lcd.print("SPEED (km/h)"); lcd.setCursor(0, 1); if (speedd != 0){ lcd.print(speedd); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra2 = String(klawisz); string2.concat(cyfra2); speedd = string2.toFloat(); speedd2=map(speedd,1,6,65,255); } if (klawisz=='C'){ lcd.clear(); lcd.print("SPEED (km/h)"); speedd2=0; speedd=0; string2=""; lcd.setCursor(0, 1); } analogWrite(ena,speedd2); if (klawisz == 'A') { A++; } if (klawisz == 'B') { ; A--; } break; case 4: if (lock == 1) { lcd.clear(); lcd.home(); lock = 0; lcd.print("RUN (min)"); lcd.setCursor(0, 1); if (runn != 0){ lcd.print(runn); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra3 = String(klawisz); string3.concat(cyfra3); runn = string3.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("RUN (min)"); runn=0; string3=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { A++; } if (klawisz == 'B') { A--; } break; case 5: if (lock == 0) { lcd.clear(); lcd.home(); lock = 1; lcd.print("STOP (min)"); lcd.setCursor(0, 1); if(stop1 != 0){ lcd.print(stop1); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra4 = String(klawisz); string4.concat(cyfra4); stop1 = string4.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("STOP (min)"); stop1=0; string4=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { stop1 = string4.toInt(); A++; } if (klawisz == 'B') { A--; } break; case 6: if (lock == 1) { lcd.clear(); lcd.home(); lcd.print("REVERSE (min)"); lcd.setCursor(0, 1); lock = 0; if (reverse != 0){ lcd.print(reverse); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra5 = String(klawisz); string5.concat(cyfra5); reverse = string5.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("REVERSE (min)"); reverse=0; string5=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { reverse = string5.toInt(); A++; } if (klawisz == 'B') { A--; } break; case 7: if (lock == 0) { lcd.clear(); lcd.home(); lock = 1; lcd.print("STOP (min)"); lcd.setCursor(0, 1); if (stop2 != 0){ lcd.print(stop2); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra6 = String(klawisz); string6.concat(cyfra6); stop2 = string6.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("STOP (min)"); stop2=0; string6=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { stop2 = string6.toInt(); A++; } if (klawisz == 'B') { A--; } break; case 8: if (lock == 1) { lcd.clear(); lcd.home(); lcd.print("REPEAT"); lcd.setCursor(0, 1); lock = 0; if (repeat != 0){ lcd.print(repeat); } lcd.setCursor(0, 1); } if (klawisz && klawisz != 'A' && klawisz != 'B' && klawisz != 'C' && klawisz != 'D' && klawisz != '#' && klawisz != '*') { lcd.print(klawisz); String cyfra7 = String(klawisz); string7.concat(cyfra7); repeat = string7.toInt(); } if (klawisz=='C'){ lcd.clear(); lcd.print("REPEAT"); repeat=0; string7=""; lcd.setCursor(0, 1); } if (klawisz == 'A') { repeat = string7.toInt(); A++; } if (klawisz == 'B') { A--; } break; case 9: timee = (runn + stop1 + reverse + stop2) * repeat; if (lock == 0) { lcd.clear(); lcd.home(); lock = 1; lcd.print("TIME (min)"); lcd.setCursor(0, 1); lcd.print(timee); lcd.print(" minutes"); } if (klawisz == 'A') { A++; } if (klawisz == 'B') { A--; } break; case 10: if (lock == 1) { lock = 0; lcd.clear(); lcd.home(); lcd.print("PRESS D TO START"); } // TERAZ JAK JUŻ MAMY WPISANE WARTOŚCI RUN STOP REVERSE STOP MUSZĘ ZROBIĆ // STEROWANIE SILNIKAMI W ODNIESIENIU DO WPISANYCH WCZESNIEJ WARTOSCI //I TUTAJ TRZEBA BY ZROBIĆ STEROWANIE W OPARCIU O NOWĄ FINKCJĘ NP void sterowanie(runn,stop1,reverse,stop2) {} if (klawisz == 'D'){ lock1=1; count=1; } if (lock1==1){ sterowanie(runn,stop1,reverse,stop2); } if (klawisz == 'B') { A--; } } // END SWITCH } // END LOOP void sterowanie(unsigned long runnA,unsigned long stop1A, unsigned long reverseA, unsigned long stop2A){ runnA=runnA*1000; stop1A=stop1A*1000; reverseA=reverseA*1000; stop2A=stop2A*1000; if (runnA==0 || stop1A==0 || reverseA==0 || stop2A==0){ A=1; lock=1; lock1=0;//powrot do glownej petli loop() do case gdzie litera D wlacza program } if (runnA!=0 && stop1A!=0 && reverseA!=0 && stop2A!=0){ if (count<=repeat){ switch(B){ case 1: lcd.clear(); lcd.print("REPEAT"); lcd.setCursor(7,0); lcd.print(repeat); lcd.setCursor(0,1); lcd.print("CURRENT"); lcd.setCursor(8,1); lcd.print(count); digitalWrite(in1,1); digitalWrite(in2,0); delay(runnA); B++; break; case 2: digitalWrite(in1,0); digitalWrite(in2,0); delay(stop1A); B++; break; case 3: digitalWrite(in1,0); digitalWrite(in2,1); delay(reverseA); B++; break; case 4: digitalWrite(in1,0); digitalWrite(in2,0); delay(stop2A); B=1; count++; Serial.println(count); break; }//end switch }//end count if if (count>repeat){ lcd.clear(); lcd.print("FINISHED!"); delay(1000); A=0; lock=1; lock1=0;//powrot do glownej petli loop() do case gdzie litera D wlacza program count=1; string1 = String(); string2 = String(); string3 = String(); string4 = String(); string5 = String(); string6 = String(); string7 = String(); diameter = 0; speedd = 0; runn = 0; stop1 = 0; reverse = 0; stop2 = 0; repeat = 0; timee = 0; speedd2 = 0; } }//end of main if }// end of sterowanie /* Serial.println(runnA); Serial.println(stop1A); Serial.println(reverseA); Serial.println(stop2A); Serial.println(speedd2A); lock1=0; */ /* if(millis()-saveTime>=1000UL){ saveTime=millis(); lcd.home(); lcd.print(saveTime); } */
  3. Opisując z grubsza tak wygląda tabela (załącznik) każda kolumna to menu np 1 kolumna średnica koła, druga kolumna prędkość koła, czas pracy silnika itd. Każdy wiersz to odpowiednia wartość która będzie się znajdowała w menu. Czyli wybierająć średnicę np 200 będziemy mieć do wyboru zakres 2 prędkości 3km/h i 4 km/h (patrz tabela), po wybraninu prędkości wybieramy czas pracy silnika (tutaj będzie 3minuty z tego co widzę, ale ten czas będzie ustawiany już indywidualnie, czyli jakaś prosta zmienna która po naciśnięciu guzika zwiększa się o 1) itd. Tak jak widzisz powiązań jest dużo stąd moja zagwozdka jak to zrobić. Chciałem jeszcze na sam koniec jak już się wszystko wybierze mieć podgląd które opcję zostały wybrane. Ale jak będzie zbyt trudno to usunę niepotrzebne dane i zostawie tylke te które MUSZĄ zostać i nie będzie żadnego podglądu opcji itp.. Póki co troche mnie to przerosło, ale zobaczymy co czas pokaże. Klawiatura to dobry pomysł a gdybym zrezygnował z przycisków które mam to akurat byłoby 8 wejść więc klawiatura by weszła idealnie. Razem z klawiaturą chodzą mi po głowie troche inne pomysły bez tworzenia menu. Screen 1 wybierz srednice i wpisujesz średnicę ---> screen 2 wpisz predkosc ----> screen 3 wpisz czas pacy ----> itp itd. Każdą wartość zapisać w zmiennej i na koniec wszystkie zmienne można ładnie wyświetlić. Musze o tym pomyśleć! niemniej jednak dalej chcę się nauczyć tworzenia menu które może się jeszcz przydać.
  4. Hmmm, bardzo bardzo sprytnie!! W programowaniu najbardziej podoba mi się że każdy problem można rozwiązać na 100 sposobów. Zawsze kiedy nie mogę czegoś rozwiązać myślę sobie że tego nie da się zrobić, a później widzę gotowy program który rozwiązuje mój problem używając zwykłuch funkcji i jest to czasami aż tak proste że nigdy bym tego nie wymyślił. Co do mojego przypadku miałbym do zrobienia jakieś 500 różnych funkcji do napisania jeżeli chciałbym zrobić to tak jak powinienem, a to byłoby baaardzo czasochłonne, wprowadzanie kolejnych zmian byłoby bardzo uciążliwę. Czy ewentualnie ktoś jeszcze z was rozwiązał problem menu w bardzie zautomatyzowany sposób, bardziej klarowny? Widzę w internecie że jest pełno bibliotek które tworzą menu ale nie mogę nigdzie znaleźć takiego prostego step by step jak to zrobić. @SOYER w wolnej chwili na 100% spróbuje napisać program na twoim przykładzie, chcę zobaczyć jak to wyjdzie w rzeczywistości i jak będzie okej, a nie uda mi się znaleźć innego pomysłu, to zapewne zostanę przy tym. Czy ewentualnie mogę liczyć na Twoją pomoc w trakcie moich prób i błędów? Postaram się za to zabrać jak najszybciej, ale ciężko pogodzić prace dom rodzinę i do tego programowanie które zajmuje bardzo dużo czasu. W ogóle nie dodałem ale program będzie wykonywał pracę silnikiem korzystając z funkcji millis() która nie blokuje całego programu, a czasami będzie potrzeba przerwania pracy silnika w trakcie jego ruchu Pozdrawiam
  5. Witajcie, Mam do zrobienia projekt, w którym potrzebuje rozszeżyć swoją wiedzę o wiele nowych aspektów z którymi daję radę, ale jeżeli chodzi o aspekt budowy MENU kompletnie sobie z tym nie radzę.Menu ma wyglądać +- tak jak poniżej, będzie one jeszcz bardziej rozbudowane ale teraz głownie zależy mi na tym aby poznać sposób jak zbudować menu i jak później się po nim poruszać, jak cofnąć się do poprzedniej opcji, jak wybrać opcję itp... Wybierz średnicę: 75 80 100 125 (po wybraniu w/w opcji kolejne powinny pojawić się kolejne opcję) Wybierz teraz prędkość: 1 2 3 4 5 6 (po wybraniu w/w opcji kolejne powinny pojawić się kolejne opcję) czas pracy 1 2 3 4 5 6 (po wybraniu w/w opcji kolejne powinny pojawić się kolejne opcję) czas stopu: 1 2 3(po wybraniu w/w opcji kolejne powinny pojawić się kolejne opcję) czas pracy 1 2 3 4 5 6 (po wybraniu w/w opcji kolejne powinny pojawić się kolejne opcję) Wybierz teraz ile razy ma być powtarzane: 1 2 3 Itd. Do 300 Czy jsteś gotowy na start tak/nie I teraz po wybraniu tych opcji powinien włączyć się program włączający silnik. Tą część programu już sam ogarnę ale z tym menu walczę już kilka dni i dalej nic.. Znalazłem fajny artykuł tutaj https://www.obliczeniowo.com.pl/976 ale niczego nowego on nie wniósł do mojego życia. Patrzyłem sporo tutoriali po polsku i angielsku ale widzę że jest to baaardzo trudne. Początkowo menu miało być obsługiwane przez enkoder ale to jeszcze bardziej skomplikuje temat, dlatego zostanę przy zwykłych przyciskach. Mógłbym to zrobić na serial monitorze ale program docelowo ma być obsługiwany bez komputera, stąd mikrokontroler i LCD. Gdybym mógł tam włożyć komputer nie byłoby problemu.
  6. Witajcie, Zmagam się z problemem, gdyż chciałem zrobić aby przy każdym naciśnięciu któregokolwiek przycisku (6 sztuk) był wydawany dźwięk. Nie chce używać funkcji delay(); gdyż blokuje ona cały układ, a muszę to zrobić poprzez millis(); Cały program po uruchomieniu czasami będzie pracował przez 14 godzin i w trakcie tych 14 godzin MUSI być możliwość pauzy, play czy stop. W jaki sposób mogę to zrobić poprzez funkcję millis(); ? Próbowałem już chyba na 100 różnych przykładów i nic mi się nie udało.... Tu jest mały przykład tego co chcę osiągnąć. Każde naciśnięcie to krótki sygnał dźwiękowy. https://photos.app.goo.gl/zMcpPppdT7faywvA9
  7. Problem się znalazł. Miałem jeszcze inna biblioteke która mieszała wszystko stąd ten błąd. Dzięki za pomoc
  8. Panowie nie mam pojęcia gdzie leży błąd... Już nawet skopiowałem gotowy kod z kursu i nadal jest ten sam błąd przy kompilowaniu. Co jest nie tak?
  9. zadanie 9.3 - czy są sposoby aby ładniej zapisać ten długi kod z funkcji void wskaznik? pomijam opcję z pętlą for która zapala piny a następnie wszystkie gasi i tak w kółko. #define trigger 12 #define echo 11 void setup() { pinMode(trigger, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); pinMode(2, OUTPUT); for (int i = 10; i > 5; i--) { pinMode(i, OUTPUT); } } void loop() { wskaznik(); delay(25); } int odleglosc() { int czas = 0; digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); czas = pulseIn(echo, HIGH); czas = czas / 58.0; return czas; } void wskaznik() { if (odleglosc() < 50) { digitalWrite(10, HIGH); digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 100) { digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 150) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 200) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 250) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, HIGH); } else { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); } } Zadanie 9.1 bool blokadastart=0; // blokada pierwszego if'a int wybor=0; // deklarowanie wyboru obliczenia int a=0; // pole prostokata int b=0; float aa=0; // pole trojkata zmienne float h=0; float r=0; // pole kola float wynik=0; void setup(){ Serial.begin(9600); } void loop(){ if (blokadastart==0){ Serial.println("Wybierz ktore pole chcesz obliczyc"); Serial.println("Pole kwadratu wcisnij 1"); Serial.println("Pole prostokata wcisnij 2"); Serial.println("Pole trojkata wcisnij 3"); Serial.println("Pole kola wcisnij 4"); blokadastart=1; } if (Serial.available()>0){ String zmienna=Serial.readStringUntil('\n'); wybor=zmienna.toInt(); } switch(wybor){ case 1: // pole kwadratu Serial.println("Wybrales pomiar pola kwadratu"); Serial.println("Podaj wymiar boku a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); int a=dane.toInt(); Serial.print("Podany wymiar: "); Serial.println(a); int wynik=polekwardaru(a); Serial.print("Pole powierzchni kwadratu wynosi: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; case 2: //pole prostokata Serial.println("Wybrales pomiar pola prostokata"); Serial.println("Podaj wymiar boku a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); a=dane.toInt(); Serial.print("Podany wymiar boku a: "); Serial.println(a); } Serial.println("Teraz prosze podac wymiar boku b"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); b=dane.toInt(); Serial.print("Podany wymiar boku b: "); Serial.println(b); int wynik=prostokatpole(a,b); Serial.print("Pole powierzchni prostokatu wynosi: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; case 3: //pole trojkata Serial.println("Podaj wymiar podstawy a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); aa=dane.toInt(); Serial.print("Wartosc podstawy to: "); Serial.println(aa); } Serial.println("Podaj wysokosc trojkata"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); h=dane.toInt(); Serial.print("Wartosc wysokosci to: "); Serial.println(h); } wynik=poletrojkata(aa,h); Serial.print("Pole powierzchni prostokata wynosi: "); Serial.println(wynik); blokadastart=0; wybor=0; break; case 4: //pole kola Serial.println("Wybrales pomiar powierzchni kola"); Serial.println("Podaj wartosc promienia kola"); while(Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); r=dane.toInt(); float wynik=polekola(r); Serial.print("pole kola: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; } // zakonczenie funkcji switch case } // zakonczenie void loop // funkcje int polekwardaru (int a){ int wynik=a*a; return wynik; } int prostokatpole (int a, int b){ //funkcja na pole pow. prostokatu int wynik=a*b; //zmienna lokalna wynik return wynik; // wynik dzialania ktore pokaze zmienna int wynik } float poletrojkata (float a, float h){ //funkcja na pole trojkata float wynik=0.5*(a*h); //zmienna lokalna wynik return wynik; // wynik dzialania pole trojkata } float polekola (float r){ //funkcja na pole kola float wynik=PI*(r*r); //zmienna lokalna wynik return wynik; // wynik dzialania pole kola } Jest haos, są zmienne globalne i zmienne lokalne które nazywają się tak samo a mimo wszystko program działa. Pisany w 100% przeze mnie ale logicznie nie umiem wyjaśnić dlaczego działa. Dlatego w mojej głowie pojawiły się poytanie dotyczące zmiennych i to gdzie są one widoczne w trakcie trwania programu @Treker czy mógłbyś trochę rozjaśnić moją niepewność dotyczącą tych zmiennych?
  10. zadanie domowe 8.3 String dane=""; int ile=0; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available()<=0) { dane=Serial.readStringUntil('\n'); ile=dane.toInt(); if(ile>9){ Serial.println("wpisz cyfre z zakresu 0-9"); }else{ for(int i=0; i<ile; i++){ Serial.print("*"); } Serial.print('\n'); } } } Zadanie 8.4 void setup(){ pinMode(10,OUTPUT);//regulacja PWM pinMode(9,OUTPUT); // sterowanie lewo prawo pinMode(8,OUTPUT); // sterowanie lewo prawo Serial.begin(9600); } void loop(){ Serial.println("petla"); for (int i=0; i<255; i++){ analogWrite(10,i); digitalWrite(9,HIGH); delay(25); Serial.println(i); } for (int i=254; i>-1; i--){ analogWrite(10,i); delay(25); Serial.println(i); } }
  11. Zadanie 7.4 #include <LiquidCrystal.h> #define S1 6 #define S2 7 int czas=1; byte blokada=0; bool blokadabool=0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int foto=0; float napiecie=0; void setup(){ pinMode(S1,INPUT_PULLUP); pinMode(S2,INPUT_PULLUP); lcd.begin(16,2); lcd.setCursor(0,0); lcd.print("Stoper"); lcd.setCursor(0,1); lcd.print("S1 - START"); Serial.begin(9600); } void loop(){ if (digitalRead(S1)==LOW &&blokadabool==0){ blokada++; blokadabool=1; while (digitalRead(S1)==LOW){} } if (digitalRead(S2)==LOW){ blokada=3; } switch (blokada){ case 1: lcd.clear(); lcd.setCursor(0,0); lcd.print("Stoper wyzerowany"); lcd.print("wcisnij S1"); lcd.setCursor(0,1); czas=0; lcd.print(czas); delay(250); blokadabool=0; break; case 2: lcd.clear(); lcd.setCursor(0,0); lcd.print("Pomiar start"); lcd.setCursor(0,1); lcd.print(czas); czas++; delay(1000); break; case 3: lcd.clear(); lcd.setCursor(0,0); lcd.print("Pomiar stop"); lcd.setCursor(0,1); lcd.print(czas); delay(250); blokada=0; blokadabool=0; break; } } oraz link jak działa https://drive.google.com/file/d/18mGBxmrTXebu3yKe6bRSTS851vt-fS10/view?usp=sharing Jest to trochę ulepszona wersja gdyż S1 najpierw zeruje pomiar, drugie naciśnięcie S1 powoduja rozpoczęcie pomiaru. Teraz program nie reaguje więcej na naciskanie S1 i czeka aż S2 będzie naciśnięte. Po naciśnięciu S2 pomiar jest zatrzymywany i teraz dopiero naciskając S1 pomiar można wyzerować a ponowne nacisnięcie S1 rozpoczyna pomiar od nowa. @Treker Czy dałoby się jakoś usprawnić działąnie kodu aby był jak najbardziej optymalny? Czy taki zapis będzie wystarczająco lekki dla procesora? Pytam gdyż chcę się uczyć dobrych nawyków programowania w trakcie nauki i za bardzo nie wiem na co jeszcze mogę zwrócić uwagę aby się poprawić. ps. poradnik 1 klasa, moim zdaniem żadna z książek o arduino nie jest tak przyjazna użytkownikom którzy nigdy nie mieli wcześniej z tym styczności, jak właśnie ten kurs. Spokojnie mógłby on być płatny gdyż kontent jest na prawdę bardzo pomocny i konkretny, a do tego można rozmawiać z autorem kursu - dla mnie bomba. ps2 powiedz jak inaczej i lepiej byś zapisał warunek if który ma się wykonać tylko raz? czy taki zapis byłby odpowiedni czy masz na to lepszy sposób ? Wydaje mi się że mój jest trochę zawiły z tą blokadabool, ciekaw jestem jak ty rozwiązujesz ten problem. Blokada while jest tylko po to aby jak trzymam przycisk S1 żeby zablokować program tak aby nie dodawał zmiennej blokada++ bo jak wiemy w ciągu sekundy dodał by ją jakieś 16 milionów razy a ja chcę żeby blokada++ była dodana tylko po jednym fizycznym wciśnięciu.
  12. zadanie 6.2 - ogólnie trochę dziwnie to wygląda, ale rozumiem że zadanie jest typowo aby poznać zagadnienie w praktyce, bo nie wdaje mi się że będzie to najefektywniejsze wykorzystanie kodu. #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych byte kolor=0; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); } void loop() { if(Serial.available() > 0) { //Czy Arduino odebrało dane //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane odebraneDane = Serial.readStringUntil('\n'); } if(odebraneDane=="zielona"){ kolor=1; }else if (odebraneDane=="czerwona"){ kolor=2; } else { kolor=0; } switch (kolor){ case 1: digitalWrite(zielona, HIGH); digitalWrite(czerwona, LOW); break; case 2: digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, HIGH); break; case 0: digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); break; } delay(1000); }
  13. Zadanie domowe 6.1 int licznik=0; // licznik przycisniec int foto1=0; //zmienna fotorezystora 1 int foto2=0;//zmienna fotorezystora 2 int potencjometr=0; // zmienna potencjometru void setup(){ Serial.begin(9600); pinMode(12,INPUT_PULLUP); } void loop(){ foto1=analogRead(A1); foto2=analogRead(A2); potencjometr=analogRead(A3); if (digitalRead(12) == LOW){ licznik++; Serial.print("Fotorezytor 1: "); Serial.print(foto1); Serial.print("\t Fotorezystor 2: "); Serial.print(foto2); Serial.print("\t Potencjmetr: "); Serial.print(potencjometr); Serial.print("\t Przycisk wcisnieto: "); Serial.println(licznik); while(digitalRead(12)==LOW){} } } nadal czekam na arduino dlatego symulator musi mi go zastąpić
  14. W sumie nie ma sensu, masz rację trzeba by to wrzucić do pętli IF która zbiera dane z portu szeregowego. Dzięki że wspominasz o takich szczegółach. Na pewno przy pisaniu bardziej skomplikowanych programów taki zapis będzie miał już większe znaczenie niż ma teraz, ale warto się uczyć dobrych nawyków programowania jak najszybciej. Jeszcz raz dzięki
  15. Dziękuję za odpowiedź, obecnie korzystam z thincercada i jestem zadowolony. Chciałem znaleźć symulator który by mi mówił krok po kroku którą czynność aktualnie wykonuję. Obecnie uczę się Arduino i czasami pewne rzeczy są dla mnie nie jasne a gdybym widział, co program robi po kolei łatwiej byłoby mi to przeanalizować. No nic pozostaje mi opcja z UART i wyświetlania danych przez usb. Dzięki za pomoc
×
×
  • Utwórz nowe...