Skocz do zawartości

HC-SR04 - Wielofunkcyjność programowa na podstawie czujnika odległości. Modyfikacja programu


Pomocna odpowiedź

(edytowany)

Niezłe spaghetti 😉 Podziel ten program na funkcje które będą realizowane po naciśnięciu danego przycisku, wtedy łatwiej to będzie analizować i pomóc.  Np:

void ledChange(bool led1, bool led2, bool led3, bool led4) {
	digitalWrite(LED_1, led1);
	digitalWrite(LED_2, led2);
	digitalWrite(LED_3, led3);
	digitalWrite(LED_4, led4);
}

void loop() {

	if (digitalRead(Przycisk_1) == LOW) {

		int jakDaleko = zmierzOdleglosc(); //Zmienna - odniesienie do funkcji
		if (jakDaleko > 30) { //Jeżeli odległość jakDaleko > 30cm nic nie rób

			ledChange(0, 0, 0, 0);
		} else if (jakDaleko > 25) { //Jeżeli odległość jakDaleko > 25cm
			ledChange(1, 0, 0, 0);

		} else if (jakDaleko > 20) { //Jeżeli odległość jakDaleko > 20cm
			ledChange(1, 1, 0, 0);

		} else if (jakDaleko > 15) { //Jeżeli odległość jakDaleko > 15cm
			ledChange(1, 1, 1, 0);

		} else if (jakDaleko > 10) { //Jeżeli odległość jakDaleko > 10cm
			ledChange(1, 1, 1, 1);

		} else {
			ledChange(0, 0, 1, 1);

			delay(100);
			ledChange(0, 0, 0, 0);

			delay(100);
		}
	} else if (digitalRead(Przycisk_2) == LOW) { //Jeśli przycisk 2 jest włączony - Program_2 - odczyt danych przez Monitor portu

		digitalWrite(LED_5, HIGH); //Miganie LED niebieska - sygnalizacja stanu pracy Programu_2
		delay(500);
		digitalWrite(LED_5, LOW);
		delay(500);
		Serial.print(zmierzOdleglosc());
		Serial.println("cm");
		delay(500);

	} else if (digitalRead(Przycisk_3) == LOW) { //Jeśli przycisk 3 jest włączony - Program 3- niebieska dioda

		digitalWrite(LED_5, HIGH); //Miganie LED niebieska - symulacja programu
		delay(50);
		digitalWrite(LED_5, LOW);
		delay(50);

	} else {
		ledChange(0, 0, 0, 0);
	}
}

 

Edytowano przez _LM_
poprawiłem literówki w kodzie i usunąłem nadmiarowe nawiasy w warunkach if
Link to post
Share on other sites
(edytowany)

Teraz łatwiej prześledzić logikę programu 🙂 Oczywiście funkcję ledChange wrzucasz przed setup()

Edytowano przez _LM_
Link to post
Share on other sites
15 minut temu, _LM_ napisał:

Niezłe spaghetti 😉

Nie pomstuj, nie pomstuj....😉

 

1 minutę temu, _LM_ napisał:

Teraz łatwiej prześledzić logikę programu 🙂

Nie klam...😅haha (to takie zarciki tylko!😁)

Link to post
Share on other sites
(edytowany)

Ano można to jeszcze bardziej podzielić, no ale wszystkiego nie zrobię za was 😄 A jak spaghetti to tylko carbonara

Edytowano przez _LM_
Link to post
Share on other sites
(edytowany)

@_LM_ @farmaceuta - Dziękuje za odpowiedź. Jestem w trakcie analizowania i próby zrozumienia tego co napisaliście.

 

@_LM_ Sądziłem, że w miarę czytelnie napisałem kod 😕 Zauważ, że jestem absolutnym laikiem w świecie Arduino i celem tego tematu jest przede wszystkim zrozumienie zagadnienia (dla laików takich jak ja) przełączania Programów za pomocą przełączników/przycisków, a nie jego optymalizacja kodowa (zgodnie z tym algorytmem). O ile temat przełączania programów za pomocą przełączników bistabilnych mam ogarnięty, o tyle monostabilne (microswitche) są jeszcze w fazie odległej. Oczywiście jak tylko zrozumiem j.w. zajmę się skróceniem i uproszczeniem kodu zgodnie z Twoją sugestią 🙂 - wg. mojej skromnej oceny bardzo interesującą. 

@farmaceuta Twoja podpowiedź wygląda (kodowo) na z grubsza to o co mi chodzi. Dziękuję bardzo. Jak się dorwę do Arduino będę testował i dam znać 🙂

