Раздел для новичков

Login123
Offline
Зарегистрирован: 08.01.2018

Добрый вечер, господа.

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

По образованию и профессии я химик, молодой. Как оказалось любая инженерная профессия требует понимания работы микроконтроллеров и знаний основ программирования. И мало-мальских навыков..

Начал учиться прогрммированию по учебнику Лукина, Паскаль. Хотел бы сказать, что повторил со школы Паскаль, но учитель у нас был мягко говоря плохой. Освоил основы довольно быстро, написал программку с мультиком в Паскале, понял, что углубляться дальше нет большого смысла. Поэтому решил перейти к изучению микроконтроллеров на ардуино, купил на Али старткит, и здесь столкнулся с языком С..

3 дня назад открыл учебник по Ардуино (ДЖЕРЕМИ БЛУМ), и сразу застопорлися на дребезжании кнопки. 2 дня голову чесал, так и не понял, тут явно дело в какой-то внутренней логике компилятора.

Вопрос такой, почему это работает? Вопросы в коде написал. 

 

const int LED=9;
const int BTN=2;
bool lastbutton=LOW;
bool currentbutton=LOW;
bool ledon=0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT); }

bool debounce(bool last) {
bool current=digitalRead(BTN);
if (last!=current) {    //переменную last мы никак не привязывали ко 2 выходу и не давали ей значений
                               // Почему программа сравнивает current с переменной которой мы не давали никаких значений?
delay(5);
current=digitalRead(BTN);
return current;  // не совсем понял, что означает "возвратить" переменную и зачем
}
}
void loop() {
currentbutton=debounce(lastbutton);
if (lastbutton==LOW&&currentbutton==HIGH)
{
ledon=!ledon;}
lastbutton=currentbutton;
digitalWrite(LED, ledon);}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
bool debounce(bool last) {  //это функция, last принимаемая переменная, debounce возвращаемое значение
bool current=digitalRead(BTN); //чтение кнопки
if (last!=current) {    //переменную last мы никак не привязывали ко 2 выходу и не давали ей значений
                               // Почему программа сравнивает current с переменной которой мы не давали никаких значений?
delay(5);
current=digitalRead(BTN);
return current;  // не совсем понял, что означает "возвратить" переменную и зачем
}
}

 

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

Login123 пишет:

По образованию и профессии я химик

А что, в университетах химиков не учат программированию?

Не может такого быть! Давно бы без лицензии остались, т.к. образовательный стандарт никто не отменял.

vk007
Offline
Зарегистрирован: 16.06.2015

Вы бы отформатировали свой скетч (в Arduino IDE это комбинация клавиш Ctrl+T) - появились бы отступы, а там и понимание возможно проще пришло бы. А сейчас у вас весь код, как под линейку, выравнен по левому краю. Компилятору это все-равно, а человеку удобнее читать, когда просматривается структура.

Login123
Offline
Зарегистрирован: 08.01.2018

Все, что было это Basic в Excel, учили аппроксимацию делать, которую спокойно ORIGIN осилит...

Login123
Offline
Зарегистрирован: 08.01.2018

ЕвгенийП пишет:

Login123 пишет:

По образованию и профессии я химик

А что, в университетах химиков не учат программированию?

Не может такого быть! Давно бы без лицензии остались, т.к. образовательный стандарт никто не отменял.

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

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

Требуйте "взад" деньги за обучение.

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

bool debounce(bool last) {

...
}
 
на паскале выглядело бы как-то так:
 
function debounce(last: boolean): boolean;
begin
...
end;
 
Понятно теперь, что такое last, какое у неё значение, и где возвращаемое значение ?
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:

Требуйте "взад" деньги за обучение.

или возвращайте обратно диплом. Мол если знаний нет, то и диплом это бумашка.

ПС: Человек считает, что тупо осидев там положеный срок , знания заведутся в голове, как червяки. А на деле надо учится всю жизнь, что бы хоть соответвовать уровню

Login123
Offline
Зарегистрирован: 08.01.2018

kalapanga пишет:

bool debounce(bool last) {

...
}
 
на паскале выглядело бы как-то так:
 
function debounce(last: boolean): boolean;
begin
...
end;
 
Понятно теперь, что такое last, какое у неё значение, и где возвращаемое значение ?

то что это логическая функция я понимаю:)

Вопрос в другом был, если посмотреть код, то для переменной last не задано ни какое значение, ни 0 ни 1, и сразу же после её объявления мы с ней же сравниваем current, которому присвоили значение с пина2. По логике получается ардуино случайно присваивает для переменной last значение и с ним сравнивает?

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

Не, с паскалем у Вас как-то тоже не особо. Про параметры функций что, не слышали? Как же это "значение не задано"? Функция вызывается в 21-й строке. И передаётся ей значение lastbutton. Чему оно в самый первый раз равно будет, смотрим в строке 3, где эта переменная объявлена. Всё, кстати, для паскаля применимо.

Почитайте уж ещё что-нибудь... Здесь такую азбуку не принято разжёвывать.

Login123
Offline
Зарегистрирован: 08.01.2018

Теперь понятно, мне думалось, что 21 строка определяется функцией, а оказалось, что наборот.

Ладно, спасибо!

 

arduino328
Offline
Зарегистрирован: 01.09.2016

Login123 пишет:

3 дня назад открыл учебник по Ардуино (ДЖЕРЕМИ БЛУМ), и сразу застопорлися на дребезжании кнопки. 2 дня голову чесал, так и не понял, тут явно дело в какой-то внутренней логике компилятора.

Вопрос такой, почему это работает?

В книге Джереми Блума (страница 57) подробно расписано как работает функция debounce() и весь скетч в целом.

Работает "антидребезг" кстати не самым лучшим способом, но для понимания новичками сгодится.

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

Login123 пишет:

Теперь понятно, мне думалось, что 21 строка определяется функцией, а оказалось, что наборот

Не очень понял, что значит "определяется функцией". Вас не смущает запись y = sin(x) ? sin - это функция, ей передаётся x, значение, которое функция возвращает, будет присвоено y. Всё то же самое в 21-й строке. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Login123 пишет:
Теперь понятно, мне думалось, что 21 строка определяется функцией, а оказалось, что наборот.
Это потому что вы не калиграфически написали свой скетч. Как минимум так надо

/**/
const int LED = 9;
const int BTN = 2;
bool lastbutton = LOW;
bool currentbutton = LOW;
bool ledon = 0;
/*объявление и описание функции*/
bool debounce(bool last)
{
  bool current = digitalRead(BTN);
  if (last != current) {  //переменную last мы никак не привязывали ко 2 выходу и не давали ей значений
    // Почему программа сравнивает current с переменной которой мы не давали никаких значений?
    delay(5);
    current = digitalRead(BTN);
    return current;  // не совсем понял, что означает "возвратить" переменную и зачем
  }
}
//------main-----------------------------------------------
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BTN, INPUT);
}
void loop()
{
  currentbutton = debounce(lastbutton);
  if (lastbutton == LOW && currentbutton == HIGH)
  {
    ledon = !ledon;
  }
  lastbutton = currentbutton;
  digitalWrite(LED, ledon);
}
/*Скетч использует 1100 байт (3%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 12 байт (0%) динамической памяти, оставляя 2036 байт для локальных переменных. Максимум: 2048 байт.
*/