Skocz do zawartości

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


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
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()?

@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 .

(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
  • 1 miesiąc później...
Treker
Ta treść została wynagrodzona przez moderatora!

Santiago otrzymał odznakę: "Korektor (za znalezienie błędu w artykule)"

@Treker Powinieneś zaobserwować, że jedna dioda zmienia wyraźnie swoją jasność - jednak robi to skowo!

Skokowo :)- przez tyle czasu nikt tego nie zauważył 🙂 

  • Lubię! 1
  • 2 tygodnie później...
  • 4 miesiące później...

Pragnę przypomnieć iż kilka równoległych diod z jednym szeregowym rezystorem to trochę niedobry pomysł, iż przez jedną diodę może przepływać wyższy prąd niż przez drugą (żadna dioda nie jest w 100% taka sama), więc lepiej na każdą diodę podłączyć własny rezystor lub umieścić je szeregowo (jedynie ta pierwsza opcja się tu sprawdzi).

  • 9 miesiące później...

zrobilem bardzo fajny kod z uzyciem sterownika l293d  

#define MOTOR 75

void setup(){
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop(){
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  for (int y = (0); y <= (MOTOR); y = y + (1)) {
    analogWrite(6,y);
    delay(250);
  }
  delay(3000);
  for (int i = (MOTOR); i >= (0); i = i + (-1)) {
    analogWrite(6,i);
    delay(250);
  }
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  delay(5000);
  digitalWrite(7,HIGH);
  for (int s = (0); s <= (MOTOR); s = s + (1)) {
    analogWrite(6,s);
    delay(250);
  }
  delay(3000);
  for (int r = (MOTOR); r >= (0); r = r + (-1)) {
    analogWrite(6,r);
    delay(250);
  }
  delay(5000);

}

ps. uzywam 12 woltow dlatego zmniejszylem wartosc na 75 

17 godzin temu, orb777 napisał:

Nie widziałem jeszcze takiego zapisu, do czego służą nawiasy przy stałych?

Hmm, raczej nie mają tutaj żadnego zastosowania (nie zmieniają nic w działaniu).

(edytowany)
5 godzin temu, Treker napisał:

Hmm, raczej nie mają tutaj żadnego zastosowania (nie zmieniają nic w działaniu).

tak wogole u mnie nie wywala bledow kompilator wiec jest ok👍

Edytowano przez Igor308

Oczywiście kompilator akceptuje te nawiasy i błędów nie ma, ale to nie oznacza że są one do czegokolwiek potrzebne. A zaciemniają tylko obraz.

Usuń je, a zobaczysz że wszystko działa.

10 minut temu, jand napisał:

Oczywiście kompilator akceptuje te nawiasy i błędów nie ma, ale to nie oznacza że są one do czegokolwiek potrzebne. A zaciemniają tylko obraz.

Usuń je, a zobaczysz że wszystko działa.

ok sprobuje

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...