Skocz do zawartości

Arduino w modelarstwie kolejowym


prezesedi

Pomocna odpowiedź

4 minuty temu, ethanak napisał:

Rozumiem ze chodzi o samą koncepcję a nie konkretny kod.

Tak tak..jak najbardziej chodzi o koncepcję...napewno się to kiedyś przydać może gdzie trzeba będzie wpisać jakąś liczbe do sterowania... dzięki za odpowiedź 😉

Link do komentarza
Share on other sites

Tak więc po dłuższym zastanowieniu, przyuczeniu i pogmeraniu w kodzie z pomocą "sami wiecie kogo" 🙂 otrzymałem oto taki kod:

#include <Keypad.h>

      // ustawienie klawiatury
const byte ROWS = 4; //cztery rzędy
const byte COLS = 4; //trzy kolumny
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}};

        // podłączenie klawiatury do Arduino   
byte rowPins[ROWS] = {9, 8, 7, 6};  //Piny, do których podłączamy wyprowadzenia od rzędów
byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn

Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );

static uint32_t seqKeyTimer;
static uint8_t seqKeyState;

#define SEQKEY_TIMEOUT 1500UL
#define SEQ_PREFIX(a) ((char *)((a) >> 8))
#define SEQ_KEY(a) ((char *)((a) & 255))
#define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff))

uint16_t getSequenceKey(void)
{
    uint8_t k = keypad.getKey();
    
    if (!k) {
        // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy
        if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) {
            seqKeyState = 0;
        }
        return 0;
    }
    if (k >= 'A' && k <= 'D') {
        seqKeyState = k;
        seqKeyTimer = millis();
        return 0;
    }
    if (!seqKeyState) {
        // nie było prefiksu
        return 0;
    }
    uint16_t rc = (seqKeyState << 8) | k;
    seqKeyState = 0;
    return rc;
}


void setup() {
  
  pinMode(A0, OUTPUT); //Dioda zielona
  pinMode(10, OUTPUT); //Dioda pomarańczowa1
  pinMode(11, OUTPUT); //Dioda czerwona
  pinMode(12, OUTPUT); //Dioda pomarańczowa2
  pinMode(13, OUTPUT); //Dioda biała
 
  digitalWrite(A0, LOW); //Wyłączenie diod
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}
 
void loop()
{
	uint16_t key = getSequenceKey();

	switch(key) {
		case SEQ_COMBINE('A','1'):
		// kod dla wyświetlania S1
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH); //czerwona
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  break;

		case SEQ_COMBINE('A','2'):
		// kod dla wyświetlania S2
    Serial.println("OK");
  digitalWrite(A0, HIGH); //zielona
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
    break;
  
		case SEQ_COMBINE('A','3'):
	  // kod dla wyświetlania S3
    Serial.println("OK");
  digitalWrite(A0, HIGH); //zielona on
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(A0, LOW); //zielona off
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
    break;

		case SEQ_COMBINE('A','4'):
	  // kod dla wyświetlania S4
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, HIGH); //pomarańczowa1 on
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(A0, LOW);
  digitalWrite(10, LOW); //pomarańczowa1 off
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  delay(500);
    break;

		case SEQ_COMBINE('A','5'):
	  // kod dla wyświetlania S5
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, HIGH); //pomarańczowa1
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
    break;

		case SEQ_COMBINE('A','6'):
	  // kod dla wyświetlania S10
    Serial.println("OK");
  digitalWrite(A0, HIGH); //zielona
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
    break;

		case SEQ_COMBINE('A','7'):
	  // kod dla wyświetlania S11
    Serial.println("OK");
  digitalWrite(A0, HIGH); //zielona on
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(A0, LOW); //zielona off
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
  delay(500);
    break;

		case SEQ_COMBINE('A','8'):
	  // kod dla wyświetlania S12
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, HIGH); //pomarańczowa1 on
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(A0, LOW);
  digitalWrite(10, LOW); //pomarańczowa1 off
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
  delay(500);
    break;

		case SEQ_COMBINE('A','9'):
	  // kod dla wyświetlania S13
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, HIGH); //pomarańczowa1
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH); //pomarańczowa2
  digitalWrite(13, LOW);
    break;

		case SEQ_COMBINE('A','0'):
	  // kod dla wyświetlania Sz
    Serial.println("OK");
  digitalWrite(A0, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH); //czerwona
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH); //biała on
  delay(500);
  digitalWrite(A0, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH); //czerwona
  digitalWrite(12, LOW);
  digitalWrite(13, LOW); //biała off
  delay(500);
    break;
  }
}

