Контроль мигания через USB

Тема в разделе "Arduino & Shields", создана пользователем Alukard, 5 июл 2017.

  1. Alukard

    Alukard Нуб

    Приветствую, уважаемые знатоки. Прощу помощи. Имеется задание. Написать код, с помощью которого можно контролировать период мигания светодиодом на плате через USB, не используя функцию delay. Вот что накалякал. Вроде как это " if (currentTimeStamp - previousTimeStamp > t)" должно отвечать за длительность периода, а тут " analogWrite(t, message.toInt()); " мы как раз-таки его задаем. Но не работает. Диод просто включается-выключается при любом значении. В чем может быть проблема?

    int ledPin = 13;
    int t = 1000;
    boolean ledState = HIGH;
    long previousTimeStamp = 0;
    String message;

    void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
    }

    void loop() {
    while (Serial.available()) {
    char incomingChar = Serial.read();
    if (incomingChar >= '0' && incomingChar <= '9') {
    message += incomingChar; }
    else if (incomingChar == '\n') {
    analogWrite(t, message.toInt());
    message = "";
    }
    long currentTimeStamp = millis();
    if (currentTimeStamp - previousTimeStamp > t)
    {previousTimeStamp = currentTimeStamp;
    ledState =! ledState;
    digitalWrite(ledPin, ledState);
    }
    }
    }
     
    Последнее редактирование: 5 июл 2017
  2. AlexU

    AlexU Гуру

    А тут вы пытаетесь управлять пином под номером '1000'. У Вас плата с тысячью пинами?

    PS: для вставки кода используйте тэг 'Код' и про форматирование не забывайте
    Код (C++):
    int ledPin = 13;
    int t = 1000;
    boolean ledState = HIGH;
    long previousTimeStamp = 0;
    String message;

    void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
    }

    void loop() {
    while (Serial.available()) {
    char incomingChar = Serial.read();
    if (incomingChar >= '0' && incomingChar <= '9') {
    message += incomingChar; }
    else if (incomingChar == '\n') {
    analogWrite(t, message.toInt());
    message = "";
    }
    long currentTimeStamp = millis();
    if (currentTimeStamp - previousTimeStamp > t)
    {previousTimeStamp = currentTimeStamp;
    ledState =! ledState;
    digitalWrite(ledPin, ledState);
    }
    }
    }
     
  3. Alukard

    Alukard Нуб

    }
    }[/code][/QUOTE]
    Прошу прощения, впервые тут) Идея у меня такая, ввести переменную t, которой и будем обозначать период. Только никак понять не могу, как изменять ее в мониторе порта.
    Код (C++):
    int ledPin = 13;
    int t = 0;
    boolean ledState = HIGH;
    long previousTimeStamp = 0;
    String message;

    void setup() {
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
    }

    void loop() {
     
     
      while (Serial.available()) {  
        long currentTimeStamp = millis();
        char incomingChar = Serial.read();
        if (incomingChar >= '0' && incomingChar <= '9') {
          message += incomingChar; }
          else if (incomingChar == '\n') {    
            t == message.toInt();
            message = "";
          }
        if (currentTimeStamp - previousTimeStamp > t)
      {previousTimeStamp = currentTimeStamp;
      ledState =! ledState;
      digitalWrite(ledPin, ledState);
        }
      }
    }
     
  4. AlexU

    AlexU Гуру

    Так попробуйте:
    Код (C++):
    void loop() {
        long currentTimeStamp = millis();
        if (Serial.available()) {
            char incomingChar = Serial.read();
            if (incomingChar >= '0' && incomingChar <= '9') {
                message += incomingChar;
            } else if (incomingChar == '\n' || incomingChar == '\r') {
                t = message.toInt();
                message = "";
            }
        }
        if (currentTimeStamp - previousTimeStamp > t) {
            previousTimeStamp = currentTimeStamp;
            ledState = !ledState;
            digitalWrite(ledPin, ledState);
        }
    }
     
    Alukard нравится это.
  5. Alukard

    Alukard Нуб

    Спасибо большое, все работает))