NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
mekfa1
Člen
Avatar
mekfa1:14.4.2015 22:49

Ahoj, ležím v tom už v řádech dnů a nevím si rady. Shlédl jsem snad všechny youtube návody, schémata a kódy na netu i tady a stále se nedaří.


Zadání: V C# psát libovolná čísla od 0-99 a to zobrazit na dvou sedmisegmentovkách.


Aktuální stav: Vím, že sedmisegmentový čísla programovat přes podmínky je velice neprofesionální, přes pole je to lepší, ale to teď nechci řešit. Aktuálně to funguje, že když napíšu napevno číslo v kódu, zobrazí se na segmentech. Nebo jsem to dal do cyklu, že "krokujou" čísla od 0-99 po vteřině.


Problém: se nachází na čtení ze sériového portu. Vím že před pár dny se to tu zrovna řešilo, proto nechápu proč mi to nefunguje.

Zde je kód v C#:

public partial class Form1 : Form
{

    public Form1()
    {
       InitializeComponent();
       timer1.Start();
       serialPort1.Open();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        int a = Convert.ToInt32(label1.Text);
        serialPort1.WriteLine(a.ToString());
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        label1.Text = textBox1.Text;
    }
}

(sériový port je nastaven správně, je vyzkoušen na ledce (zapnutí vypnutí pomocí tlačítek)

Zde je kód v Arduinu:

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
     int vstup = Serial.readString().toInt();
     zadat(vstup);
  }
  else
  {
    zadat(0); //pokud ve VOID LOOP nechám pouze
              //tento řádeka měním číslo v závorce,
              //na segmentu je správně to co má
  }
}

void zadat(int cislo)
{
  int PS=(cislo%10);
  if (cislo<10)
  {
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  }
    if ((cislo>9)&(cislo<20))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, HIGH);
  }
    if ((cislo>19)&(cislo<30))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  }
    if ((cislo>29)&(cislo<40))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  }
    if ((cislo>39)&(cislo<50))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  }
    if ((cislo>49)&(cislo<60))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, HIGH);
  }
    if ((cislo>59)&(cislo<70))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  }
    if ((cislo>69)&(cislo<80))
  {
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  }
    if ((cislo>79)&(cislo<90))
  {
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  }
    if ((cislo>89)&(cislo<100))
  {
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, HIGH);
  }
   if (PS==0)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
   }
     if (PS==1)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
   }
     if (PS==2)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
   }
     if (PS==3)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
   }
     if (PS==4)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
   }
     if (PS==5)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
   }
     if (PS==6)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
   }
     if (PS==7)
   {
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
   }
     if (PS==8)
   {
  digitalWrite(0, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
   }
     if (PS==9)
   {
  digitalWrite(0, HIGH);
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
   }

}

Prosím o radu. Jak říkám , zakopanej pes bude v tom c# a čtení z portu v Arduinu

 
Odpovědět
14.4.2015 22:49
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na mekfa1
Adam Ježek:15.4.2015 8:26

V prvni rade zrus ten timer. Jestli chces text z txtboxu zobrazovat na labelu, tak pouzij textboxtextchanged event (dvakrat klikni na txtbox) a nezatezuj system timerem.

Kod vypada v poradku, chybu tam nikde nevidim... Zkus si dat breakpoint a serial write a koukni se co je v promenne a
Mas nejaky seriovy prevodnik nebo dalsi arduino?

Nahoru Odpovědět
15.4.2015 8:26
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
mekfa1
Člen
Avatar
Odpovídá na Adam Ježek
mekfa1:15.4.2015 18:43

Tak jsem ten timer upravil, ale stejně to nefunguje.
Arduino, ani další jiný převodník nemám :(

 
Nahoru Odpovědět
15.4.2015 18:43
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na mekfa1
Adam Ježek:15.4.2015 18:51

Sakra... Bez něj se to blbě určuje.
Zkus v Arduinu hned po přijetí dát delay (asi 500 ms), poslat data zptáky a v C# udělej Serialport listener a přijatá data dávej do dalšího richtextboxu, ať víme co se tma posílá.

if(Serial.available())
  {
     int vstup = Serial.readString().toInt();
     Serial.println(vstup.toString());
  }

C#

SerPort = new SerialPort(comport);
SerPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
SerPort.Open();

a handler

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    richTextBox1.Text += indata;
}

Možná si třeba zkus i do ardiuna přidat podmíku pokud vstup je 5, zablikat s ledkou a poslat tam 5, jestli se to pošle správně

Editováno 15.4.2015 18:51
Nahoru Odpovědět
15.4.2015 18:51
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
mekfa1
Člen
Avatar
Odpovídá na Adam Ježek
mekfa1:15.4.2015 19:22

Co se týče té ledky, tu už jsem zkoušel dávno a fungovalo to.
S těma úprava v kódu asi bude nějaká chybička. Trochu jsem musel upravit to, co jsi tu napsal, hlásilo to errory. Ovšem teď to nedělá vůbec nic, ani na Arduinu nebliká ta dioda při posílání dat

Arduino:

if(Serial.available())
{
   int vstup = Serial.readString().toInt();
   delay(500);
   Serial.println(vstup);
   zadat(vstup);
}

C# :

