Управление движением моторчика в пк
- Войдите на сайт для отправки комментариев
Пнд, 18/01/2016 - 21:53
Всем здрасьте, я новенький, написал код под ардуино (УНО), написал код на c#(работаю в VS 2015) для управления движения двигателя(в данный момент там стоят 2 светодиода).
Нужна помощь, после нажатия кнопки "открыть жалюзи"- проходит большое кол-во времени, пока ардуино включит 12 ножку, так-же точно с другой кнопкой "закрть жалюзи"(13 нога), а светодиод на 11 ноге работает вечно(для откладки)
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
Serial.begin(9600);
}
void loop()
{
int x;
x == Serial.read();
//switch(x);
if (Serial.available() == 30)
{
digitalWrite(13, HIGH);
Serial.print("Shutters offer");
delay(10000);
Serial.print("Shutters open");
digitalWrite(13, LOW);
Serial.print(x);
// x = x - 2;
}
else if (Serial.available() == 31)
{
digitalWrite(12, HIGH);
Serial.print("Shutters closed");
delay(10000);
Serial.print("Shutters closed");
digitalWrite(13, LOW);
Serial.print(x);
// x = x - 4;
}
else
{
digitalWrite(11, HIGH);
delay(1000);
digitalWrite(11, LOW);
Serial.print(x);
delay(5000);
}
}
код с vs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.IO.Ports.SerialPort;
using System.IO;
using System.IO.Ports;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
//int p;
//private object port;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort("COM3", 4800);
port.Open();
port.WriteLine("0");
port.Close();
}
private void button2_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort("COM3", 9600);
port.Open();
port.WriteLine("1");
port.Close();
}
private void button3_Click(object sender, EventArgs e)
{
SerialPort port = new SerialPort("COM3", 9600);
port.Open();
port.WriteLine("2");
port.Close();
}
}
}
Что можно сделать?
Избавься от delay()
Избавься от delay()
Я все понимаю, Но где? какая строка? (там просто 4 штуки..)
Очевидно - везде.
Убрал, толку нольЗаметил,на светодиоде RX появилась задержка
Логика не понятна. Всегда исполняется этот код.
else { digitalWrite(11, HIGH); delay(1000); digitalWrite(11, LOW); Serial.print(x); delay(5000); }и если за 6 сек задержки ты успеваешь засунуть в последовательный порт 31 или 32 символа, то в следующем цикле выполнится
if (Serial.available() == 30) или
else if (Serial.available() == 31)
Сдается мне ты не понимаешь что делает Serial.available();
Логика не понятна. Всегда исполняется этот код.
else { digitalWrite(11, HIGH); delay(1000); digitalWrite(11, LOW); Serial.print(x); delay(5000); }и если за 6 сек задержки ты успеваешь засунуть в последовательный порт 31 или 32 символа, то в следующем цикле выполнится
if (Serial.available() == 30) или
else if (Serial.available() == 31)
Сдается мне ты не понимаешь что делает Serial.available();
я с ардуино знаком недавно., почитав всякие статейки, нашел Serial.available();
немного переписал код
void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); Serial.begin(9600); } void loop() { int x; x == Serial.read(); //switch(x); if (Serial.available() == 30) { digitalWrite(13, HIGH); Serial.print("Shutters offer"); //Serial.print("Shutters open"); Serial.print(x); // x = x - 2; } else if (Serial.available() == 31) { digitalWrite(12, HIGH); Serial.print("Shutters closed"); // Serial.print("Shutters closed"); Serial.print(x); // x = x - 4; } else if (Serial.available() == 32) { digitalWrite(11, HIGH); delay(100); digitalWrite(11, LOW); digitalWrite(13, LOW); digitalWrite(12, LOW); Serial.print(x); Serial.print("all the zeros"); } }я все равно не понимаю логику. Какой смысл ты вкладываешь в эту строчку:
if(Serial.available() == 30)В моем понимании, если в буфере есть 30 символов (любых), то выполнить что-то. В последнем коде в буфере никогда не будет ни одного символа, т.к. они будут забираться быстрее, чем поступать.
Возможно ты имел в виду if (x == 0x30)....
я все равно не понимаю логику. Какой смысл ты вкладываешь в эту строчку:
if(Serial.available() == 30)В моем понимании, если в буфере есть 30 символов (любых), то выполнить что-то. В последнем коде в буфере никогда не будет ни одного символа, т.к. они будут забираться быстрее, чем поступать.
Возможно ты имел в виду if (x == 0x30)....
я со студии отсылаю числа (от 0 до 3), почитав узнал про ASCII, и решил попробовать..
void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); Serial.begin(9600); } void loop() { int x; x = Serial.read(); //switch(x); if (x == '0') { digitalWrite(13, HIGH); Serial.print("Shutters offer"); //Serial.print("Shutters open"); Serial.print(x); // x = x - 2; } else if (x == '1') { digitalWrite(12, HIGH); Serial.print("Shutters closed"); // Serial.print("Shutters closed"); Serial.print(x); // x = x - 4; } else if (x == '2') { digitalWrite(11, HIGH); delay(100); digitalWrite(11, LOW); digitalWrite(13, LOW); digitalWrite(12, LOW); Serial.print(x); Serial.print("all the zeros"); } }попробовал другой код(нашел в сети и оптимизировал под себя) проблемма осталась проблеммой.. проходит большое время перед тем, как моторчик переключится.. (или вообще не работает)
void loop() { int val; digitalWrite(11, HIGH); if (Serial.available()) { val = Serial.read(); if (val == '1') { digitalWrite(13, HIGH); } if (val == '2') { digitalWrite(12, HIGH); } if (val == '3') { digitalWrite(12, LOW); digitalWrite(13, LOW); } } }Я не вижу проблем в этом коде, надеюсь выходы и Serial сконфигурены в setup()...
void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); Serial.begin(9600); }сумел сделать, поправил код на VS, вместо цифр идут теперь буквы... в этом и была проблемма(а может я криворукий человек..) Спасибо всем,кто отписался