Управление движением моторчика в пк

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

Всем здрасьте, я новенький, написал код  под ардуино (УНО), написал код на 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();
        }
    }
}

Что можно сделать?

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Избавься от delay()

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

Andy пишет:

Избавься от delay()

Я все понимаю, Но где? какая строка? (там просто 4 штуки..)

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Очевидно - везде.

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

Убрал, толку ноль
Заметил,на светодиоде RX появилась задержка

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Логика не понятна. Всегда исполняется этот код.

  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();

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

Andy пишет:

Логика не понятна. Всегда исполняется этот код.

  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();

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

немного переписал код 

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");
  }
}




 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

я все равно не понимаю логику. Какой смысл ты вкладываешь в эту строчку: if (Serial.available() == 30)

В моем понимании, если в буфере есть 30 символов (любых), то выполнить что-то. В последнем коде в буфере никогда не будет ни одного символа, т.к. они будут забираться быстрее, чем поступать.

Возможно ты имел в виду if (x == 0x30)....

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

Andy пишет:

я все равно не понимаю логику. Какой смысл ты вкладываешь в эту строчку: if (Serial.available() == 30)

В моем понимании, если в буфере есть 30 символов (любых), то выполнить что-то. В последнем коде в буфере никогда не будет ни одного символа, т.к. они будут забираться быстрее, чем поступать.

Возможно ты имел в виду if (x == 0x30)....

я со студии отсылаю числа (от 0 до 3), почитав узнал про ASCII, и решил попробовать..

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016
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");
  }
}




 

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

попробовал другой код(нашел в сети и оптимизировал под себя) проблемма осталась проблеммой.. проходит большое время перед тем, как моторчик переключится.. (или вообще не работает)

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);
    }
  }
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Я не вижу проблем в этом коде, надеюсь выходы и Serial сконфигурены в setup()...

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016
void setup() {
  
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  Serial.begin(9600);
  
  
}

 

zedok
zedok аватар
Offline
Зарегистрирован: 18.01.2016

сумел сделать, поправил код на VS, вместо цифр идут теперь буквы... в этом и была проблемма(а может я криворукий человек..) Спасибо всем,кто отписался