Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino Mega - Jak zamienić DEC na DIN?

28 Lip 2013 19:23 2031 6
  • Poziom 15  
    Buduję kokpit oparty o sześć modułów Arduino Mega . http://www.jimspage.co.nz jest moim natchnieniem , i praktycznie jestem zielony w C , C++ itp. a ostatnie wyczyny akrocyfrowe popełniałem na ZX Spectrum .Modyfikując jego programy i nieśmiało pisząc własne uczę się programowania .Tak więc jakoś sobie radziłem .Link 2fs wysyła przez przypisany com paczki informacji .Każda paczka zawiera na początku identyfikator zbioru ( ? ,= ,< ,/ ) .W tym konkretnym przypadku interesuje mnie "<" . Paczka to " <f i trzy cyfry " czyli np <f104 . f oznacza że paczka dotyczy świateł .Zauważyłem że każdy wirtualny przełącznik światła ma przypisaną inną wartość , to znaczy 2 , 4 , 8 , 16 , ....itd . Chcę przypisać w arduino piny pod wyjścia led tak , aby mieć kontrolki świateł .
    Problem polega na tym że owe 104 przypisałem pod "ledx" , a do przypisania zapisu binarnego do pinów użyłem fragmentu programu edukacyjnego gdzieś z netu .W tym programie ręcznie przypisywałem pod "val" liczbę 104 i wszystko działa , tzn "zapalają mi się piny 8 ,32 i 64 ;)

    I tu jest pytanie !! Jak przypisać wartość ledx pod val??????????????????



    A oto moje dziecko:


    #include "math.h"

    int CodeIn;
    int val = 0;
    String ledx, ledxold;
    char blank = 255;

    void setup() {

    pinMode(5, OUTPUT); // tu ustalam piny pod kontrolki
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
    Serial.begin(115200); // tu ustalam transmisję
    }

    void loop() {
    if (Serial.available()) {
    CodeIn = getChar();
    if (CodeIn == '=') {EQUALS();} // tu odbieram pierwszy znak paczki i
    if (CodeIn == '?') {QUESTION();} // kieruje mnie do odpowiedniej pętli
    if (CodeIn == '/') {SLASH();}
    if (CodeIn == '<') {LESSTHAN();}
    }
    }

    char getChar()
    {
    while(Serial.available() == 0);
    return((char)Serial.read());
    }


    void QUESTION(){
    CodeIn = getChar();
    switch(CodeIn) {

    case 'V':
    break;
    case 'd':
    break;
    }

    }
    void LESSTHAN(){
    CodeIn = getChar();
    switch(CodeIn) {
    case 'f': // tu wyławiam kolejny znak oznaczający światła
    ledx = "";
    ledx += getChar();
    ledx += getChar();
    ledx += getChar(); // tu mam już całą liczbę np. 104 przypisaną pod ledx


    if (ledx != ledxold ) { // jeżeli wartość ledx zmieniła się to

    // i tu w magiczny sposób nie mogę przypisać tego np. 104 z "ledx" do "val"

    // błagam pomocy
    // np val = ledx; nie działa i chyba zaczynam rozumieć dlaczego

    digitalWrite(5, (HIGH && (val & B10000000)));
    digitalWrite(6, (HIGH && (val & B01000000)));
    digitalWrite(7, (HIGH && (val & B00100000)));
    digitalWrite(8, (HIGH && (val & B00010000)));
    digitalWrite(9, (HIGH && (val & B00001000)));
    digitalWrite(10, (HIGH && (val & B00000100)));
    digitalWrite(11, (HIGH && (val & B00000010)));
    digitalWrite(12, (HIGH && (val & B00000001)));
    ledxold = ledx; // tu przypisuję wartość ledx pod ledxold
    }
    break;

    case 'B':
    // tu moźna coś przypisać ;)
    break;

    case 'G':

    break;
    }
    }

    void SLASH(){
    CodeIn = getChar();
    switch(CodeIn) {

    case 'B':

    break;

    case 'C':

    break;
    }
    }void EQUALS(){
    delay (1);
    CodeIn = getChar();
    switch(CodeIn) {
    case 'A':
    break;

    case 'B':

    break;

    }
    }



    To jest moja ostatnia przeszkoda do zakończenia prac z kokpitem ;)
    Mam gotowy wsad do obsługi czterech wyświetlaczy lcd (dwa 20x4 i dwa 16x2)
    z obsługą całego radio panelu i AP , podwozia i master alarmu. Piszę wsad pod wskaźniki wychyłkowe pod " poziomy paliwa , prędkości obrotowe , napięcia i wszystko inne , co można na nich pokazywać .Po zakończeniu przedstawię kompletny projekt .
  • PCBway
  • Pomocny post
    Poziom 15  
    Jednym z sposobów jest zapoznanie się z czymś takim jak ASCII i po skojarzeniu co to jest można napisać prostą funkcję, która przetworzy napis znak po znaku na liczbę. Kolejnym sposobem jak zapoznanie się z funkcjami z stdio.h tam też są cuda nie widy pozwalające wyciągnąć liczbę z napisu. Ostatnim chyba najprostszym sposobem jest zapoznanie się z dokumentacją tworu takiego jak String. Choć Arduino nie znam i nie używam po kilku sekundach wujek podpowiedział mi coś takiego jak metoda toInt(). To chyba powinno definitywnie rozwiązać sprawę.
  • PCBway
  • Poziom 15  
    Szczerze mówiąc to starałem się coś wyczytać ale teraz jestem jeszcze głupszy .Czy ktoś ma doświadczenie w programowaniu arduino mega??
  • Pomocny post
    Poziom 15  
    Próbowałeś coś takiego?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 21  
    Więc może spróbuj tak:

    Zamiast:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    napisz:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 15  
    JESTEŚ WIELKI !! Działa ;)
    Niestety 42 lata przyćmiły umysł ;( Trochę późno wziąłem się za naukę ;)
    Zrobiłem pierwszym sposobem.

    Dodam że w listingu podałem <f i trzy cyfry , a są cztery tak więc jeszcze raz dodałem:
    ledx += getChar();
    Jeszcze raz wielkie dzięki