Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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);
}
}

 

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

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.

 

  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. 

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.

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.

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

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

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