Diskuze: C#, 7segmenty + Arduino
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?
mekfa1:15.4.2015 18:43
Tak jsem ten timer upravil, ale stejně to nefunguje.
Arduino, ani další jiný převodník nemám
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ě
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;
}
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
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.WriteLine(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
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)
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
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
Zobrazeno 11 zpráv z 11.