Код перестает работать без команды "Serial.print().

j777
Offline
Зарегистрирован: 20.08.2018

Приветствую!!! Заранее говорю, что на форуме впервые. И если, что-то делаю тут не по феньшую-Пардон!

В общем начинаю осваивать программирование. Ситуация такая... Создал код, в котором имеется примитивный счетчик, при том как счетчик дотикал до определенного значения выполняется действие. И код в целом работает, но только с командой "Serial.print" ну так же конечно и с "Serial.println". Пробывал все, что может придти мне в голову при моем навыке программирования, ни чего не помогло. Остановился на примере приведенном в Arduino IDE(чтоб всех тут не "убить" своими "извращениями"))) таком как "blink without delay", суть таже. Только заменил в нем команду "millis()" на простецкую функцию счетчик.  Так вот, если закоментировать команду "Serial.println(i);", которая отображает колличество тиков, то светодиод перестает изменять свое состояние. Кто-нибудь может подсказать почему код не правильно работает без "Serial.print"??? Вот код:

int count;
int i;
 
const int ledPin =  LED_BUILTIN;
int ledState = LOW;     
int previousMillis = 0; 
const int interval = 200; 
 
void setup() 
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
 
}
 
void loop() 
{
  //Вызов функции счетчика и присваивание "i" значения счетчика для дальнейших вычислений.
  i=TIME(count);
  int currentMillis = i;
// собственно тот же "blink without delay" только с заменой миллис на значение счетчика
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
Serial.println(i);        
}
 
//Функция счетчик
  int TIME (int count2)
{
  count++;
  return count;
}
 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

вместо функции Serial.print можете поставить delay(1) - уверен. тоже поможет.

j777
Offline
Зарегистрирован: 20.08.2018

Спасибо за совет! Но делу не поможет. Изменения состояния светодиода будут происходить, но не с тем периодом который имеет переменная "interval".

kalapanga
Offline
Зарегистрирован: 23.10.2016

В отличие от миллис Ваши 200 - это не единицы времени, а "попугаи" - в данном случае число циклов loop. А длительность цикла зависит от того, что Вы в нём напишете. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
//Функция счетчик
  int TIME (int count2) //<-- обратите на count2
{
  count++; //<-- а тут совсем другая переменная
  return count;
}

Ну interval это не период а полупериод.  Дальше у вас там пара ошибок. Да и как вам помочь если изначально не знаем что вы хотите.

b707
Offline
Зарегистрирован: 26.05.2017

j777 пишет:
Спасибо за совет! Но делу не поможет. Изменения состояния светодиода будут происходить, но не с тем периодом который имеет переменная "interval".

переменная "interval" имеет крайне слабое отношение к периоду мигания диода, поэтому от добавления задержки ваша программа ничего не потеряет :)

Короче, не стадайте фигней, делайте цикл на настоящих миллис, а не на кривой замене...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы бы вставили код по человечески. В таком виде его смотреть невозможно, да и Вам что можно сказть? "Ошибка в строке №ХЗ"? Вас устроит такой ответ?

j777
Offline
Зарегистрирован: 20.08.2018

Да, Вы правы, в примере приведенном в этой теме не правильно указал имя переменной(ну т.е. count2).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кож будет нормальный или мне уходить?

j777
Offline
Зарегистрирован: 20.08.2018

Я ж говорю, первый раз на форуме( и про человеский пример отображения кода на сайте, даже пока понятия не имел, сорри.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну сейчас то имеете? Так Вы вставите или нет?

Или слово "code" в панели инструментов ввода сообщения зрение не позволяет разглядеть?

Не надо оправдываться. просто сделайте это. ну, или помогайте себе сами.

j777
Offline
Зарегистрирован: 20.08.2018
int count;
int i;

const int ledPin =  LED_BUILTIN;
int ledState = LOW;     
int previousMillis = 0; 
const int interval = 200; 

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

}

void loop() 
{
  //Вызов функции счетчика и присваивание "i" значения счетчика для дальнейших вычислений.
  i=TIME(count);
  int currentMillis = i;
// собственно тот же "blink without delay" только с заменой миллис на значение счетчика
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
//Serial.println(i);      
}

//Функция счетчик
  int TIME (int count)
{
  count++;
  return count;
}

 

j777
Offline
Зарегистрирован: 20.08.2018

все, сделал, по норме

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, так-то лучше. Теперь посмотрите на свой вопрос. Вы написали "если закоментировать команду "Serial.println(i);", которая отображает колличество тиков, то светодиод перестает изменять свое состояние". Что значит перестаёт? А в каком он находится? Он светится или нет? Нам самим догадываться? Учитесь задавать вопросы. Хрустальные шары тут запрещены, но рискну предположить, что он таки светится. Так? Далее, я Вам больше скажу. Он не только светится, но и мигает, только очень часто, с частотй примерно в килогерц. Глазом Вы этого не видите - возьмите осциллограф и убедитесь. А мигает он так часто, потому что Ваш интервал в 200 - это НИЧТО. Serial.print обеспечивала задержку, а без неё - мигает ... ну килогерц или околого того навскидку. Поставьте вместо print задержку на 50-100 мс и убедитесь.

P.S. Всё это относилось к изначальному коду. Потом Вы его "улучшили" :(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Замечательно: если раньше Ваша глобальная переменная менялась с неизвестной частотой, то теперь она вообще не меняется.

Невозможно найти ошибку, если неизвестно, что программа должна делать. А ни в том, ни в другом случае это непонятно.

И еще: по поводу вставки кода Вам совершенно правильно указали, и то, что Вы на форуме недавно, никак Вас не оправдывает потому, что Вы пренебрегли основным правилом хорошего тона на любом форуме: прежде чем писать на новый форум, следует его немного почитать.

j777
Offline
Зарегистрирован: 20.08.2018

миллис-то миллисом конечно же. но вопрос у меня в заключается в том что, почему при исключении(закоментированием) из кода строки№31-Serial.println(i), светодиод перестает мигать,?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А он не перестает, это Вам так только кажется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

j777 пишет:

миллис-то миллисом конечно же. но вопрос у меня в заключается в том что, почему при исключении(закоментированием) из кода строки№31-Serial.println(i), светодиод перестает мигать,?

так. Вечер перестайт быть томным.

Я Вам в посте #13 написал, что она на самом деле мигает, просто очень часто и потому  Вы этого не видите. Написал почему так происходит. Написал как это проверить. Вам что-то осталось непонятным? Или Вы не читаете, а только пишете?

j777
Offline
Зарегистрирован: 20.08.2018

Евгений, Вы правы. не правильно я поставил вопрос((( светодиод светился, если смотреть на него, в половину мощности. теперь я понял в чем дело!!! 

j777
Offline
Зарегистрирован: 20.08.2018

я не успевал прочесть все. тут много кто пишет.

j777
Offline
Зарегистрирован: 20.08.2018

Спасибо всем, кто дал ответ на вопрос!!!