Jednak wydaje mi się, że chyba nie do końca się rozumiemy.  Może postaram się jaśniej:

 

Diagram sterujący.jpg

  1. Naciskam i puszczam Przycisk_1 - aktywuje się Program_1 
  2. Naciskam i puszczam Przycisk_2 - dezaktywacja Program_1 -> aktywacja Program_2
  3. Naciskam i puszczam Przycisk_3 - dezaktywacja Program_1 oraz Program_2 (robot stoi)

Nie trzymam ich wciśniętych cały czas ani nie używam ich kombinacji. 

 

Edytowano przez Forseti
Link to post
Share on other sites
22 minuty temu, Forseti napisał:

Naciskam i puszczam Przycisk_1 - aktywuje się Program_1 

  1. Naciskam i puszczam Przycisk_2 - dezaktywacja Program_1 -> aktywacja Program_2
  2. Naciskam i puszczam Przycisk_3 - dezaktywacja Program_1 oraz Program_2 (robot stoi)

Nie trzymam ich wciśniętych cały czas ani nie używam ich kombinacji. 

 

O matko i corko!...wbilem sobie do glowy ze chcesz uzywac przelacznikow "dip" takich micro wlasnie..😅 a Ty chcesz uzywac zwyklych guzikow..(chwilowych)...no ten kod co Ci napisalem dokladnie bedzie robil to co chcesz...tylko ta zmienna "tryb_programu" musisz umiescic globalnie..czyli na poczatku kodu poza setup i loop u gory...reszta bez zmian...ktory guzik wcisniesz to ten kawalek kodu bedzie sie wykonywal...

Link to post
Share on other sites
(edytowany)
28 minut temu, farmaceuta napisał:

a Ty chcesz uzywac zwyklych guzikow..(chwilowych)..

O to, to, to 🙂 Nie bądź zbyt surowy wobec siebie. Po prostu wymagałeś ode mnie dużo bardziej zaawansowanego kodu, a nie początkującej przaśnicy o wiedzy bakłażana 🙂 

Rozumiem, że switch(tryb_program) ma być w void loop () { }

Będę działał 🙂  

//Program symulujący pracę dwóch programów przełączanych za pomocą przełącznika ON/OFF lub suwakowego. Dwufunkcyjnego
//Przyciski typu microswitch
//Program_1 - linijka
//Program_2 - odczyt danych przez Monitor portu

#define trigPin 12 //wejście wyzwalające
#define echoPin 11 //Odczyt zmierzonej odległości
#define LED_1 2 //LED zielona 1
#define LED_2 3 //LED zielona 2
#define LED_3 4 //LED czerwona 1
#define LED_4 5 //LED czerwona 2
#define LED_5 6 //LED niebieska - Symbol innego programu
#define Przycisk_1 8 //Microswitch_1
#define Przycisk_2 9 //Microswitch_2
#define Przycisk_3 10 //Microswitch_3

uint8_t tryb_program = 0;

if (digitalRead(Przycisk_1) == LOW) {
  tryb_program = 0;
}
if (digitalRead(Przycisk_2) == LOW) {
  tryb_program = 1;
}
if (digitalRead(Przycisk_3) == LOW) {
  tryb_program = 2;
}

int zmierzOdleglosc() {
  long czas, dystans; //Zmienna przechowująca duże liczby - UWAGA! zużywa 4 bajty pamięci. Zawiera argumenty czas oraz dystans

  digitalWrite(trigPin, LOW); //Wejście wyzwalające - sygnał niski
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //Wejście wyzwalające - sygnał wysoki
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //Wejście wyzwalające - sygnał niski

  czas = pulseIn(echoPin, HIGH); //Pomiar gdy na pinie echoPin stan wysoki - w tym przypadku PIN 11
  dystans = czas / 58; //Przelicznik 58 - z DTR producenta. Czas w jakim dźwięk przebywa 1cm w czasie 1 micro sek. - dystans w korelacji ze zmienną long i jej argumentem

  return dystans;
}


