Немного помощи с USB

Тема в разделе "Arduino & Shields", создана пользователем Рома-Ярик, 19 янв 2017.

  1. Код (C++):
    #include <math.h>
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13,12,11,10,9,8);
    int t1,t2,t3;
    void setup() {
      pinMode(3, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      Serial.begin(9600);
      lcd.begin(16, 2);
      lcd.print("Time:");
      lcd.setCursor(0, 1);
      lcd.print("Temperature:");
    }
    void loop() {
      if (Serial.available() > 0) {
          Serial.println ("Hours");
          t1 = Serial.read();
          delay (6000);
          Serial.println ("Minutes");
          t2 = Serial.read();
          delay (6000);
          Serial.println ("Seconds");
          t3 = Serial.read();
          delay (6000);
      } else {
        float v = analogRead(A5) * 5 / 1024.0;
        float r1 = v / (5 - v);
        float ttre = 1./( 1./4300*log(r1)+1./(25. + 273.) ) - 273;
        lcd.setCursor(12, 1);
        lcd.print (ttre,1);
        lcd.setCursor(6, 0);
        if (ttre > 18 && ttre < 27) {
          analogWrite (5, 10);
          digitalWrite (6, LOW);
          digitalWrite (3, LOW);
        } else if (ttre < 18) {
          analogWrite (6, 10);
          digitalWrite (5, LOW);
          digitalWrite (3, LOW);
        } else {
          digitalWrite (3, HIGH);
          digitalWrite (5, LOW);
          digitalWrite (6, LOW);
        }
        lcd.setCursor(6,0);
        lcd.print(t1);
        lcd.print(":");
        lcd.print(t2);
        lcd.print(":");
        lcd.print (t3);
        Serial.print (t1);
        Serial.print (":");
        Serial.print (t2);
        Serial.print (":");
        Serial.println (t3);
        t3 = t3 + 1;
        if (t3 >= 59) {
          t2 = t2 + 1;
          t3 = 0;
        }
        if (t2 >= 59) {
          t1 = t1 + 1;
          t2 = 0;
        }
        if (t1 >= 24) {
          t1 = 0;
          t2 = 0;
          t3 = 0;
        }
        delay(990);
      }
    }
    Вот мой код. Он рабочий, но с одним но: время после запуска скидывается на 0, что нормально. Но у меня не получается задать время через USB, он выдаёт немыслимые значения и потом снова скидывается на ноль. Прошу помощи.
    P.s. Я сделал часы с термометром: на дисплей выводится текущая температура и время (к сожалению с последней загрузки). А температура ещё и светодиодами дополняется.
     
  2. rkit

    rkit Гуру

    может вам Serial.parseInt, а не read ?
     
  3. А можно о нём поподробнее?
     
  4. sslobodyan

    sslobodyan Гик

    Не, ну вы же не рассказываете какие данные посылаются для установки времени. О parseInt почитайте в гугле, но можно и read использовать. Все зависит от того, что идет на вход ардуинке. И еще необходимо в начале слать какой-то признак начала пакета, иначе ардуина не разберет где минуты, а где часы. Короче, пока проблема в протоколе обмена (любые устройства, которые хотят общаться, должны придерживаться протокола). Описывайте протокол, потом подскажем.
     
  5. Собственно говоря уже не надо. Я воспользовался вашим советом, советом rkit а, и в итоге всё получилось. Мне просто надо было заменить delay на однажды вызванный Serial.setTimeout и всё заработало.
    Но остался один вопросик. Сейчас, когда количество секунд меньше 10 (t3) у меня показывается нужное число, а после него цифра, которая осталась от когда-то показывавшегося двухзначного числа. Тоесть вместо записи на дисплее "12:35:01" я вижу "12:35:51". Есть ли тут что-то вроде Паскалевского case, чтоб назначить t3 значение "01" вместо "1"?
     
  6. Извиняюсь, я забыл сказать, что уже пытался это поправить, перенося курсор дальше когда t3 < 10 и тогда получалось "12:35:51". А если смотреть по коду, который я показал в первом сообщении, то там получается как-то так "12:35:18" вместо "12:35:1"
     
  7. Вот код, который работает на данный момент:

    Код (C++):
    #include <math.h>
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(13,12,11,10,9,8);
    int t1,t2,t3;
    void setup() {
      pinMode(3, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      Serial.begin(9600);
      lcd.begin(16, 2);
      lcd.print("Time:");
      lcd.setCursor(0, 1);
      lcd.print("Temperature:");
    }
    void loop() {
      if (Serial.available() > 0) {
          Serial.println ("Hours");
          Serial.setTimeout(5000);
          t1 = Serial.parseInt();
          Serial.println ("Minutes");
          t2 = Serial.parseInt();
          Serial.println ("Seconds");
          t3 = Serial.parseInt();
      }
        float v = analogRead(A5) * 5 / 1024.0;
        float r1 = v / (5 - v);
        float ttre = 1./( 1./4300*log(r1)+1./(25. + 273.) ) - 273;
        lcd.setCursor(12, 1);
        lcd.print (ttre,1);
        if (ttre > 18 && ttre < 27) {
          analogWrite (5, 10);
          digitalWrite (6, LOW);
          digitalWrite (3, LOW);
        } else if (ttre < 18) {
          analogWrite (6, 10);
          digitalWrite (5, LOW);
          digitalWrite (3, LOW);
        } else {
          digitalWrite (3, HIGH);
          digitalWrite (5, LOW);
          digitalWrite (6, LOW);
        }
        lcd.setCursor(6,0);
        lcd.print(t1);
        lcd.print(":");
        lcd.print(t2);
        lcd.print(":");
        if (t3 <10) {
          lcd.setCursor (13, 0);
        }
        lcd.print (t3);
        Serial.print (t1);
        Serial.print (":");
        Serial.print (t2);
        Serial.print (":");
        Serial.println (t3);
        t3 = t3 + 1;
        if (t3 >= 59) {
          t2 = t2 + 1;
          t3 = 0;
        }
        if (t2 >= 59) {
          t1 = t1 + 1;
          t2 = 0;
        }
        if (t1 >= 24) {
          t1 = 0;
          t2 = 0;
          t3 = 0;
        }
        delay(998);
    }
     
  8. Кстати, глупое добавление такой вот строчки, после вывода времени не помогло.
    Код (C++):
    Serial.println ("    ");
     
  9. Я дурак. Естественно куча пробелов после времени, которое отправляется по USB не изменит что-то на дисплее. Я имел ввиду вот эту строчку, которая даже помогла:
    Код (C++):
    lcd.print("    ");
     
  10. ANV

    ANV Гуру

    Формируйте строку для вывода при помощи sprintf и тогда не надо ни пробелы выводить, ни case делать