dziwne jest to, że wszystkie migające sygnały, w zasadzie migną raz i pozostają wyłączone. Przykładowo dla A0 (sygnał Sz) zaświecają się czerwona z białą, po czym biała gaśnie i nic więcej się nie dzieje.

  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, prezesedi napisał:

Przykładowo dla A0 (sygnał Sz) zaświecają się czerwona z białą, po czym biała gaśnie i nic więcej się nie dzieje.

Przecież tak masz w programie:

  1. Zapal czerwona i białą
  2. Poczekaj pół sekundy
  3. Zgaś białą
  4. Poczekaj pół sekundy czort wie po co
  5. Nic nie rób dalej

Pisałem jak ma wyglądać funkcja loop, bez żadnych ifów, casów, switchów, tylko wywołanie funkcji odpowiedzialnych za dany fragment programu, a Ty się upierasz zrobić po swojemu. To co ja mam w tej sytuacji zrobić? Dopisywać kolejne linijki to tego gniota?

 

Link do komentarza
Share on other sites

Witam wszystkich Forumowiczów po blisko rocznej przerwie.

Z wielką pomocą kolegów @ethanak oraz @farmaceuta uzyskałem kod potrzebny do sterowania dwoma zestawami po 5szt. diod (w domyśle dwa semafory z 5 sygnalizatorami) za pomocą klawiatury.

Schemat i kod prezentują się następująco:

forbot1.thumb.JPG.d9c27a3ba5d36b2f6851838829fc5f51.JPG

#include <Keypad.h>

bool stanA = 0;
bool stanB = 0;
uint32_t aktualnyczas = 0;
static uint8_t semA = 0;
static uint8_t semB = 0;
uint16_t key = 0;

// ustawienie klawiatury
const byte ROWS = 4; //cztery rzędy
const byte COLS = 4; //cztery kolumny
char hesemAaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};

// podłączenie klawiatury do Arduino
byte rowPins[ROWS] = {9, 8, 7, 6};  //Piny, do których podłączamy wyprowadzenia od rzędów
byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn

Keypad keypad = Keypad(makeKeymap(hesemAaKeys), rowPins, colPins, ROWS, COLS );

static uint32_t seqKeyTimer;
static uint8_t seqKeyState;

#define SEQKEY_TIMEOUT 1500UL
#define SEQ_PREFIsemA(a) ((char *)((a) >> 8))
#define SEQ_KEY(a) ((char *)((a) & 255))
#define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff))


uint16_t getSequenceKey(void)
{
  uint8_t k = keypad.getKey();

  if (!k) {
    // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy
    if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) {
      seqKeyState = 0;
    }
    return 0;
  }
  if (k >= 'A' && k <= 'D') {
    seqKeyState = k;
    seqKeyTimer = millis();
    return 0;
  }
  if (!seqKeyState) {
    // nie było prefiksu
    return 0;
  }
  uint16_t rc = (seqKeyState << 8) | k;
  seqKeyState = 0;
  return rc;
}


void setup() {

  pinMode(A0, OUTPUT); //Dioda zielona (sem.1)
  pinMode(10, OUTPUT); //Dioda pomarańczowa1 (sem.1)
  pinMode(11, OUTPUT); //Dioda czerwona (sem.1)
  pinMode(12, OUTPUT); //Dioda pomarańczowa2 (sem.1)
  pinMode(13, OUTPUT); //Dioda biała (sem.1)

  pinMode(A1, OUTPUT); //Dioda zielona (sem.2)
  pinMode(A2, OUTPUT); //Dioda pomarańczowa1 (sem.2)
  pinMode(A3, OUTPUT); //Dioda czerwona (sem.2)
  pinMode(A4, OUTPUT); //Dioda pomarańczowa2 (sem.2)
  pinMode(A5, OUTPUT); //Dioda biała (sem.2)

  digitalWrite(A0, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);

  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);
}

void loop()
{
  aktualnyczas = millis();

  key = getSequenceKey();

  key_semafor();
  semaforA();
  semaforB();
}


bool timA(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanA = !stanA;
    return true;
  }
  return false;

}

bool timB(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanB = !stanB;
    return true;
  }
  return false;

}