SerialPort SerPort = new SerialPort();
        public Form1()
        {
           InitializeComponent();
           SerPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
           SerPort.Open();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int a = Convert.ToInt32(label1.Text);
            SerPort.WriteLine(a.ToString());
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //label1.Text = textBox1.Text;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            label1.Text = textBox1.Text;
        }
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            richTextBox1.Text += indata;
        }
 
Nahoru Odpovědět
15.4.2015 19:22
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na mekfa1
Ondřej Štorc:15.4.2015 19:36

Sice nevím co tam máš špatně, ale zaráží mě tohle:

int a = Convert.ToInt32(label1.Text);
SerPort.WriteLine(a.ToString());

Ty to nejdřív převedeš na int a pak zase zpátky na string...

Jinak bys mohl sem ty errory vypsat, abychom věděli kde je chyba

Nahoru Odpovědět
15.4.2015 19:36
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
mekfa1
Člen
Avatar
mekfa1:15.4.2015 20:58

Ty errory se týkaly jen toho přídavku co tu psal kolega skrz kontrolu. Bylo v syntaxi.
Ohledně toho převodu int --> String a zpět, to je fakt.
Chci se tedy zeptat, dá se do sériového portu pouze string nebo i číselný int? Pokud se dá i ten int, tak jak? SerPort.Write­Line(a) to hází chybu té závorky. Pokud ne, jak se dá přetvořit v Arduinu string na číslo? Předem díky

 
Nahoru Odpovědět
15.4.2015 20:58
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na mekfa1
Ondřej Štorc:15.4.2015 21:06

Vždyť ti to předěláváš i v arduinu na číslo:

int vstup = Serial.readString().toInt();

K tomu serial portu tak nedá... Musíš tam buďto zadat string (více zde: https://msdn.microsoft.com/….110%29.aspx)

Nahoru Odpovědět
15.4.2015 21:06
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
mekfa1
Člen
Avatar
mekfa1:16.4.2015 13:04

Tak jsem trochu pokročil, ale ještě to není úplně ok. Kód v C# jsem změnil úplně a poupravil jsem Arduino.

C#:

public static System.IO.Ports.SerialPort serialPort1;
        private delegate void LineReceivedEvent(string line);

        public frmSerial()
        {
            InitializeComponent();

        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            System.ComponentModel.IContainer components = new System.ComponentModel.Container();
            serialPort1 = new System.IO.Ports.SerialPort(components); // Creating the new object.
            serialPort1.PortName = "COM" + numCom.Value.ToString(); // Setting what port number.
            serialPort1.BaudRate = 9600; // Setting baudrate.
            serialPort1.DtrEnable = true; // Enable the Data Terminal Ready
            serialPort1.Open(); // Open the port for use.
            btnConnect.Text = "Connected.";
            btnConnect.Enabled = false;
            numCom.Enabled = false;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            // Sends the text as a byte.
            serialPort1.Write(new byte[] { Convert.ToByte(txtDatasend.Text) }, 0, 1);
            //timer1.Start();
        }

Arduino:

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(21, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0) {
    int cislo = Serial.read();

    int PS = cislo % 10;
    Serial.flush();
    if (cislo < 10)
    {
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
    }
    if ((cislo > 9) & (cislo < 20))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if ((cislo > 19) & (cislo < 30))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    }
    if ((cislo > 29) & (cislo < 40))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
    }
    if ((cislo > 39) & (cislo < 50))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    }
    if ((cislo > 49) & (cislo < 60))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if ((cislo > 59) & (cislo < 70))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    }
    if ((cislo > 69) & (cislo < 80))
    {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
    }
    if ((cislo > 79) & (cislo < 90))
    {
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    }
    if ((cislo > 89) & (cislo < 100))
    {
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if (PS == 0)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
    }
    if (PS == 1)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
    }
    if (PS == 2)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
    }
    if (PS == 3)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, LOW);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
    }
    if (PS == 4)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
    }
    if (PS == 5)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
    }
    if (PS == 6)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
    }
    if (PS == 7)
    {
      digitalWrite(0, LOW);
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
    }
    if (PS == 8)
    {
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
    }
    if (PS == 9)
    {
      digitalWrite(0, HIGH);
      digitalWrite(1, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
    }
   }
  }

Teď to funguje tak, že když napíšu číslo do textboxu, zobrazuje se mi jen ten jeden segment (desítkový vlevo). Nefunguje v tom arduinu ta proměnná PS.
Udělal jsem zkoušku, že jsem odmazal cokoliv se sériovým portem a napevno nastavil nějaké číslo, tak to funguje, ale s tím sériovým portem ne.
Ten kód v C# jsem našel nějakej tutoriál a tak mi je to trochu nejasný, v tom bude asi ten problém

 
Nahoru Odpovědět
16.4.2015 13:04
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na mekfa1
Ondřej Štorc:16.4.2015 14:45

Zkusí si vypsat do konzole to číslo PS, jen abys věděl co v něm je

Nahoru Odpovědět
16.4.2015 14:45
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
mekfa1
Člen
Avatar
mekfa1:16.4.2015 15:30

Tak to vrací to co má. Proměnná "cislo" i "PS". Tak v tomhle případě bych fakt chtěl vědět, proč se neprovedou ty podmínky.
Protože jak už jsem zmiňoval, smažu cokoliv se sériovým portem, nastavím číslo napevno a fungujou všechny podmínky

 
Nahoru Odpovědět
16.4.2015 15:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.