Skocz do zawartości

Aktywowanie solenoid poprzez poszczególne znaki w stringu. (Arduino Uno)


Nocti

Pomocna odpowiedź

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


 

IMG_20190110_174205.jpg

IMG_20190110_174929.jpg

Link do komentarza
Share on other sites

Bez komentarzy ciężko zrozumieć Twój program, więc nie zagłębiałem się w niego zbyt mocno. Z tego co rozumiem opis, to chciałbyś wysłać do Arduino string typu: "123.45", a następnie sprawdzić poszczególne znaki tego napisu, tak? Metod realizacji takiego mechanizmu jest wiele, jedną z nich będzie wykorzystanie funkcji toCharArray(), która skopiuje dany napis do tablicy znaków. Dzięki temu uzyskasz tablicę znaków, a sprawdzając wartość kolejnych elementów będziesz mógł łatwo zweryfikować kolejne znaki. Więcej na temat tej funkcji znajdziesz tutaj: https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/tochararray/

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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.

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

5 godzin temu, Nocti napisał:

Mógłbyś podsunąć mi jakiś ciekawy pomysł jak zrobić taki algorytm?

Ale tu nie ma żadnego algorytmu. Przepisanie tych wartości do tablicy to "jedna linijka" wykorzystująca podaną wyżej instrukcję. Pokaż swoje próby i daj znać gdzie dokładnie utknąłeś.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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!

Link do komentarza
Share on other sites

To ja się już pogubiłem. Poprzednio była jedna liczba i rozbicie jej na kilka znaków, a teraz mamy tablice dwumiarowe? To jak dokładnie ma działać ten program tak od strony praktycznej?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

(edytowany)

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

 

Edytowano przez Treker
Poprawiłem ortografa, bo lepiej, aby nikt go nie widział ;)
Link do komentarza
Share on other sites

To zostawmy Twój program chwilowo. Zrób sobie jakiś prosty test. Użyłeś na próbę gdzieś wskazanego przeze mnie toCharArray? We wklejonym kodzie go nie widzę 😉

Napisz sobie prosty program: deklaracja tekstu, rozbicie na tablicę i np. wyświetlenie w pętli wszystkich znaków.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

 

Link do komentarza
Share on other sites

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

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.