Skocz do zawartości

Nocti

Użytkownicy
  • Zawartość

    14
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O Nocti

  • Ranga
    2/10
  • Urodziny 07.02.2006

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Zabrze
  • Języki programowania
    c/c++
  • Zainteresowania
    Programowanie webowe, elektronika,

Ostatnio na profilu byli

235 wyświetleń profilu
  1. Nocti

    Bluethooth przesyła dziwne znaki.

    Przepraszam że nie odpowiadałem tak długo. Wpadłem na pomysł aby to rozwiązać. Polega on na tym aby zapisać sygnał do dwóch tablic, a później sprawdzać czy przesłane znaki są jednakowe. Czy taki pomysł mógł by wypalić?
  2. Witam. Przepraszam za niejasny tytuł. Zrobiłem program (używając Arduino Uno i modułu bluethooth HC-06) który ma wyświetlać w konsoli liczby, które prześle przez Bluethooth. Problem polega na tym, że czasem zamiast liczb które chce przesłać pojawiają się dziwne znaki. Liczby muszą być przechowywane w Stringu. Jak to naprawić? #include <SoftwareSerial.h> SoftwareSerial BT(0, 1); void setup() { BT.begin(9600); } String liczba[15]; char a[6]; void loop() { if (BT.available()) { liczba[1]=BT.readStringUntil('\n'); BT.println(liczba[1]); delay(500); } }
  3. Udało się!!! Dziękuję za pomoc! W przyszłości będę rozbudowywał to urządzenie, o moduł bluetooth do wpisywania numerów z telefonu. Jeśli będę miał jakieś programy będę pisał. Gotowy program: #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <EasyButton.h> /*#define czasZatw 200 #define czas000 5000 #define czasSolen 1000 #define czasNaci 500*/ // Narazie bezużyteczne #define odstepKropka 10000 #define czasNacisniecia 2000 #define czasNacisniecia000 2000 //Definicje czasów #define odstep 5000 #define czasGoraDol 200 #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7); EasyButton zatw(A0); EasyButton wdol(A1); //Zmienne Easy Button EasyButton wgore(A2); String a[17]; //Stringi w których zapisane są liczby char Char[6]; //Char do którego kopiowane są znaki ze stringów int b; //Zmienna przechowująca numer pozycji liczby (stringa) void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); zatw.begin(); wdol.begin(); wgore.begin(); zatw.onPressed(ztawierdz); wdol.onPressed(dol); //Przypisywanie funkcji do zmiennych Easy Button wgore.onPressed(gora); lcd.begin (16, 2); lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0, 0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0, 1); lcd.print("Nastepny: "); lcd.print(a[b + 1]); a[16] = "------"; a[15] = "------"; a[14] = "15.30"; a[13] = "14.03"; a[12] = "13.01"; a[11] = "12.35"; a[10] = "11"; a[9] = "10"; a[8] = "9"; //Zapisywanie zmiennych do tablicy stringu a[7] = "8.44"; a[6] = "7"; a[5] = "6.26"; a[4] = "123.45"; a[3] = "4.03"; a[2] = "3"; a[1] = "751.3"; a[0] = "0.45"; } void ztawierdz() { //Funkcja odpowiadająca za przycisk "Zatwierdź" char Char[6] = {' ', ' ', ' ', ' ', ' ', ' '}; Serial.println(b); Serial.println(a[b]); a[b].toCharArray(Char, 6); digitalWrite(2, HIGH); delay(czasNacisniecia); digitalWrite(2, LOW); for (int i = 0; i <= 9; i++) { if (Char[i] == '0') { //Sprawdzanie liczb Serial.println(Char[i]); delay(odstep); digitalWrite(3, HIGH); delay(czasNacisniecia); digitalWrite(3, LOW); } else if (Char[i] == '1') { Serial.println(Char[i]); delay(odstep); digitalWrite(4, HIGH); delay(czasNacisniecia); digitalWrite(4, LOW); } else if (Char[i] == '2') { Serial.println(Char[i]); delay(odstep); digitalWrite(5, HIGH); delay(czasNacisniecia); digitalWrite(5, LOW); } else if (Char[i] == '3') { Serial.println(Char[i]); delay(odstep); digitalWrite(6, HIGH); delay(czasNacisniecia); digitalWrite(6, LOW); } else if (Char[i] == '4') { Serial.println(Char[i]); delay(odstep); digitalWrite(7, HIGH); delay(czasNacisniecia); digitalWrite(7, LOW); } else if (Char[i] == '5') { Serial.println(Char[i]); delay(odstep); digitalWrite(8, HIGH); delay(czasNacisniecia); digitalWrite(8, LOW); } else if (Char[i] == '6') { Serial.println(Char[i]); delay(odstep); digitalWrite(9, HIGH); delay(czasNacisniecia); digitalWrite(9, LOW); } else if (Char[i] == '7') { Serial.println(Char[i]); delay(odstep); digitalWrite(10, HIGH); delay(czasNacisniecia); digitalWrite(10, LOW); } else if (Char[i] == '8') { Serial.println(Char[i]); delay(odstep); digitalWrite(11, HIGH); delay(czasNacisniecia); digitalWrite(11, LOW); } else if (Char[i] == '9') { Serial.println(Char[i]); delay(odstep); digitalWrite(12, HIGH); delay(czasNacisniecia); digitalWrite(12, LOW); } else if (Char[i] == '.') { Serial.println(Char[i]); delay(odstepKropka); digitalWrite(2, HIGH); delay(czasNacisniecia); digitalWrite(2, LOW); } } } void dol() { //Funkcja odpowiadająca za przycisk "w dół" if (b < 16 && b >= 1) { lcd.clear(); Serial.println("w dol!!!"); b--; lcd.setCursor(0, 0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0, 1); lcd.print("Nastepny: "); lcd.print(a[b + 1]); digitalWrite(13, HIGH); delay(czasGoraDol); digitalWrite(13, LOW); } } void gora() { //Funkcja odpowiadająca za przycisk "w górę" if (b < 15) { lcd.clear(); Serial.println("w gore!!!"); b++; lcd.setCursor(0, 0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0, 1); lcd.print("Nastepny: "); lcd.print(a[b + 1]); digitalWrite(13, HIGH); delay(czasGoraDol); digitalWrite(13, LOW); } } void loop() { zatw.read(); wdol.read(); //Aktywowanie funkcji zatwierdz, dol, gora wgore.read(); }
  4. Ok, tylko co oznacza ten buffor w tym toCharrArray?
  5. Zmienna "a" jest stringiem w tablicy. A że string jest już sam w sobie jest tablicą stąd dwa wymiary tablicy. "b" Jest zmienną odpowiadającą za wiersze, a "poszczególny znak" za kolumny. Chyba, że źle myślę.
  6. Przepraszam że trochę pogmatwałem. Program ma działać w ten sposób że bierze wybranego w menu stringa i dzieli go na poszczególne znaki. Jeśli pierwszy znak tego stringa to 1 zapal diodę przypisaną do jedynki, jeśli nie sprawdź czy znakiem tym jest 2 i tak dalej... Po sprawdzeniu jednego znaku ma przejść do kolejnego znaku tego samego stringa aż do końca. Z tymi dwuwymiarowymi tablicami coś mi się pomieszało. Mają być jednowymiarowe.
  7. Przepraszam, że tak długo nie odpisywałem. Miejsce w którym utknąłem to void zatwierdz: void ztawierdz() { if (b < 16 && b >= 0) { lcd.clear(); Serial.println("zatwierdzono!!!"); b++; lcd.setCursor(0, 0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0, 1); lcd.print("Nastepny: "); lcd.print(a[b + 1]); digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); delay(czasZatw); digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); delay(czasZatw); digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); digitalWrite(2, HIGH); delay(czasSolen); digitalWrite(2, LOW); delay(czasNaci); if (a[b][poszczególny znak] == 0) { //Od tej linijki utknąłem digitalWrite(3, HIGH); delay(czasSolen); digitalWrite(3, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 1) { digitalWrite(4, HIGH); delay(czasSolen); digitalWrite(4, LOW); delay(czasNaci); } if (a[b][tutaj nie wiem co dać] == 2) { digitalWrite(5, HIGH); delay(czasSolen); digitalWrite(5, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 3) { digitalWrite(6, HIGH); delay(czasSolen); digitalWrite(6, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 4) { digitalWrite(7, HIGH); delay(czasSolen); digitalWrite(7, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 5) { digitalWrite(8, HIGH); delay(czasSolen); digitalWrite(8, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 6) { digitalWrite(9, HIGH); delay(czasSolen); digitalWrite(9, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 7) { digitalWrite(10, HIGH); delay(czasSolen); digitalWrite(10, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 8) { digitalWrite(11, HIGH); delay(czasSolen); digitalWrite(11, LOW); delay(czasNaci); } if (a[b][poszczególny znak] == 9) { digitalWrite(12, HIGH); delay(czasSolen); digitalWrite(12, LOW); delay(czasNaci); } } } Tam gdzie jest "poszczególny znak" będzie zmienna odpowiadająca za numer pojedynczej komórki w wierszu(b) tablicy a. Nie wiem jak zrobić, aby program sprawdzał pojedyncze znaki w wierszu tablicy a. Trochę pozmieniałem ale nie powinno być problemu. Jeszcze raz przepraszam, że nie odpisywałem!
  8. Siedzę już trochę nad tym programem i nadal pustka w głowie Mógłbyś podsunąć mi jakiś ciekawy pomysł jak zrobić taki algorytm? Byłbym wdzięczny.
  9. Dokładnie o to mi chodziło. Dziękuję za pomoc. Gdybym miał jeszcze jakieś problemy będę pisał!
  10. Cześć!!! Podczas pisania kodu programu natrafiłem na problem. Pisze program w którym każdy solenoid (na razie dioda) odpowiada, numerowi. Na ekranie wyświetla się coś w stylu menu z liczbami, którym steruje się dwoma przyciskami (góra[1], dół[2]). Po wybraniu opcji zatwierdza się ją przyciskiem[3]. Problem polega na tym, że nie wiem jak zrobić aby program "wykrywał" pojedyncze liczby i zaświetlił odpowiednie diody. np. Liczba: 1 2 3 . 4 5 Diody: 4 5 6 2 7 8 Solenoidy będą naciskały klawiaturę numeryczną. Nie da się wpiąć bezpośrednio do urządzenia (Czyli do wielkich ekranów 7-dmio segmentowych, którymi steruje ww. klawiatura.). Kiedyś pisałem już temat na tym forum dotyczący tego samego programu: https://tiny.pl/txc4v Z góry dziękuję!!! #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <EasyButton.h> #define czasZatw 200 #define czasGoraDol 200 #define czas000 5000 #define czasSolen 1000 #define czasNaci 500 #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); EasyButton zatw(A0); EasyButton wdol(A1); EasyButton wgore(A2); int array[15] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 }; String a[17]; short b=-1; byte d=0; byte c=0; byte g=1; byte h=2; byte i=3; byte j=4; byte k=5; byte l=6; byte m=7; byte n=8; byte o=9; void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); Serial.begin(115200); zatw.begin(); wdol.begin(); wgore.begin(); zatw.onPressed(ztawierdz); wdol.onPressed(dol); wgore.onPressed(gora); pinMode(13,OUTPUT); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); a[16]="------"; a[15]="------"; a[14]="15.30"; a[13]="14.03"; a[12]="13.01"; a[11]="12.35"; a[10]="11"; a[9]="10"; a[8]="9"; a[7]="8.44"; a[6]="7"; a[5]="6.26"; a[4]="5.04"; a[3]="4.03"; a[2]="3"; a[1]="751.3"; a[0]="0.45"; } void ztawierdz() { if(b<16&&b>=0) { lcd.clear(); Serial.println("zatwierdzono!!!"); b++; c++; lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); b=c; digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); delay(czasZatw); digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); delay(czasZatw); digitalWrite(13, HIGH); delay(czasZatw); digitalWrite(13, LOW); digitalWrite(2,HIGH); delay(czasSolen); digitalWrite(2,LOW); delay(czasNaci); if(a[0][0]%g){ digitalWrite(3,HIGH); delay(czasSolen); digitalWrite(3,LOW); delay(czasNaci); } if(a[0][0]%h) { digitalWrite(4,HIGH); delay(czasSolen); digitalWrite(4,LOW); delay(czasNaci); } if(a[c][d]==h) { digitalWrite(5,HIGH); delay(czasSolen); digitalWrite(5,LOW); delay(czasNaci); } if(a[c][d]==i) { digitalWrite(6,HIGH); delay(czasSolen); digitalWrite(6,LOW); delay(czasNaci); } if(a[c][d]==j) { digitalWrite(7,HIGH); delay(czasSolen); digitalWrite(7,LOW); delay(czasNaci); } if(a[c][d]==k) { digitalWrite(8,HIGH); delay(czasSolen); digitalWrite(8,LOW); delay(czasNaci); } if(a[c][d]==l) { digitalWrite(9,HIGH); delay(czasSolen); digitalWrite(9,LOW); delay(czasNaci); } if(a[c][d]<m) { digitalWrite(10,HIGH); delay(czasSolen); digitalWrite(10,LOW); delay(czasNaci); } if(a[c][d]==n) { digitalWrite(11,HIGH); delay(czasSolen); digitalWrite(11,LOW); delay(czasNaci); } if (a[c][d]==o) { digitalWrite(12,HIGH); delay(czasSolen); digitalWrite(12,LOW); delay(czasNaci); } d+1; } } void dol() { if(b<16&&b>=1) { lcd.clear(); Serial.println("w dol!!!"); b--; lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); digitalWrite(13, HIGH); delay(czasGoraDol); digitalWrite(13, LOW); } } void gora() { if(b<15) { lcd.clear(); Serial.println("w gore!!!"); b++; lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); digitalWrite(13, HIGH); delay(czasGoraDol); digitalWrite(13, LOW); } } void loop() { zatw.read(); wdol.read(); wgore.read(); }
  11. Cześć!!! Przepraszam, że tak długo nie odpowiadałem. Za namową @Treker , poczytałem trochę o drganiach styków. Pogrzebałem trochę w internecie i znalazłem bibliotekę Easy Button. Dzięki niej rozwiązałem problem. Kod trochę się pozmieniał : #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <EasyButton.h> #define czasDef 1000 #define czas000 5000 #define czasPrzy 5000 #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); EasyButton zatw(A0); EasyButton wdol(A1); EasyButton wgore(A2); int array[15] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 }; String a[17]; int b=0; void setup() { Serial.begin(115200); zatw.begin(); wdol.begin(); wgore.begin(); zatw.onPressed(ztawierdz); wdol.onPressed(dol); wgore.onPressed(gora); pinMode(13,OUTPUT); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); a[16]="------"; a[15]="------"; a[14]="15.30"; a[13]="14.03"; a[12]="13.01"; a[11]="12.35"; a[10]="11"; a[9]="10"; a[8]="9"; a[7]="8.44"; a[6]="7"; a[5]="6.26"; a[4]="5.04"; a[3]="4.03"; a[2]="3"; a[1]="2.10"; a[0]="1"; } void ztawierdz() { Serial.println("zatwierdzono!!!"); //Niedokończone } void dol() { if(b<16){ lcd.clear(); Serial.println("w dol!!!"); digitalWrite(13, HIGH); lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); b--; } else b=0; } void gora() { if(b<16) { lcd.clear(); Serial.println("w gore!!!"); lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); b++; } } void loop() { zatw.read(); wdol.read(); wgore.read(); }
  12. @Treker, dzięki za odpowiedź! Chciałbym cię zapytać o jeszcze jedną rzecz. Mój program ma zwiększać wyświetlany "poziom" tablicy o jeden. problem jest w tym że nie wiem, jak zrobić, aby po jednym naciśnięciu tablica zmieniał się o jeden, nawet jeżeli naciskam przycisk długo.(później zamierzam zrobić coś jeszcze w tym programie po przytrzymaniu przycisku.)Teraz po naciśnięciu przycisku pętla while wykonuje się kilka razy. Ps. Przepraszam, że problem opisuje dosyć nieudolnie ale pisze to na kolanie. Na razie kod wygląda tak: #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); int array[15] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 }; int i,b; void setup() { pinMode(13,OUTPUT); pinMode(12, INPUT_PULLUP); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); } void loop() { String a[15]; int b=0; a[14]="434.30"; a[13]="426.03"; a[12]="664.01"; a[11]="649.35"; a[10]="568"; a[9]="346"; a[8]="256"; a[7]="545.44"; a[6]="454"; a[5]="265.26"; a[4]="257.04"; a[3]="364.03"; a[2]="858"; a[1]="750.10"; a[0]="388"; while (digitalRead(12) == LOW) { lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[b]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[b+1]); b++; if (digitalRead(12) == LOW) //Jeśli przycisk wciśnięty { digitalWrite(13, HIGH); //Włącz diodę } else //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty) { digitalWrite(13, LOW); //Wyłącz diodę } } }
  13. #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define BACKLIGHT_PIN 3 LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); String a[14]; void setup() { lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); pinMode(13,OUTPUT); pinMode(12, INPUT_PULLUP); a[14]="434.30"; a[13]="426.03"; a[12]="664.01"; a[11]="649.35"; a[10]="568"; a[9]="346"; a[8]="256"; a[7]="545.44"; a[6]="454"; a[5]="265.26"; a[4]="257.04"; a[3]="364.03"; a[2]="858"; a[1]="750.10"; a[0]="100"; } void loop() { lcd.setCursor(0,0); lcd.print("Aktualny: "); lcd.print(a[1]); lcd.setCursor(0,1); lcd.print("Nastepny: "); lcd.print(a[0]); if(digitalRead(12) == LOW); //Jeśli przycisk wciśnięty { digitalWrite(13, HIGH); //Włącz diodę delay(100); digitalWrite(13,LOW); } } Po wgraniu podświetlenie wyświetlacza LCD miga, i niczego nie wyświetla. Proszę o pomoc! Z góry dziękuję!
×