void key_semafor() {

  switch (key) {
    case SEQ_COMBINE('A', '1'):
      semA = 0;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '2'):
      semA = 1;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '3'):
      semA = 2;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '4'):
      semA = 3;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '5'):
      semA = 4;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '6'):
      semA = 5;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '7'):
      semA = 6;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '8'):
      semA = 7;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '9'):
      semA = 8;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '0'):
      semA = 9;
      stanA = 0;
      break;

    case SEQ_COMBINE('B', '1'):
      semB = 10;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '2'):
      semB = 11;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '3'):
      semB = 12;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '4'):
      semB = 13;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '5'):
      semB = 14;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '6'):
      semB = 15;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '7'):
      semB = 16;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '8'):
      semB = 17;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '9'):
      semB = 18;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '0'):
      semB = 19;
      stanB = 0;
      break;
  }
}

void semaforA() {
  switch (semA) {

    case 0:
    // kod dla wyświetlania "S1-sem.1"
      ledA(0, 0, 1, 0, 0);
      break;

    case 1:
    // kod dla wyświetlania "S2-sem.1"
      ledA(1, 0, 0, 0, 0);
      break;

    case 2:
    // kod dla wyświetlania "S3-sem.1"
      if (stanA == 0 && timA(500)) {
        ledA(1, 0, 0, 0, 0);
      }
      if (stanA == 1 && timA(500)) {
        ledA(0, 0, 0, 0, 0);
      }
      break;

    case 3:
    // kod dla wyświetlania "S4-sem.1"
      if (stanA == 0 && timA(500)) {
        ledA(0, 1, 0, 0, 0);
      }
      if (stanA == 1 && timA(500)) {
        ledA(0, 0, 0, 0, 0);
      }
      break;

    case 4:
    // kod dla wyświetlania "S5-sem.1"
      ledA(0, 1, 0, 0, 0);
      break;

    case 5:
    // kod dla wyświetlania "S10-sem.1"
      ledA(1, 0, 0, 1, 0);
      break;

    case 6:
    // kod dla wyświetlania "S11-sem.1"
      if (stanA == 0 && timA(500)) {
        ledA(1, 0, 0, 1, 0);
      }
      if (stanA == 1 && timA(500)) {
        ledA(0, 0, 0, 1, 0);
      }
      break;

    case 7:
    // kod dla wyświetlania "S12-sem.1"
      if (stanA == 0 && timA(500)) {
        ledA(0, 1, 0, 1, 0);
      }
      if (stanA == 1 && timA(500)) {
        ledA(0, 0, 0, 1, 0);
      }
      break;

    case 8:
    // kod dla wyświetlania "S13-sem.1"
      ledA(0, 1, 0, 1, 0);
      break;

    case 9:
      // kod dla wyświetlania "Sz-sem.1"
      if (stanA == 0 && timA(500)) {
        ledA(0, 0, 1, 0, 1);
      }
      if (stanA == 1 && timA(500)) {
        ledA(0, 0, 1, 0, 0);
      }
      break;

  }
}

void semaforB() {
  switch (semB) {

    case 10:
    // kod dla wyświetlania "S1-sem.2"
      ledB(0, 0, 1, 0, 0);
      break;

    case 11:
    // kod dla wyświetlania "S2-sem.2"
      ledB(1, 0, 0, 0, 0);
      break;

    case 12:
    // kod dla wyświetlania "S3-sem.2"
      if (stanB == 0 && timB(500)) {
        ledB(1, 0, 0, 0, 0);
      }
      if (stanB == 1 && timB(500)) {
        ledB(0, 0, 0, 0, 0);
      }
      break;

    case 13:
    // kod dla wyświetlania "S4-sem.2"
      if (stanB == 0 && timB(500)) {
        ledB(0, 1, 0, 0, 0);
      }
      if (stanB == 1 && timB(500)) {
        ledB(0, 0, 0, 0, 0);
      }
      break;

    case 14:
    // kod dla wyświetlania "S5-sem.2"
      ledB(0, 1, 0, 0, 0);
      break;

    case 15:
    // kod dla wyświetlania "S10-sem.2"
      ledB(1, 0, 0, 1, 0);
      break;

    case 16:
    // kod dla wyświetlania "S11-sem.2"
      if (stanB == 0 && timB(500)) {
        ledB(1, 0, 0, 1, 0);
      }
      if (stanB == 1 && timB(500)) {
        ledB(0, 0, 0, 1, 0);
      }
      break;

    case 17:
    // kod dla wyświetlania "S12-sem.2"
      if (stanB == 0 && timB(500)) {
        ledB(0, 1, 0, 1, 0);
      }
      if (stanB == 1 && timB(500)) {
        ledB(0, 0, 0, 1, 0);
      }
      break;

    case 18:
    // kod dla wyświetlania "S13-sem.2"
      ledB(0, 1, 0, 1, 0);
      break;

    case 19:
    // kod dla wyświetlania "Sz-sem.2"
      if (stanB == 0 && timB(500)) {
        ledB(0, 0, 1, 0, 1);
      }
      if (stanB == 1 && timB(500)) {
        ledB(0, 0, 1, 0, 0);
      }
      break;
  }
}