void setup() {

  //Wyprowadzenie przycisków
  pinMode(Przycisk_1, INPUT_PULLUP); //Wejście przycisku 1 w trybie PULLUP
  pinMode(Przycisk_2, INPUT_PULLUP); //Wejście przycisku 2 w trybie PULLUP
  pinMode(Przycisk_3, INPUT_PULLUP); //Wejście przycisku 3 w trybie PULLUP

  //Obsługa czujnika odległości
  Serial.begin(9600); //Ustawienie prędkości transmisji
  pinMode(trigPin, OUTPUT); //Trig jako wyjście - pomiar odległości
  pinMode(echoPin, INPUT); //ECHO jako wejście - odczyt zmierzonej odległości

  //Wyprowadzenia LED
  pinMode(LED_1, OUTPUT); //Wyjście na LED zielona 1
  pinMode(LED_2, OUTPUT); //Wyjście na LED zielona 2
  pinMode(LED_3, OUTPUT); //Wyjście na LED czerwona 1
  pinMode(LED_4, OUTPUT); //Wyjście na LED czerwona 2
  pinMode(LED_5, OUTPUT); //Wyjście na LED niebieska - symulacja programu

  //Ustawienie wyjściowego stanu LED
  digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona
  digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona
  digitalWrite(LED_3, LOW); //Stan diody LED3 - wyłączona
  digitalWrite(LED_4, LOW); //Stan diody LED4 - wyłączona
  digitalWrite(LED_5, LOW); //Stan diody LED5 - wyłączona

}

void loop() {

  switch (tryb_program) {

    case 0:
      int jakDaleko = zmierzOdleglosc(); //Zmienna - odniesienie do funkcji
      if ((jakDaleko > 30) ) { //Jeżeli odległość jakDaleko > 30cm nic nie rób
        digitalWrite(LED_1, LOW); //Wyłącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 25) ) { //Jeżeli odległość jakDaleko > 25cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 20) ) {//Jeżeli odległość jakDaleko > 20cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 15) ) {//Jeżeli odległość jakDaleko > 15cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, HIGH); //Włącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 10) ) { //Jeżeli odległość jakDaleko > 10cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, HIGH); //Włącz LED czerwona 1
        digitalWrite(LED_4, HIGH); //Włącz LED czerwona 2
      } else {
        digitalWrite(LED_1, LOW); //Wyłącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_4, HIGH); //Miganie LED czerwona 2
        digitalWrite(LED_3, HIGH); //Miganie LED czerwona 1
        delay(100);
        digitalWrite(LED_4, LOW); //Miganie LED czerwona 2
        digitalWrite(LED_3, LOW); //Miganie LED czerwona 1
        delay(100);
      }
      break;
    case 1:

      digitalWrite(LED_5, HIGH);//Miganie LED niebieska - sygnalizacja stanu pracy Programu_2
      delay(500);
      digitalWrite(LED_5, LOW);
      delay(500);
      Serial.print(zmierzOdleglosc());
      Serial.println("cm");
      delay(500);

      break;

    case 2:

      digitalWrite(LED_5, HIGH);//Miganie LED niebieska - symulacja programu
      delay(50);
      digitalWrite(LED_5, LOW);
      delay(50);
      break;
  }

}

hmmm.. coś spierniczyłem 😕

Edytowano przez Forseti
  • Lubię! 1
Link to post
Share on other sites
(edytowany)

A gdzie ustawiasz zmienną switchprogram? Bo ja widzę ze ma cały czas wartość 0

Edytowano przez _LM_
Link to post
Share on other sites

@Forsetiprogram zaczyna się w setup() a później wykonuje się w loop(); i wszystko co wpadnie do tego loop tam musi pozostać jak w czarnej dziurze  dobrze sobie to zapamiętaj 😉 wyjątkiem są przerwania ale teraz nie zajmuj sobie nimi głowy. 

Link to post
Share on other sites
12 minut temu, farmaceuta napisał:

tak jak teraz to tylko raz program je "przeleci" i nigdy wiecej...

W ogóle się to nie wykona bo niema wywołania tych funkcji 

  • Lubię! 2
Link to post
Share on other sites
(edytowany)

Uprościłem zagadnienie i w takim trybie działa ale nie do końca. Ten kod nie daje mi tego co chcę na starcie. Ja potrzebuję włączyć samodzielnie zależnie od wciśnięcia przycisku. Teraz startuje Program_1 jako automat. 

#define Przycisk_1 8 //Microswitch_1
#define Przycisk_2 9 //Microswitch_2
#define Przycisk_3 10 //Microswitch_3
#define LED_1 2 //LED zielona 1
#define LED_2 3 //LED zielona 2
#define LED_3 4 //LED czerwona 1

uint8_t tryb_program = 0;

