Skocz do zawartości

Sterowanie przekaźnikami za pomocą bluetooth i przycisków.


kacpermateusz7

Pomocna odpowiedź

Witam wszystkich😀 Potrzebuje pomocy w dokończeniu kodu dla arduino, ale zacznijmy od początku. W moim projekcie zastosowałem 2 przekaźniki, arduino uno, moduł bluetooth HC-06 oraz 2 przyciski. Całość ma sterować elektrozaworem oraz pompą do podlewania. Do tej pory udało mi się napisać kod, dzięki któremu mogę zmieniać stan przekaźników z wysokiego na niski i na odwrót za pomocą telefonu i modułu bluetooth. Teraz potrzebuje pomocy w dodaniu do kodu jeszcze możliwości zmiany stanów przekaźników za pomocą przycisków podłączonych pod pin 6 i 7 w arduino, tak abym mógł włączać i wyłączać elektrozawór i pompę z poziomu aplikacji w telefonie oraz przycisków, które znajdować się będą przy arduino. Poniżej przesyłam kod.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13);
char val;
void setup() {
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 digitalWrite(2,HIGH);
 digitalWrite(3,HIGH);
 mySerial.begin(9600);
 Serial.begin(9600);
}
void loop() {

if( mySerial.available() >0 ) {
 val = mySerial.read();
 Serial.println(val); 
}
 if( val == 'a' ) {
 flag2 = LOW;
 digitalWrite(2,LOW); }
 else if( val == 'b' ) {
 digitalWrite(3,LOW); }
 else if( val == '9' ) {
 digitalWrite(2,LOW);
 digitalWrite(3,LOW);
}

 else if( val == 'A' ) {
 digitalWrite(2,HIGH); }
 else if( val == 'B' ) {
 digitalWrite(3,HIGH); }
 else if( val == 'I' ) {
 digitalWrite(2,HIGH);
 digitalWrite(3,HIGH);
}
}

 

Link do komentarza
Share on other sites

Nie powielaj watku bo to i tak nic nie da...😉 do tego kodu co teraz dodaj obsluge guzikow podobnie jak z blue zrobiles...na koncu kodu zmiennej val przypisz zero tak zeby w loop tylko raz zostal spelniony warunek...wtedy gdy wcisniesz ktorys guzik to zostanie wykonane twoje polecenie i czekasz na nastepne czy to z guzuka czy z blue...

Link do komentarza
Share on other sites

4 minuty temu, kacpermateusz7 napisał:

udało mi się napisać kod, dzięki któremu mogę zmieniać stan przekaźników z wysokiego na niski i na odwrót za pomocą telefonu i modułu bluetooth

Hm... na pewno kod jest prawidłowy?

Co się stanie, jeśli:

  • wciskasz klawisz na telefonie
  • program odbiera i wstawia go do 'val'
  • następuje kolejny obrót pętli loop
  • nie odbierasz żadnego znaku

Co będzie w 'val'? Czy na pewno chcesz, aby program w nieskończoność powtarzał ostatnia operację?

Jeśli to rozwiążesz, podłączenie przycisków będzie bardzo proste.

 

Link do komentarza
Share on other sites

  1. Posprzątaj kod, bo tego nie da się czytać...
  2. Zastanów się co się stanie jeżeli wciśniesz przycisk i po jego wciśnięciu wykona się kolejna pętla loop (brak danych w buforze portu szeregowego)?
  3. Potem podmień obsługę przekaźników na zmienne flagowe
  4. Na koniec pętli loop dodaj przekształcanie wartości zmiennej flagowej na wyjście przekaźnika
  5. Przed instrukcjami z pkt. 4 dodaj obsługę przycisków. 
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

Jestem osobą początkującą i jeszcze nie do końca wszystko ogarniam. Widzę, że społeczność na tym forum oczekuje od zwykłego kowalskiego, nie wiadomo jakiej wiedzy. Po to jest forum, aby pytać i wspólnie rozwiązywać problemy tak jak w tym przypadku. Ponadto kod będzie wykorzystany wyłącznie w celach testowych więc nie wymagam, aby ten kod był jakoś mega uporządkowany i czytelny. Dla mnie najważniejsze jest to, aby to zadziałało i nic więcej.

Link do komentarza
Share on other sites

2 minuty temu, kacpermateusz7 napisał:

nie wymagam, aby ten kod był jakoś mega uporządkowany i czytelny

Więc nie wymagaj, aby ktoś się przegryzał przez nieczytelny kod. Jeśli chcesz aby ktoś Ci pomógł - zrób wszystko, aby mu udzielenie pomocy ułatwić.

3 minuty temu, kacpermateusz7 napisał:

Jestem osobą początkującą

Rozumiem, że pytanie które zadałem było zbyt skomplikowane? Cóż - bez Twoich odpowiedzi na takie pytania nie będziemy mogli "wspólnie" rozwiązywać problemu. Bo nawet odpowiedź "nie wiem" jest odpowiedzią. Stwierdzenie "jestem początkujący" nie jest.

A początkujących to tu się przewinęło więcej niż Ci się wydaje i nie jesteś przypadkiem nietypowym.

Link do komentarza
Share on other sites

6 minut temu, kacpermateusz7 napisał:

Widzę, że społeczność na tym forum oczekuje od zwykłego kowalskiego, nie wiadomo jakiej wiedzy.

Wcale tak nie jest...tu duzo poczatkujacych..(ja tez😉)