void ledA(bool a, bool b, bool c, bool d, bool e) {
  digitalWrite(A0, a);
  digitalWrite(10, b);
  digitalWrite(11, c);
  digitalWrite(12, d);
  digitalWrite(13, e);
}

void ledB(bool a, bool b, bool c, bool d, bool e) {
  digitalWrite(A1, a);
  digitalWrite(A2, b);
  digitalWrite(A3, c);
  digitalWrite(A4, d);
  digitalWrite(A5, e);
}

Posiadam też 4 zestawy po 2szt. diod, sterowane analogicznie i z przerobionym nieco kodem:

forbot2.thumb.JPG.b919bf7d077ed23f7d7f60c1e3b8b786.JPG

#include <Keypad.h>

bool stanA = 0;
bool stanB = 0;
bool stanC = 0;
bool stanD = 0;
uint32_t aktualnyczas = 0;
static uint8_t semA = 0;
static uint8_t semB = 0;
static uint8_t semC = 0;
static uint8_t semD = 0;
uint16_t key = 0;

// ustawienie klawiatury
const byte ROWS = 4; //cztery rzędy
const byte COLS = 4; //cztery kolumny
char hesemAaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};

// podłączenie klawiatury do Arduino
byte rowPins[ROWS] = {9, 8, 7, 6};  //Piny, do których podłączamy wyprowadzenia od rzędów
byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn

Keypad keypad = Keypad(makeKeymap(hesemAaKeys), rowPins, colPins, ROWS, COLS );

static uint32_t seqKeyTimer;
static uint8_t seqKeyState;

#define SEQKEY_TIMEOUT 1500UL
#define SEQ_PREFIsemA(a) ((char *)((a) >> 8))
#define SEQ_KEY(a) ((char *)((a) & 255))
#define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff))


uint16_t getSequenceKey(void)
{
  uint8_t k = keypad.getKey();

  if (!k) {
    // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy
    if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) {
      seqKeyState = 0;
    }
    return 0;
  }
  if (k >= 'A' && k <= 'D') {
    seqKeyState = k;
    seqKeyTimer = millis();
    return 0;
  }
  if (!seqKeyState) {
    // nie było prefiksu
    return 0;
  }
  uint16_t rc = (seqKeyState << 8) | k;
  seqKeyState = 0;
  return rc;
}


void setup() {

  pinMode(10, OUTPUT); //Dioda niebieska (Tm.1)
  pinMode(11, OUTPUT); //Dioda biała (Tm.1)
  pinMode(12, OUTPUT); //Dioda niebieska (Tm.2)
  pinMode(A5, OUTPUT); //Dioda biała (Tm.2)
  pinMode(A4, OUTPUT); //Dioda niebieska (Tm.3)
  pinMode(A3, OUTPUT); //Dioda biała (Tm.3)
  pinMode(A2, OUTPUT); //Dioda niebieska (Tm.4)
  pinMode(A1, OUTPUT); //Dioda biała (Tm.4)

  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(A5, LOW);
  digitalWrite(A4, HIGH);
  digitalWrite(A3, LOW);
  digitalWrite(A2, HIGH);
  digitalWrite(A1, LOW);
}

void loop()
{
  aktualnyczas = millis();

  key = getSequenceKey();

  key_semafor();
  semaforA();
  semaforB();
  semaforC();
  semaforD();
}


bool timA(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanA = !stanA;
    return true;
  }
  return false;

}

bool timB(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanB = !stanB;
    return true;
  }
  return false;

}

bool timC(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanC = !stanC;
    return true;
  }
  return false;

}

bool timD(int X) {

  static uint32_t last;

  if (aktualnyczas - last > X) {
    last = aktualnyczas;
    stanD = !stanD;
    return true;
  }
  return false;

}