void setup () {
  //Wyprowadzenie przycisków
  pinMode(Przycisk_1, INPUT_PULLUP); //Wejście przycisku 1 w trybie PULLUP
  pinMode(Przycisk_2, INPUT_PULLUP); //Wejście przycisku 2 w trybie PULLUP
  pinMode(Przycisk_3, INPUT_PULLUP); //Wejście przycisku 3 w trybie PULLUP

  //Wyprowadzenia LED
  pinMode(LED_1, OUTPUT); //Wyjście na LED zielona 1
  pinMode(LED_2, OUTPUT); //Wyjście na LED zielona 2
  pinMode(LED_3, OUTPUT); //Wyjście na LED czerwona 1


  //Ustawienie wyjściowego stanu LED
  digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona
  digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona
  digitalWrite(LED_3, LOW); //Stan diody LED3 - wyłączona

}

void loop () {


  if (digitalRead(Przycisk_1) == LOW) {
    tryb_program = 0;
  }
  if (digitalRead(Przycisk_2) == LOW) {
    tryb_program = 1;
  }
  if (digitalRead(Przycisk_3) == LOW) {
    tryb_program = 2;
  }


  switch (tryb_program) {

    case 0:
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, LOW);
      digitalWrite(LED_3, LOW);
      //Włącz LED zielona 1 - PROGRAM 1

      break;
    case 1:
      digitalWrite(LED_2, HIGH);
      digitalWrite(LED_1, LOW);
      digitalWrite(LED_3, LOW);   //Włącz LED zielona 2 - PROGRAM 2
      break;
    case 2:
      digitalWrite(LED_3, HIGH);
      digitalWrite(LED_1, LOW);
      digitalWrite(LED_2, LOW);
      //Włącz LED czerwona 1 - PROGRAM 3
      break;

  }
}

Jednak po zaimplementowaniu tego rozwiązania do bardziej rozbudowanego kodu jest kicha ale coraz bliżej:

//Program symulujący pracę dwóch programów przełączanych za pomocą przełącznika ON/OFF lub suwakowego. Dwufunkcyjnego
//Przyciski typu microswitch
//Program_1 - linijka
//Program_2 - odczyt danych przez Monitor portu

#define trigPin 12 //wejście wyzwalające
#define echoPin 11 //Odczyt zmierzonej odległości
#define LED_1 2 //LED zielona 1
#define LED_2 3 //LED zielona 2
#define LED_3 4 //LED czerwona 1
#define LED_4 5 //LED czerwona 2
#define LED_5 6 //LED niebieska - Symbol innego programu
#define Przycisk_1 8 //Microswitch_1
#define Przycisk_2 9 //Microswitch_2
#define Przycisk_3 10 //Microswitch_3

uint8_t tryb_program = 0;

int zmierzOdleglosc() {
  long czas, dystans; //Zmienna przechowująca duże liczby - UWAGA! zużywa 4 bajty pamięci. Zawiera argumenty czas oraz dystans

  digitalWrite(trigPin, LOW); //Wejście wyzwalające - sygnał niski
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //Wejście wyzwalające - sygnał wysoki
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //Wejście wyzwalające - sygnał niski

  czas = pulseIn(echoPin, HIGH); //Pomiar gdy na pinie echoPin stan wysoki - w tym przypadku PIN 11
  dystans = czas / 58; //Przelicznik 58 - z DTR producenta. Czas w jakim dźwięk przebywa 1cm w czasie 1 micro sek. - dystans w korelacji ze zmienną long i jej argumentem

  return dystans;
}


void setup() {

  //Wyprowadzenie przycisków
  pinMode(Przycisk_1, INPUT_PULLUP); //Wejście przycisku 1 w trybie PULLUP
  pinMode(Przycisk_2, INPUT_PULLUP); //Wejście przycisku 2 w trybie PULLUP
  pinMode(Przycisk_3, INPUT_PULLUP); //Wejście przycisku 3 w trybie PULLUP

  //Obsługa czujnika odległości
  Serial.begin(9600); //Ustawienie prędkości transmisji
  pinMode(trigPin, OUTPUT); //Trig jako wyjście - pomiar odległości
  pinMode(echoPin, INPUT); //ECHO jako wejście - odczyt zmierzonej odległości

  //Wyprowadzenia LED
  pinMode(LED_1, OUTPUT); //Wyjście na LED zielona 1
  pinMode(LED_2, OUTPUT); //Wyjście na LED zielona 2
  pinMode(LED_3, OUTPUT); //Wyjście na LED czerwona 1
  pinMode(LED_4, OUTPUT); //Wyjście na LED czerwona 2
  pinMode(LED_5, OUTPUT); //Wyjście na LED niebieska - symulacja programu

  //Ustawienie wyjściowego stanu LED
  digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona
  digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona
  digitalWrite(LED_3, LOW); //Stan diody LED3 - wyłączona
  digitalWrite(LED_4, LOW); //Stan diody LED4 - wyłączona
  digitalWrite(LED_5, LOW); //Stan diody LED5 - wyłączona

}

