Skocz do zawartości

qro9qs

Użytkownicy
  • Zawartość

    25
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O qro9qs

  • Ranga
    3/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Zakupiłem moduł 16 przekaźników sterowanych po RS485 oraz konwerter do Arduino na RS485. Wcześniej używając płytki 8 przekaźnikowej zakupionej w kraju używałem poniższego kodu dla załączania i wyłączania konkretnych przekaźników: #include <ArduinoRS485.h> #include <ArduinoModbus.h> void setup() { Serial.begin(9600); while (!Serial); Serial.println("Modbus RTU Client Kitchen Sink"); if (!ModbusRTUClient.begin(9600)) { Serial.println("Failed to start Modbus RTU Client!"); while (1); } } void loop() { ModbusRTUClient.holdingRegisterWrite(2,0x0001,0x0100); //ustawiony adres modułu 2, przekaźnik nr 1, załączenie przekaźnika delay(1000); ModbusRTUClient.holdingRegisterWrite(2,0x0001,0x0200); //ustawiony adres modułu 2, przekaźnik nr 1, wyłączenie przekaźnika delay(1000); ModbusRTUClient.holdingRegisterWrite(2,0x0002,0x0100); //ustawiony adres modułu 2, przekaźnik nr 2, załączenie przekaźnika delay(1000); ModbusRTUClient.holdingRegisterWrite(2,0x0002,0x0200); //ustawiony adres modułu 2, przekaźnik nr 2, wyłączenie przekaźnika delay(1000); } W jaki sposób może to być rozwiązane w tym urządzeniu?
  2. Rozumiem. A nie można ze zwykłej biblioteki Keypad.h oraz PCF8574.h wbić się do tego?
  3. Aby nie tworzyć kolejnego tematu zapytam tutaj: Expander PCF8574 i klawiatura membranowa 4x4 Kod do klawiatury już gotowy. Expander zadeklarowany, łączy się itd. Pojedyncze piny zapisujemy przy pomocy kodu jak poniżej, jednak w jaki sposób zapisać, że klawiatura działa przez PCF8574, a nie bezpośrednio z Arduino? expander.digitalWrite(1, HIGH); #include <PCF8574.h> #include <Wire.h> PCF8574 expander; const byte ROWS = 4; // ile wierszy const byte COLS = 4; //ile kolumn byte rowPins[ROWS] = {1, 2, 3, 4}; //piny wierszy byte colPins[COLS] = {5, 6, 7, 8}; //piny kolum char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; void setup() { Serial.begin (9600); expander.begin(0x3A); } void loop() { char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey); }
  4. Zainspirowany produktami z zachodu chcę stworzyć kompas wskazujący pozycję horyzontalną anteny, która znajduje się około 50m dalej na maszcie. KOMPAS - BOTLAND Powyższe cudo komunikuje się z Arduino przy pomocy I2C, które ma ograniczoną odległość komunikacji. Na 50m nie wystarczy. Jak najprościej przygotować taką transmisję?
  5. Dla wszystkich zainteresowanych temat rozwiązany. Warunek należy zawrzeć w void loop() Dziękuję za pomoc! void loop(){ if(expander1.digitalRead(1) == HIGH){ Usb.Task(); } }
  6. Wygrałeś. Teraz pracuje jak należy. Dziękuje serdecznie! Poniżej ostateczny kod: #include <hidboot.h> #include <usbhub.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <SPI.h> class KbdRptParser : public KeyboardReportParser { void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; Serial.print((mod.bmLeftCtrl == 1) ? "C" : " "); Serial.print((mod.bmLeftShift == 1) ? "S" : " "); Serial.print((mod.bmLeftAlt == 1) ? "A" : " "); Serial.print((mod.bmLeftGUI == 1) ? "G" : " "); Serial.print(" >"); PrintHex<uint8_t>(key, 0x80); Serial.print("< "); Serial.print((mod.bmRightCtrl == 1) ? "C" : " "); Serial.print((mod.bmRightShift == 1) ? "S" : " "); Serial.print((mod.bmRightAlt == 1) ? "A" : " "); Serial.println((mod.bmRightGUI == 1) ? "G" : " "); }; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { Serial.print("DN "); PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c) OnKeyPressed(c); } void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { pinMode(2, OUTPUT); pinMode(3, OUTPUT); Serial.print("UP "); PrintKey(mod, key); switch(key){ case 0x53: digitalWrite(2, HIGH);digitalWrite(3,LOW); break; case 0x5F: digitalWrite(3, HIGH);digitalWrite(2,LOW); break; } } void KbdRptParser::OnKeyPressed(uint8_t key) { }; USB Usb; HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); KbdRptParser Prs; void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif if (Usb.Init() == -1) Serial.println("OSC did not start."); HidKeyboard.SetReportParser(0, &Prs); } void loop(){ Usb.Task(); } Przy okazji jeszcze jedno pytanie. Gdy np. PIN10 jest rozwarty klawiatura działa i wykonują się kolejne polecenia. Gdy PIN10 zostanie zwarty do masy klawiatura ma nie być aktywna. Jednocześnie wszystkie wybrane wcześniej polecenia zostają nie ruszone. Przy klawiaturze membranowej zastosowałem zwykły if przed getchar. W jaki sposób zastosować to w omawianym w temacie kodzie?
  7. Tak próbowałem, również nie wypluwa po zadeklarowaniu case jako case '0x5F': digitalWrite(3, HIGH);
  8. Niestety żaden z proponowanych pomysłów nie pracuje. Zapytam raz jeszcze....gdzie powinienem umieścić w głownym kodzie switcha oraz w jaki sposób zadeklarować go? Switch po keyu i case z liczbami jak np. '53' lub '5F' nie działa. Switch: pinMode(2, OUTPUT); pinMode(3, OUTPUT); switch(????){ case 'klawisz oznaczony jako 53': digitalWrite(2, HIGH), digitalWrite(3, LOW);break; case 'klawisz oznaczony jako 5F': digitalWrite(2, LOW), digitalWrite(3, HIGH);break; } Główny kod: #include <hidboot.h> #include <usbhub.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <SPI.h> class KbdRptParser : public KeyboardReportParser { void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; Serial.print((mod.bmLeftCtrl == 1) ? "C" : " "); Serial.print((mod.bmLeftShift == 1) ? "S" : " "); Serial.print((mod.bmLeftAlt == 1) ? "A" : " "); Serial.print((mod.bmLeftGUI == 1) ? "G" : " "); Serial.print(" >"); PrintHex<uint8_t>(key, 0x80); Serial.print("< "); Serial.print((mod.bmRightCtrl == 1) ? "C" : " "); Serial.print((mod.bmRightShift == 1) ? "S" : " "); Serial.print((mod.bmRightAlt == 1) ? "A" : " "); Serial.println((mod.bmRightGUI == 1) ? "G" : " "); }; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { Serial.print("DN "); PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c) OnKeyPressed(c); } void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { Serial.print("UP "); PrintKey(mod, key); } void KbdRptParser::OnKeyPressed(uint8_t key) { }; USB Usb; HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); KbdRptParser Prs; void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif if (Usb.Init() == -1) Serial.println("OSC did not start."); HidKeyboard.SetReportParser(0, &Prs); } void loop(){ Usb.Task(); }
  9. Również nie działa, poza tym kolejny przycisk to 5F a tutaj wyskakuje błąd jeśli niema apostrofów.
  10. W ten sposób nie działa, chyba, że coś zapisałem źle? void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { pinMode(2, OUTPUT); Serial.print("UP "); PrintKey(mod, key); switch(key){ case '53': digitalWrite(2, HIGH); break; } }
  11. #include <hidboot.h> #include <usbhub.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <SPI.h> class KbdRptParser : public KeyboardReportParser { void PrintKey(uint8_t mod, uint8_t key); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; Serial.print((mod.bmLeftCtrl == 1) ? "C" : " "); Serial.print((mod.bmLeftShift == 1) ? "S" : " "); Serial.print((mod.bmLeftAlt == 1) ? "A" : " "); Serial.print((mod.bmLeftGUI == 1) ? "G" : " "); Serial.print(" >"); PrintHex<uint8_t>(key, 0x80); Serial.print("< "); Serial.print((mod.bmRightCtrl == 1) ? "C" : " "); Serial.print((mod.bmRightShift == 1) ? "S" : " "); Serial.print((mod.bmRightAlt == 1) ? "A" : " "); Serial.println((mod.bmRightGUI == 1) ? "G" : " "); }; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { Serial.print("DN "); PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c) OnKeyPressed(c); } void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { Serial.print("UP "); PrintKey(mod, key); } void KbdRptParser::OnKeyPressed(uint8_t key) { Serial.print("ASCII: "); Serial.println((char)key); }; USB Usb; HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb); KbdRptParser Prs; void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif if (Usb.Init() == -1) Serial.println("OSC did not start."); HidKeyboard.SetReportParser(0, &Prs); pinMode(2, OUTPUT); } void loop() { Usb.Task(); digitalWrite(2, LOW); switch(???????????){ case '?????????': digitalWrite(2, HIGH); break; } } Załadowałem taki kod, odczytuje poprzez host USB z klawiatury numerycznej. Przykładowo na zdjęciu odczytane kolejno klawisze ,,Num Lock", ,,7", ,,4", ,,1", ,,0". Chcę odwołać się do tego za pomocą switcha, aby klikając np. przycisk ,,Num Lock" na PIN 2 podawany był stan wysoki. W jaki sposób odnieść się do tego? Co zawrzeć zamiast znaków zapytania w ostatnich liniach kodu?
  12. Świetnie, dziękuję. Myślę, że to pomoże. Czy wiesz może, czy piny cyfrowe 2-13 są w dalszym ciągu do użytku (na górze płytki są wyprowadzenia) czy są już one wykorzystywane przez ten układ?
  13. Posiadam aktualnie układ pracujący z klawiaturą membranową 4x4. Działa poprawnie Naszła mnie chęć wymiany jej na klawiaturę numeryczną USB. Czy da się to zrealizować w arduino po tych 4 przewodach? Ktoś ma to już za sobą bądź jest mi w stanie pomóc?
  14. #include <Keypad.h> //biblioteka od klawiatury #include <LiquidCrystal_I2C.h> //biblioteka dla LCD z I2C #include <Wire.h> const byte ROWS = 4; // ile wierszy const byte COLS = 4; //ile kolumn byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy byte colPins[COLS] = {6, 7, 8, 9}; //piny kolum int previousMode = -1; //definiowanie zmiennej zapamiętującej pasmo int currentMode = -1; //definiowanie zmiennej zapamiętującej pasmo char keys[ROWS][COLS] = { //mapowanie klawiatury {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury LiquidCrystal_I2C lcd(0x27, 20, 4); //stworzony obiekt LCD o podanych z I2C Scanner parametrach int odczytanaWartosc0; //odczytanie wartości napięcia na wejściu A0 do wyboru pasma /**************************************************/ void setup(){ lcd.begin(); lcd.setCursor(0, 0); //Ustawienie kursora pinMode(13, INPUT); //wejście PTT } /**************************************************/ void loop(){ if(currentMode != previousMode){ lcd.clear(); previousMode = currentMode; }//warunek do czyszczenia wyświetlacza przy zmianie pasma odczytanaWartosc0 = analogRead(A0); Serial.println(odczytanaWartosc0); //odczytanie wartości napięcia na A0 dla wybranego pasma char klawisz; if(digitalRead(13) == HIGH){ klawisz = klawiatura.getKey(); } Serial.println(klawisz); //blokada klawiatury jeśli TX i odczytanie znaku z klawiatury /**************************160M************************/ if (odczytanaWartosc0 >= 0 && odczytanaWartosc0 <= 100) { currentMode = 0; lcd.setCursor(0,0); lcd.print("Band:160M"); lcd.setCursor(2,1); lcd.print("Vertical"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /**************************80M************************/ else if (odczytanaWartosc0 >= 110 && odczytanaWartosc0 <= 160) { currentMode = 1; lcd.setCursor(0,0); lcd.print("Band:80M"); lcd.setCursor(2,1); lcd.print("Spitfire"); lcd.setCursor(2,2); lcd.print("Delta"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,2); lcd.print(" "); break; case '2': lcd.setCursor(0,2); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break; case 'A': lcd.setCursor(10,1);lcd.print(":USA ");break; case 'B': lcd.setCursor(10,1);lcd.print(":JA ");break; case 'C': lcd.setCursor(10,1);lcd.print(":VK ");break; case 'D': lcd.setCursor(10,1);lcd.print(":PY ");break; case '#': lcd.setCursor(10,1);lcd.print(":CENT");break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /***************************40M***********************/ else if (odczytanaWartosc0 >= 240 && odczytanaWartosc0 <= 300) { currentMode = 2; lcd.setCursor(0,0); lcd.print("Band:40M"); lcd.setCursor(2,1); lcd.print("Yagi"); lcd.setCursor(2,2); lcd.print("Vertical"); lcd.setCursor(12,0); //K9AY lcd.print("K9AY:"); //K9AY switch(klawisz){ case '1': lcd.setCursor(0,1); lcd.print((char)255);lcd.setCursor(0,2); lcd.print(" "); break; case '2': lcd.setCursor(0,2); lcd.print((char)255);lcd.setCursor(0,1); lcd.print(" "); break; case 'A': lcd.setCursor(7,1);lcd.print(":Front ");break; case 'B': lcd.setCursor(7,1);lcd.print(":Back ");break; case 'C': lcd.setCursor(7,1);lcd.print(":Center");break; case '7': lcd.setCursor(17,0);lcd.print("USA");break; //K9AY case '8': lcd.setCursor(17,0);lcd.print("JA ");break; //K9AY case '0': lcd.setCursor(17,0);lcd.print("VK ");break; //K9AY case '*': lcd.setCursor(17,0);lcd.print("PY ");break; //K9AY } } /************************20M**************************/ else if (odczytanaWartosc0 >= 350 && odczytanaWartosc0 <= 450) { currentMode = 3; lcd.setCursor(0,0); lcd.print("Band:20M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } /************************15M**************************/ else if (odczytanaWartosc0 >= 500 && odczytanaWartosc0 <= 600) { currentMode = 4; lcd.setCursor(0,0); lcd.print("Band:15M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } /************************10M**************************/ else if (odczytanaWartosc0 >= 650 && odczytanaWartosc0 <= 700) { currentMode = 5; lcd.setCursor(0,0); lcd.print("Band:10M"); lcd.setCursor(2,1); lcd.print("OB16-3"); lcd.setCursor(2,2); lcd.print("QQ 2el"); switch(klawisz){ case '1': lcd.clear();lcd.setCursor(0,1); lcd.print((char)255); digitalWrite(10,HIGH);break; case '2': lcd.clear();lcd.setCursor(0,2); lcd.print((char)255); digitalWrite(10,HIGH);break; } } } Udało się poprawić kod i co nieco dodać. Ekran czyści się po zmianie pasma instrukcją if. Dodatkowo dołożona funkcja, która blokuje działanie klawiatury (dzięki której możemy zmienić antenę i jej kierunek) gdy mamy załączony nadajnik aby nie uszkodzić przekaźników wykonawczych łukiem elektrycznym.
×
×
  • Utwórz nowe...