void key_semafor() {

  switch (key) {
    case SEQ_COMBINE('A', '1'):
      semA = 0;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '2'):
      semA = 1;
      stanA = 0;
      break;

    case SEQ_COMBINE('A', '0'):
      semA = 2;
      stanA = 0;
      break;

    case SEQ_COMBINE('B', '1'):
      semB = 3;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '2'):
      semB = 4;
      stanB = 0;
      break;

    case SEQ_COMBINE('B', '0'):
      semB = 5;
      stanB = 0;
      break;

    case SEQ_COMBINE('C', '1'):
      semC = 6;
      stanC = 0;
      break;

    case SEQ_COMBINE('C', '2'):
      semC = 7;
      stanC = 0;
      break;

    case SEQ_COMBINE('C', '0'):
      semC = 8;
      stanC = 0;
      break;

    case SEQ_COMBINE('D', '1'):
      semD = 9;
      stanD = 0;
      break;

    case SEQ_COMBINE('D', '2'):
      semD = 10;
      stanD = 0;
      break;

    case SEQ_COMBINE('D', '0'):
      semD = 11;
      stanD = 0;
      break;
  }
}

void semaforA() {
  switch (semA) {

    case 0:
    // kod dla wyświetlania "Ms1-Tm.1" lub "S1-Tz.1"
      ledA(1, 0);
      break;

    case 1:
    // kod dla wyświetlania "Ms2-Tm.1"
      ledA(0, 1);
      break;

    case 2:
    // kod dla wyświetlania "Sz-Tz.1"
      if (stanA == 0 && timA(500)) {
        ledA(1, 1);
      }
      if (stanA == 1 && timA(500)) {
        ledA(1, 0);
      }
      break;

  }
}

void semaforB() {
  switch (semB) {

    case 3:
    // kod dla wyświetlania "Ms1-Tm.2" lub "S1-Tz.2"
      ledB(1, 0);
      break;

    case 4:
    // kod dla wyświetlania "Ms2-Tm.2"
      ledB(0, 1);
      break;

    case 5:
    // kod dla wyświetlania "Sz-Tz.2"
      if (stanB == 0 && timB(500)) {
        ledB(1, 1);
      }
      if (stanB == 1 && timB(500)) {
        ledB(1, 0);
      }
      break;

  }
}

void semaforC() {
  switch (semC) {

    case 6:
    // kod dla wyświetlania "Ms1-Tm.3" lub "S1-Tz.3"
      ledC(1, 0);
      break;

    case 7:
    // kod dla wyświetlania "Ms2-Tm.3"
      ledC(0, 1);
      break;

    case 8:
    // kod dla wyświetlania "Sz-Tz.3"
      if (stanC == 0 && timC(500)) {
        ledC(1, 1);
      }
      if (stanC == 1 && timC(500)) {
        ledC(1, 0);
      }
      break;

  }
}

void semaforD() {
  switch (semD) {

    case 9:
    // kod dla wyświetlania "Ms1-Tm.4" lub "S1-Tz.4"
      ledD(1, 0);
      break;

    case 10:
    // kod dla wyświetlania "Ms2-Tm.4"
      ledD(0, 1);
      break;

    case 11:
    // kod dla wyświetlania "Sz-Tz.4"
      if (stanD == 0 && timD(500)) {
        ledD(1, 1);
      }
      if (stanD == 1 && timD(500)) {
        ledD(1, 0);
      }
      break;

  }
}

void ledA(bool a, bool b) {
  digitalWrite(10, a);
  digitalWrite(11, b);
}

void ledB(bool a, bool b) {
  digitalWrite(12, a);
  digitalWrite(A5, b);
}

void ledC(bool a, bool b) {
  digitalWrite(A4, a);
  digitalWrite(A3, b);
}

void ledD(bool a, bool b) {
  digitalWrite(A2, a);
  digitalWrite(A1, b);
}

 

Wychodzę do Was Szanowni Forumowicze z prośbą, czy ktoś znajdzie czas, chęć, pomysł na to, by zrobić z tego jedno działające urządzenie?