A masz mozliwosc zmiany tego co wysylasz?? Np. Zamiast znakow to cyfry 1/2/3/4 itp...?

Link do komentarza
Share on other sites

1 godzinę temu, kacpermateusz7 napisał:

Jestem osobą początkującą i jeszcze nie do końca wszystko ogarniam. Widzę, że społeczność na tym forum oczekuje od zwykłego kowalskiego, nie wiadomo jakiej wiedzy.

My tylko wymagamy podstaw logicznego myślenia i umiejętności szukania informacji w sieci.

Punkt 1 - ładnie sformatowany kod to nawiasy (klamrowego) zawsze w osobnej linii, wnętrze nawiasu zawsze o 1 tabulator więcej niż położenie nawiasu (klamrowego) np.

void moja_funkcja ()
{
    if (a == b)
    {
    	print ("Hello"); 
    }
    else
    {
     	print ("Hi"); 
    }   
}


Punkt 2 - tutaj wystarczy prześledzić wykonywanie programu na kartce papieru, żadnej skomplikowanej wiedzy
Punkt 3 - zmienna flagowa to inaczej bool, który określa stan przekaźnika
Punkt 4 - inaczej ustaw wyjście przekaźnika względem tej zmiennej bool z punktu 3
Punkt 5 - https://forbot.pl/blog/kurs-arduino-podstawy-programowania-porty-io-id3648

To jest instrukcja wystarczająca, by osoba początkująca dała radę zrobić to, o co prosisz.

Jak się nie podoba zapraszam na elektrodę 😉 (szybko zmienisz zdanie)

Appendix...

Tym razem zrobię kod za Ciebie, ale Twoim zadaniem domowym jest nauczyć się z niego, co zrobiłeś źle. (Może wymagać poprawek, nie testowałem na sprzęcie).

Nie zależy nam na tym, by dawać "świeżakom" rybę, tylko tego, by się czegoś nauczyli.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13);

// Definicje ułatwiają potem zmianę np. pinu, gdyż nie musisz szukać tego wszędzie w kodzie, tylko zmieniasz aby w jednym miejscu
// Na przykład gdybyś chciał podpiąć przekaźnik do pinu 5.
#define RELAY_A 2
#define RELAY_B 3
  
// Tak samo z UART - możesz kupić moduł pracujący na 115200, a nie 9600 i co? Będziesz szukać tego w kodzie?...
#define BT_COMM_FREQ 9600
#define PC_COMM_FREQ 9600

// Przyciski tak samo jak z przekaźnikami
#define BTN_A 6
#define BTN_B 7

char btCommand; // Komenda BT, nazywaj zmienne sensownie, a nie np. 'zmienna', bo inaczej szybko zapomnisz do czego są używane
bool relayA; // Stan przekaźnika A, true = HIGH, false = LOW
bool relayB; // Stan przekaźnika B, true = HIGH, false = LOW

void setup() 
{
	// Inicjacja przycisków
	pinMode(BTN_A, INPUT_PULLUP);
	pinMode(BTN_B, INPUT_PULLUP);
	
	// Inicjacja przekaźników
	pinMode(RELAY_A, OUTPUT); // Przekaźnik 1
	pinMode(RELAY_B, OUTPUT); // Przekaźnik 2
	digitalWrite(RELAY_A, HIGH);
	digitalWrite(RELAY_B, HIGH);
	
	// Inicjacja UART
	mySerial.begin(BT_COMM_FREQ); // Połączenie do modułu
	Serial.begin(PC_COMM_FREQ); // Komunikacja z komputerem
}

void loop() 
{

	// Bluetooth kontroluje przekaźniki
	if( mySerial.available() > 0 ) 
	{
		btCommand = mySerial.read();
		Serial.println(btCommand); 
	}
	
	// Odczyt komend z BT przełącza zmienne flagowe na odpowiednie wartości
	if( btCommand == 'a' ) 
	{ // Jeżeli w warunku występuje tylko jedna instrukcja to można pominąć klamry, tutaj zostały dla czytelności
		relayA = false;		
	}
	else if( btCommand == 'b' ) 
	{
		relayB = false;
	}
	else if( btCommand == '9' ) 
	{
		relayA = relayB = false;
	}
	else if( btCommand == 'A' ) 
	{
		relayA = true;
	}
	else if( btCommand == 'B' ) 
	{
		relayB = true;
	}
	else if( btCommand == 'I' ) 
	{
		relayA = relayB = true;
	}
	
	/* Musisz wyczyścić bufor komendy, bo inaczej program będzie 
powtwarzał ją w nieskończoność i wciskanie przycisku nic Ci nie da	*/
	btCommand = 0x0; // Brak operacji (0x0)
	
	// Kod przycisków - przełącza dany przekaźnik naprzemiennie
	if(digitalRead(BTN_A) == LOW) 
		relayA = !relayA; // Tutaj przykład z pominięciem klamr
  
	if(digitalRead(BTN_B) == LOW)
		relayB = !relayB;

	// Wykonaj przełącznie przekaźnika. Jeżeli przekaźnik ma działać w odwrotnej polaryzacji zamień HIGH i LOW.
	digitalWrite(RELAY_A, relayA ? HIGH : LOW);
	digitalWrite(RELAY_B, relayB ? HIGH : LOW);
	
}

 

Edytowano przez H1M4W4R1
Link do komentarza
Share on other sites

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.