Arduino mikrokontroller vezérlés

Ha gondja, baja, problémája van a programmal kapcsolatban, mindenek elött itt nézzen szét
Válasz küldése
Hoze
Global admin
Hozzászólások: 161
Csatlakozott: pén. ápr. 30, 2010 6:45 pm
Kapcsolat:

Re: Arduino mikrokontroller vezérlés

Hozzászólás Szerző: Hoze »

Kedves Máté,

nem kellene a 21... kezdetű szekvenciát elküldeni "start"-ként. Azt a PC küldi ki, ha jelzőlámpát akar kapcsolni.
Azt sem értem, a 'D' és 'I' felismerése után miért vársz újabb 'D' betűt itt:
if ((input[0] == 68) & (input[1] == 73) & (input[2] == 68))
ez nem fog értelmesen működni, mert csak két bájtot küld ki a PC, nem hármat.
Az egészet jobb lenne bájtonként egyesével olvasni, és ha megjött a 'D' és 'I', akkor beküldeni a három bájtos gomb jelzést. Szerintem valami ilyesmi lenne a ciklus:

Kód: Egész kijelölése

char in1=0, in2=0, in3=0, in4=0;    //ezek globalis valtozok!

while (Serial.available()) {
    Serial.readBytes(input, 1);        //egyszerre csak egy bajtot
    in1 = in2; in2 = in3; in3 = in4; in4 = input[0];    //mindenki lep egyet
    if (in3 == 'D' && in4 == 'I') {        // DI parancs jott?
      char out1 = (digitalRead(2) == LOW ? 0 : 1);    // le van nyomva gomb?
      char out2 = 0;        //ezt nem hasznaljuk, mindig 0
      Serial.write(out1);
      Serial.write(out2);
      Serial.write(out1 + out2);     //ellenorzo osszeg
    } else if (in1 = 0x21 && in4 == in2 + in3) {
        // itt lehet a lampak bekapcsolasa in2 alapjan
    }
}
Üdv: Hozé
MMate
Hozzászólások: 3
Csatlakozott: hétf. máj. 23, 2022 5:26 pm

Re: Arduino mikrokontroller vezérlés

Hozzászólás Szerző: MMate »

Kedves Fórumozók!

Az a problémám akadt, hogy valamiért nem elég elküldenem egyszer a kapcsoló kódot, hanem többször. De ha többször küldöm el, akkor meg dupla nyomásnak veszi és be-, majd rögtön kikapcsolja a vetítést.
Ráadásul hiába állítom be az elején, hogy a 40-es hexakódot küldje vissza, csak 0-át küld ha sikerül teljesíteni a feladatot.
Íme a kódom (afo Bluetooth-os kódját vettem alapul):

Kód: Egész kijelölése

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

bool start = false;
bool lenyomva = false;
char input[4];
bool sent = true;
void setup() {

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.println("Betoltes......");
  display.display(); 
  delay(500);
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
  pinMode(3, INPUT);
Serial.begin(2400);
/*for (int i=0;i<10;i++)
{
  display.clearDisplay();
  display.print(i);
  display.display();
  delay(1000);
}*/
/*Serial.write(0x21);
Serial.write(0x00);
Serial.write(0x40);
Serial.write(0x40);*/
delay(500);
display.clearDisplay();
  display.println("Mehet!");
  display.display();
display.clearDisplay();
}

void loop() {
  while (Serial.available())
  {
    if (start == false)
    {
      Serial.write(0x21);
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x00);
start = true;
    }
    /*display.clearDisplay();
    display.setCursor(0, 10);
    display.println(Serial.readString());
    display.display();*/
    Serial.readBytes(input, 3);
    if ((input[0] == 68) & (input[1] == 73) & (input[2] == 68))
    {
      /*display.clearDisplay();
  display.println("DI");
  display.display();*/
      if (digitalRead(2) == LOW)
      {
        digitalWrite(13, HIGH);
        sent = false;
        /*while (digitalRead(2) != HIGH);
        digitalWrite(13, LOW);*/
        //delay(200);
      }
    }
    if (sent != true)
        {
        for(int i=0;i<4;i++) {
        Serial.write(0x01);
        Serial.write(0x00);
        Serial.write(0x01); }
    }
    if ((input[0] == 0) | (input[1] == 0) | (input[2] == 0))
    {
      sent = true;
      digitalWrite(13, LOW);
      while (digitalRead(2) != HIGH);
    }
  }
}
Mi lehet a gond?

Válaszaitokat előre is köszönöm!

Üdv,
Menyhárt Máté
A hozzászólást 1 alkalommal szerkesztették, utoljára MMate hétf. máj. 23, 2022 7:04 pm-kor.
Hoze
Global admin
Hozzászólások: 161
Csatlakozott: pén. ápr. 30, 2010 6:45 pm
Kapcsolat:

Re: Arduino mikrokontroller vezérlés

Hozzászólás Szerző: Hoze »

Szia Barna,

olyan régen volt, hogy már nem emlékeztem fejből, most tudtam a kódban megnézni. :D

A soros kommunikáció: 2400 baud / 8 bit / 1 stop / noparity

Kimenet kapcsolása 4 bájt kiküldendő (hexa): 21 00 xx cc
1. bájt a '!' kódja
2. 00 (ha 16 kimenet lenne, ez a felső bájt)
3. a felső két bit a két használatos kimenet (tehát hexa 00, 40, 80, C0 lehet)
4. checksum = a 2.+3. bájt összege; esetünkben tehát a 3.bájt mégegyszer

Bemenet olvasása 2 bájt ki (hexa): 44 49 (azaz 'DI' karakterek, Digital Input). Válaszul három bájtot kell beküldeni:
1. bájt a nyolc nyomógomb
2. 00 (itt a PIC vezérlő RC portját olvasnánk, nem használatos)
3. checksum = 1.+2. bájt összege; esetünkben tehát az 1.bájt mégegyszer

A Diatár program rendszeresen kiküldi a DI parancsot, és várja a fenti három bájtot. Ha a checksum stimmel, akkor az első bájt nyolc bitjét értelmezi a beállítások szerint.
Amennyiben kimeneti jel be van állítva, változáskor küldi ki a fentebbi 4 bájtos paranccsal.

Ha felmerül valami kérdés vagy probléma, szívesen segítek. Ha készül egy használható kontroller, a leírást és/vagy programot is közzétesszük.

Üdv: Hozé
szbarna99
Hozzászólások: 3
Csatlakozott: kedd dec. 25, 2018 10:48 am

Arduino mikrokontroller vezérlés

Hozzászólás Szerző: szbarna99 »

Kedves fejlesztők, fórumtársak!

Szeretnék beállítani egy Arduino Nano mikrokontrollert a Diatár gombokkal való vezérlésére. Mivel a mikrokontrollert a számítógép USB-n soros portnak látja, így feltudnám programozni a Diatárban meglévő soros porton keresztüli vezérlésre.

Valaki esetleg foglalkozott ilyesmivel már? A Diatár milyen "adatot" vár a soros kommunikációs porton egy adott funkcióhoz?

Üdvözlettel, Barna.
Válasz küldése

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 0 vendég