a konkretnie:

  • scalenie 2 kodów w jeden by pracowały na jednym Arduino/ESP32. Wiem, że jest za mało wyjść więc pomyślałem o expanderze PCF8575
  • możliwość wyboru kombinacji świecenia poprzez komendę 1*x; 2*x itd. (gdzie x to cyfra od 0 do 9). Przykładowo kombinacja 1*1 uruchamia pierwszą z możliwości świecenia diod na 1szym urządzeniu; kombinacja 4*2 uruchamia drugą z możliwości świecenia diod na 4tym urządzeniu.
  • po każdym wyborze kombinacji świecenia, powrót po 30sek. do wyświetlania sygnału głównego (dioda czerwona w przypadku zestawu 5diod i dioda niebieska w przypadku zestawu 2diod)

Za wszelką pomoc bardzo dziękuje. Z góry też przepraszam, jeśli coś opisałem niezrozumiale.

  • Lubię! 1
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

..."możliwość wyboru kombinacji świecenia poprzez komendę 1*x; 2*x itd. (gdzie x to cyfra od 0 do 9). Przykładowo kombinacja 1*1 uruchamia pierwszą z możliwości świecenia diod na 1szym urządzeniu; kombinacja 4*2 uruchamia drugą z możliwości świecenia diod na 4tym urządzeniu"... 

Możesz to jaśniej opisać?? 

Ile ma być tych kombinacji swiecenia? I ile teraz masz?

Link do komentarza
Share on other sites

12 minut temu, farmaceuta napisał:

Możesz to jaśniej opisać?? 

Ile ma być tych kombinacji swiecenia? I ile teraz masz?

Tak.

w tej chwili w każdym przypadku jest możliwość podpięcia 4 urządzeń i wybiera się sygnały poprzez A0, A1, A2,  do A9; Kolejne urządzenie B0, B1 do B9, Trzecie C0 do C9 i analogicznie dla czwartego.

Literek na klawiaturze więcej nie ma, więc gdyby podpiąć piąte lub dalsze urządzenie (semafor czy tarcza manewrowa zawierające 2 lub 5 diod) to nie ma możliwości wyboru litery E (E0, E1 itd).

Więc, zamiast A1 wybierać 1*1; zamiast C9 wybierać3*9 a zamiast E, F, G, H których nie ma wybierać odpowiednio 5*x; 6*x; 7*x; 8*.

Do tego potrzebny też też expander by móc zwiększyć ilość wyjść.

Link do komentarza
Share on other sites

(edytowany)

Tak, zostają

Tylko gdyby można było zrobić powrót z każdej kombinacji do diody czerwonej (w przypadku 5diod) i diody niebieskiej (w przypadku 2 diod) po powiedzmy 30sek.

Edytowano przez prezesedi
  • Lubię! 1
Link do komentarza
Share on other sites

9 minut temu, prezesedi napisał:

 

Tylko gdyby można było zrobić powrót z każdej kombinacji do diody czerwonej (w przypadku 5diod) i diody niebieskiej (w przypadku 2 diod) po powiedzmy 30sek.

To akurat banał do ogarnięcia w pół minuty...

Ile masz tych wszystkich diod? Najlepiej żeby się nie motać to wszystkie te diody wrzucić na expander tylko nie wiem czy jeden wystarczy (8575=16 wyjść)

Link do komentarza
Share on other sites

po 30 sek chciałbym by zawsze wróciło do tego co jest w sekcji kodu "VOID SETUP":

czyli

digitalWrite(A0, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);

  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
  digitalWrite(A4, LOW);
  digitalWrite(A5, LOW);

i

digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(A5, LOW);
  digitalWrite(A4, HIGH);
  digitalWrite(A3, LOW);
  digitalWrite(A2, HIGH);
  digitalWrite(A1, LOW);

Oczywiście wiem, że numeracja pinów się zmieni

Link do komentarza
Share on other sites

A czemu nie magistrala? CAN albo co... 

Poza tym istnieją lepsze ekspandery niż PCF - choćby możliwość działania z większymi prędkościami niż te rachityczne 100kHz...

Link do komentarza
Share on other sites

19 godzin temu, ethanak napisał:

A czemu nie magistrala? CAN albo co... 

Poza tym istnieją lepsze ekspandery niż PCF - choćby możliwość działania z większymi prędkościami niż te rachityczne 100kHz...

Nigdy nie używałem CAN itp, a nauczyć się człowiekowi nie chce😜 a co do prędkości PCF'a, można by wybrać MCP23017, ale czy to będzie miało jakąś różnicę w tym projekcie? Wątpię 😉 a przy okazji pytanie...w tym pcf trzeba ustawiać kanały na input lub output? 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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