Skocz do zawartości

Kurs Arduino - #8 - Sterowanie silnikami DC, pętla for


Komentator

Pomocna odpowiedź

57 minut temu, PanMajster napisał:

Napisz program, który za pomocą 2 pętli for będzie płynnie rozpędzał oraz hamował silnik.

Dobrze Ci idzie! Ale @ethanak już chyba pisał o tym:

for (i; i <= 255; i++)

I mała wskazówka: Zamiast pisać:

zmienna = zmienna - 1

możesz napisać po prostu:

zmienna-- 

lub przy większych liczbach:

zmienna -= 25

Oczywiście nie trzeba tych zapisów używać, ale po prostu wyglądają czytelniej. 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

14 godzin temu, PanMajster napisał:

Takie coś wyskrobałem . Dodałem nowa funkcje której jeszcze się nie uczyłem "is digit" wiec nie jestem pewien czy dobrze zrobione. W każdym razie działa.

A wpisz "x0y9z". Czy tak ma działać? Znasz już pętlę for, czy nie dałoby się nią zastąpić switch()?

Link do komentarza
Share on other sites

@orb777 Hmm no tak wyskoczyło mi 9x* po wpisaniu x0y9z. Mała szansa ze ktoś akurat tak wpisze przez przypadek ale owszem jest to luka w programie.

 

Program na pętli for

String liczba = ""; // Bufor do przechowywania całej liczby
boolean liczbawpisana = false;

void wypiszGwiazdki(int liczbaGwiazdek) { // Zmieniona nazwa funkcji
  for (int i = 0; i < liczbaGwiazdek; i++) {
  Serial.print("*"); } //program wysyla gwiazdki w tej samej lini
  Serial.println(); } // pusta linia

void setup() {
  Serial.begin(9600);
  Serial.println("Witaj w SYSTEMIE");
  Serial.println("Wprowadź liczbę od 1-9");
}

void loop() {
if (Serial.available() > 0) { //sprawdzamy czy dane zostały wpisane
    char znak = Serial.read(); //odczytujemy 1 znak
if (znak >= '0' && znak <= '9') { // jezeli znak to liczba od 0 do 9
      liczba += znak; // Dodajemy cyfrę do bufora
    } else if (znak == '\n') { // Jeśli wprowadzono Enter
      liczbawpisana = true; 
    }}
if (liczbawpisana == true) {
    int liczba_calkowita = liczba.toInt();
if (liczba_calkowita >= 0 && liczba_calkowita <= 9) { // jezeli znak to liczba od 0 do 9
      wypiszGwiazdki(liczba_calkowita); 
    } else {
      Serial.println("KOD NIEZNANY");
    }
    liczba = ""; // Czyscimy bufor
    liczbawpisana = false; 
  }
  delay(300);
}

Niestety wpisując x0y9z tez program wysyła odpowiednią ilość gwiazdek .

Link do komentarza
Share on other sites

(edytowany)

@PanMajster, nie chodzi luki, nikt z tego programu korzystać na codzień nie będzie. Tu tylko chodzi o naukę, czy rozumiesz czemu tak jest, itd. Niektóre błędy wychodzą po czasie, nawet jak program na pierwszy rzut oka działa całkowicie w porządku. Twój kod wyłapuje tylko cyfry, a resztę znaków pomija (oprócz nowej linii). Może tak miało być, stąd pytanie.

Żeby nie było, że tylko jęczę, wrzucam swój amatorski ulep.

#include <Arduino.h>

#define MAX_ZAKRES 9

String bufor = "";
void wypisz_znaki();

void setup(){
	Serial.begin(9600);
	while(!Serial);
}

void loop(){
	if(Serial.available() > 0){
		char z = Serial.read();
		switch(z){ // zamiast if-else, tylko dla czytelności
			case ' ': // case bez break przechodzi dalej; pomija wszystkie spacje
			case '\t': // pomija tabulatory
			case '\r': break; // pomija znaki karetki
			case '\n': wypisz_znaki(); bufor.clear(); break;
			default: bufor += z; break; // break na końcu być nie musi, ale pinkniej wygląda
		}
	}
}

void wypisz_znaki(){
	if(!bufor.length()){
		Serial.println("> ???: nie bądź bambik, wpisz coś!");
		return; // wychodzi z funkcji, nic nie zwraca
	}
	for(int i = 0; i < bufor.length(); i++){
		if(!isDigit(bufor[i])){
			Serial.printf("> błąd: \"%s\" zawiera znaki inne niż cyfry\n", bufor.c_str());
			return;
		}
	}
	int liczba = bufor.toInt();
	if(!(liczba > 0 && liczba <= MAX_ZAKRES)){
		Serial.printf("> błąd: liczba jest poza zakresem [1-%i]\n", MAX_ZAKRES);
		return;
	}
	if(bufor[0] == '0'){
		Serial.println("> info: następnym razem podaj liczbę bez \"wiodących\" zer, ok?");
	}
	for(int i = 0; i < liczba; i++) Serial.print('*'); 
	Serial.println();
}

 

Edytowano przez orb777
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.