void loop() {

  if (digitalRead(Przycisk_1) == LOW) {
    tryb_program = 0;
  }
  if (digitalRead(Przycisk_2) == LOW) {
    tryb_program = 1;
  }
  if (digitalRead(Przycisk_3) == LOW) {
    tryb_program = 2;
  }
  int jakDaleko = zmierzOdleglosc(); //Zmienna - odniesienie do funkcji

  switch (tryb_program) { //Jeśli przycisk wciśnięty to włącz

    case 0:

      if ((jakDaleko > 30) ) { //Jeżeli odległość jakDaleko > 30cm nic nie rób
        digitalWrite(LED_1, LOW); //Wyłącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 25) ) { //Jeżeli odległość jakDaleko > 25cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 20) ) {//Jeżeli odległość jakDaleko > 20cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, LOW); //Wyłącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 15) ) {//Jeżeli odległość jakDaleko > 15cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, HIGH); //Włącz LED czerwona 1
        digitalWrite(LED_4, LOW); //Wyłącz LED czerwona 2
      } else  if ((jakDaleko > 10) ) { //Jeżeli odległość jakDaleko > 10cm
        digitalWrite(LED_1, HIGH); //Włącz LED zielona 1
        digitalWrite(LED_2, HIGH); //Włącz LED zielona 2
        digitalWrite(LED_3, HIGH); //Włącz LED czerwona 1
        digitalWrite(LED_4, HIGH); //Włącz LED czerwona 2
      } else {
        digitalWrite(LED_1, LOW); //Wyłącz LED zielona 1
        digitalWrite(LED_2, LOW); //Wyłącz LED zielona 2
        digitalWrite(LED_4, HIGH); //Miganie LED czerwona 2
        digitalWrite(LED_3, HIGH); //Miganie LED czerwona 1
        delay(100);
        digitalWrite(LED_4, LOW); //Miganie LED czerwona 2
        digitalWrite(LED_3, LOW); //Miganie LED czerwona 1
        delay(100);
      } break;

    case 1: //Jeśli przycisk 2 jest włączony - Program_2 - odczyt danych przez Monitor portu

      digitalWrite(LED_5, HIGH);//Miganie LED niebieska - sygnalizacja stanu pracy Programu_2
      delay(500);
      digitalWrite(LED_5, LOW);
      delay(500);
      Serial.print(zmierzOdleglosc());
      Serial.println("cm");
      delay(500);
      break;
    case 2: //Jeśli przycisk 3 jest włączony - Program 3- niebieska dioda

      digitalWrite(LED_5, HIGH);//Miganie LED niebieska - symulacja programu
      delay(50);
      digitalWrite(LED_5, LOW);
      delay(50);
      break;
  }

}

 

Edytowano przez Forseti
Link to post
Share on other sites
(edytowany)

A co ma startowac jako automat?? 

I z czym jest teraz problem?

Acha..rozumiem..to musisz tak zmodyfikowac zmienna "tryb" zeby po uruchomieniu nic sie nie dzialo...jesli "0" to nie rob nic...jesli "1" to program1..itp

uint8_t tryb_program = 0;

if (digitalRead(switch1) == LOW) {
  tryb_program = 1;
  }
if (digitalRead(switch2) == LOW) {
  tryb_program = 2;
  }
if (digitalRead(switchoff) == LOW) {
  tryb_program = 3;
  }

switch(tryb_program)   {
  case 1:
      //program pierwszy...
  break;
  case 2:
      //program drugi...
  break;
  case 3:
      //program off...
  break;
 }

Teraz podczas startu nic sie nie dzieje...dopiero Ty wybierasz co robisz..

Edytowano przez farmaceuta
  • Pomogłeś! 1
Link to post
Share on other sites
(edytowany)

HA! Niech Twe imię będzie sławione na libacjach dobry człowieku oraz wszystkich, którzy poświęcili swój cenny czas. O to chodziło. Uproszczę kody i zbiorę razem aby był jeden wielki duży post dla potomnych. Sądzę, że się przyda. 

Edytowano przez Forseti
W szale radości zapomniałem podziękować :)
  • Lubię! 1
Link to post
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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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