Изучал только бейсик в 1990г.)))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Люди добрые, Здравствуйте!

Из назвния темы думаю понятно какой из меня программист. Пытаюсь найти литературу для ПОЛНЫХ ЧАЙНОКОВ, но к сожления не получется. Читал различные книги по теме, но чтоб их понять требуюся хотя бы базовые познания. Название операторов, данных, функций - прочел, но куда их лепить?... Одним словом нужна пощь в изучении материла. 

 Задачка такова: 10 диодов подключены к цифровым портам 1-10, кнопка 12. Скетч "Бегущий огонь". Требуется чтоб при коротком нажатии огонь пробегал 3 раза. А при постоянно зажатой кнопке он бегал, пока Крона не умрет. 

Из кусков найденных в нэте, собрал скетч "Бегущий огонь". Не судите строго...

unsigned char n;

int buttonPin = 12; 
 
void setup()
 
{
    pinMode(buttonPin, INPUT);
    for (n = 0; n <= 10; n++)
    {
        pinMode(n, OUTPUT);
        digitalWrite(n, 0);
         
}
}
void loop()
{   
 
  if  (digitalRead(buttonPin)==HIGH)
    { for (n = 0; n <= 10; n++)
    
      {digitalWrite(n++, 1);
        delay(75);
        digitalWrite(n--, 0);
}
     
     for (n = 0; n <= 10; n++)
    {
      digitalWrite(n, 0);
}
В этом скетче я не понимаю половины написаного...
Тупо брал куски, компилировал и дальше...

Сама схемка здесь:https://circuits.io/circuits/2389951-running-fire/edit

Если кто решится помочь, буду премного благодарен!

Celestron
Offline
Зарегистрирован: 13.04.2016

Начнём сначала. Архитектура программы понятна? Синтаксис понятен?

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Туманно...

Ахитектура не очень...

Про скобки, точки с запятыми вроде понятно... Не понятно от куда слова лишние беруться типа: batton, led.... Есть какой то справочник, или можно писать все что ты хочешь назвать в своем устройстве?

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Сам я механик. И образование техническое. Если зацепиться за начало нити, я думаю размотать клубок ума хватит. Но я его пока не нашел...

Celestron
Offline
Зарегистрирован: 13.04.2016

Тогда позвольте Вас отправить сначала вот сюда https://www.youtube.com/playlist?list=PLfDmj22jP9S759DT250VVzfZs_4VnJqLa

Потом сюда http://arduino.ru/Reference

А потом приходите обратно сюда... И если будут вопросы Вам обязательно ответим.

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

В моем видение этот скетч выглядит так:

unsigned char n;         //Беззнаковый тип-это с автопереводчика. Почему он написан именно так? Откуда этот ТИП взялся? С n, понятно- номер чего то, в данном случае порта. И как ТИП связан с портами?

int buttonPin = 12;  //Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. Вроде ясно. Но почему нужно писать именно"Кнопка"? С портом тут ясно ...
 
void setup() //Установочные данные, тоже вкурил...
 
{
    pinMode(buttonPin, INPUT);  //12 порт работает на вход от кнопки
    for (n = 0; n <= 10; n++)  // вот тут: почему  for (для) стоит за {} хотя и относится к ним? n=0 - начинаем с 0 порта. n<=10 - диапазон от 0 до 10 портов. n++ - начиная с 0 порта прибавляем 1
    {
        pinMode(n, OUTPUT); // n=0, т.е. с 0 порта согласно формуле в for переключем на выход
        digitalWrite(n, 0); // вот тут не ясно, но без этой строки диоды не потушены, а горят с начала
         
}
} // двое скобок, т.е. один в другом, раз скобки открылись, то и закрыться они должны стоко же раз, это из математики 5 класс, помню
void loop() // сама программа
{   
 
  if  (digitalRead(buttonPin)==HIGH) // если кнопка ВКЛ
    { for (n = 0; n <= 10; n++)  // для n и им подобным
    
      {digitalWrite(n++, 1); // даем еденичку на порт 0, потом на следующий....
        delay(75);                // единичку даем на 75 милисекунд
        digitalWrite(n--, 0); // а тут что то уменьшаем и выключаем...
}
     
     for (n = 0; n <= 10; n++) // вот это написано для того, чтоб выключить все сразу, только почему именно так? Иначе не получалось.
    {
      digitalWrite(n, 0);
}
 
Понимаю, эти откровения многим будут смешны, но надеюсь кому то они напомнят себя.
Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Я по натуре своей - практик. По этому мне легче воспринимать инфу в процессе ее деталировки и видя к чему приводит каждая цифра.

Celestron
Offline
Зарегистрирован: 13.04.2016

Дядя Федор пишет:

unsigned char n;         //Беззнаковый тип-это с автопереводчика. Почему он написан именно так? Откуда этот ТИП взялся? С n, понятно- номер чего то, в данном случае порта. И как ТИП связан с портами?

int buttonPin = 12;  //Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. Вроде ясно. Но почему нужно писать именно"Кнопка"? С портом тут ясно ...
 
Это объявления переменных соответствующего типа с именами n и buttonPin. Назовите хоть хомячком ардуине и СИ++ все равно.
 
{} после for это кусок кода, который в этом цикле должен исполнятся.
 
В целом, все понимаете правильно, но Вы не воспользовались моими ссылками, там все есть. Особенно у Джереми Блюма.
Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Попробую....

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Теперь про называния стало ясно!)))

И на том спасибо!)))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Вернемся к моей задчке: Как отобразить короткое нажатие? Какой функцией воспользоваться чтоб было 3 прохода огонька? Нужно ли в void setup() что то прописывать для 3 проходов огоньков и почему? КОРОЧЕ... неее длиннее получается!)))))

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Дядя Федор пишет:

Вернемся к моей задчке: Как отобразить короткое нажатие? Какой функцией воспользоваться чтоб было 3 прохода огонька? Нужно ли в void setup() что то прописывать для 3 проходов огоньков и почему? КОРОЧЕ... неее длиннее получается!)))))

КОРОЧЕ... ты ещё попроси тебя удочерить:

1. Вставка программного кода в тему/комментарий

2. Программирование

затем, приходи и спрашивай, что тебе в п.1-2 не понятно.

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

{} после for это кусок кода, который в этом цикле должен исполнятся.

 

 

 

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

Но как?))))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Удочерить?))) Забавно! Ох мачеху любить буду!))))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Про вставочку, спасибо! Учту!)))

Celestron
Offline
Зарегистрирован: 13.04.2016

Дядя Федор пишет:

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

Но как?))))

Вообще-то вложенность циклов один в другой никто не отменял. Ну как мне Вас попросить ссылки посмотреть? Ну, пожалуйста....

Araris
Offline
Зарегистрирован: 09.11.2012

Экий колоритный персонаж на форум пришел..

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Ссылочками завтра к вечеру займусь. Потом обязательно отчитаюсь. Мне правда хочется ВКУРИТЬ! А пока получается только курить...

Celestron
Offline
Зарегистрирован: 13.04.2016

Так может сразу нужно было сказать, что завтра посмотрите... и наше время не тратить... Ну Ё моё... А потом еще и скажет: "И на том спасибо!"

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Дядя Федор пишет:
Потом обязательно отчитаюсь.

ты точно уверен, что твои отчёты будут кому-то, кроме меня будут интересны?

double1
Offline
Зарегистрирован: 04.07.2016

задача: Требуется чтоб при коротком нажатии огонь пробегал 3 раза. А при постоянно зажатой кнопке он бегал, пока Крона не умрет. 

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

я в ардуино синтаксисе еще не очень, надеюсь, все верно написал

unsigned char n;
int buttonPin = 12; 
 
void setup()
 
{
    pinMode(buttonPin, INPUT); //knopka
    for (n = 0; n <= 10; n++)
    {
        pinMode(n, OUTPUT);
        digitalWrite(n, 0);
    }
    
         
}

void ledwave()
{
  for (n = 0; n <= 10; n++)
    
      {
        digitalWrite(n, 1);
        delay(75);
        digitalWrite(n, 0);
        delay(75);
       }
}


void loop()
{   
 
  if  (digitalRead(buttonPin)==HIGH) //если нажата кнопка
    {
      ledwave(); //первая волна
      ledwave(); //вторая волна
      ledwave(); //третья волна
    }
     
}

 

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Добрый вечер, сенсей! Посмотрел уроки умного мальчика в очках, но пока они не толкнули мысль в верном направлении. Хотя какие то проблески стали появляться. 

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Благодарю за подсказку! Она работает. Но меня не устраивает то что после выключения кнопки цикл дорабатывет себя. Т.Е 3 пробега постоянно.

Меня интересовл другой вопрос:

if (digitalRead(buttonPin)==HIGH) скетч работает в бесконечном цикле,

if (digitalRead(buttonPin) кнопка нажата коротко или ипульсно)идет лишь 3х кратное повторение.

Как отобразать кратковременность нажатия кнопки?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016
Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Хотя бы примерчик... Сенсей!)))

Или что то похожее..... Для меня пока то что написано в "Програмировании", это туман в безлунную ночь в густом лесу... Или задачку дай какю, попроще...

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Дядя Федор пишет:

Хотя бы примерчик... Сенсей!)))

Или что то похожее..... Для меня пока то что написано в "Програмировании", это туман в безлунную ночь в густом лесу... Или задачку дай какю, попроще...

там примеры есть.

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Для тебя то что написано в Программировании - аксиомы. А для меня- тоеремы! И посложней чем- Пифогоровы штаны, во все стороны равны!)))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Ладно! И на том спасибо, добрый человек!)))

gena
Offline
Зарегистрирован: 04.11.2012
Дядя Федор
Offline
Зарегистрирован: 07.07.2016

По ходу ШИМ приплетать надо...

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Благодарю!

 

Дядя Федор
Offline
Зарегистрирован: 07.07.2016
unsigned char n;
int buttonPin = 12;
  
void setup()
  
{
    pinMode(buttonPin, INPUT); //knopka
    for (n = 0; n <= 10; n++)
    {
        pinMode(n, OUTPUT);
        digitalWrite(n, 0);
    }
     
          
}
 
void ledwave()
{
  for (n = 0; n <= 10; n++)
     
      {

        digitalWrite(n++, 1);
        delay(75);
        digitalWrite(n--, 0);
        }
      
        for (n = 0; n <= 10; n++)
    {
      digitalWrite(n, 0);
     } 
}

 
 
void loop()
{  

  
  if  (digitalRead(buttonPin)==HIGH)
    
    {delayMicroseconds(10);
      ledwave(); //первая волна
      ledwave(); //вторая волна
      ledwave(); //третья волна
    }
   if  (digitalRead(buttonPin)==HIGH) 
   {
  for (n = 0; n <= 10; n++)
     
      {

        digitalWrite(n++, 1);
        delay(75);
        digitalWrite(n--, 0);
        }
      
        for (n = 0; n <= 10; n++)
    {
      digitalWrite(n, 0);
     } 
}  
}

Господа, понимаю, какая то хрень, но вроде работает.

Что можно упростить?

Правильно ли я обозначил импульс на кнопку?

Материте меня, смейтесь над моей тупость, но пожалуйста по делу!

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Ё моё, через 3 часа н работу!))) Всем удачи!

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Выручай, дружище!)))

Celestron
Offline
Зарегистрирован: 13.04.2016

А зачем еще раз все тоже самое только в теле loop

Наверное так?

unsigned char n;
int buttonPin = 12;
  
void setup()
  
{
    pinMode(buttonPin, INPUT); //knopka
    for (n = 0; n <= 10; n++)
    {
        pinMode(n, OUTPUT);
        digitalWrite(n, 0);
    }
     
          
}
 
void ledwave()
{
  for (n = 0; n <= 10; n++)
     
      {

        digitalWrite(n++, 1);
        delay(75);
        digitalWrite(n--, 0);
        }
      
        for (n = 0; n <= 10; n++)
    {
      digitalWrite(n, 0);
     } 
}

 
 
void loop()
{  

    if  (digitalRead(buttonPin)==HIGH)
    {
        delayMicroseconds(10);
        for(byte i = 0; i < 3; i++)
            ledwave();                        //три раза пускаем волну
    }
}

Но это не решает вопроса с прерыванием работы волны при отпускании кнопки. Если сильно не париться, то можно эту проверку (на нажатую кнопку) вставить в циклы, которые в ledwave().

И кстати, здесь ничего нет про устранение дребезга контактов... :)

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Работать то работает, но не так как хотелось бы...... иногда при коротком нажатии бывет 3 прохода,  а иногда 1. Значит с кнопкой я не справился.....

Celestron
Offline
Зарегистрирован: 13.04.2016

Ну правильно, ты только один раз проверяешь кнопку, и если она СЕЙЧАС в статусе НАЖАТА, то пускаешь три волны (без возможности их прервать). И только после трех волн опять проверяешь кнопку. Итак в вечном цикле "loop".

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Я же и пишу, что я дуб-дубейный!)))

Задача эта, поворотник с удленнителем. При коротком нажатии на три пробега световых, при постоянном сигнале бегают огоньки. Зачем второй раз? Так я думал что первый для короткого нажатия, а второй для постоянного сигнала. Вот тебе и ХАХА!)))

Celestron
Offline
Зарегистрирован: 13.04.2016

Ну тогда так и оставь. Все должно работать. Логически подумай... Если кнопка постоянно нажата, то каждый раз при ее опросе будут запускаться волны, а если пока идут первые три волны кнопку отпустить, то на них все и кончится.

If же будет возвращать false...?

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Как мне суть понять? Я не хочу останавливаться. Я хочу вникнуть... А читая список терминов на разных сайтх, что к чему лепить и от чего оттолкнуться, к сожалению не пойму.

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Тогда дребезг остается....

Celestron
Offline
Зарегистрирован: 13.04.2016

йооооо... У тебя код сейчас должен выполнять все согласно твоей задаче.

Celestron
Offline
Зарегистрирован: 13.04.2016

Он уже не так критичен, но да - остается дребезг. См. "очкастого мальчика".

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Меня спрашивали об архитектуре. Где про нее можно прочесть? Какая терминология?

Логический (булевый) тип данных — boolean. Может принимать одно из двух значений true или falseboolean занимает в памяти один байт.

Замечательно написано!!! Но с моими познаниями.....

что за цикл? луп? ладно что в него напихать можно? Как подготовить к работе? Как ограничить количество циклов? КАк связать с дополнительными задачами?

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Еслиб это был сайт по ремонту двигателей и АКПП, я бы чувствовал себя чуток уверенней!))))

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

If же будет возвращать false...?

об этом можно по подробней?

Celestron
Offline
Зарегистрирован: 13.04.2016

Не-е, так не пойдёт. Найди что-нибудь типа "C++ для чайников". Это C++. По архитектуре программ для ардуино ты и сам все знаешь, сам писал и про loop и про setup.

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

+ Дядя Федор.   Для того что бы отработать дребезг, надо знать несколько правил: 1- время дребезга при нажатии и отжатии клавиши конечно. И если вы сделаете замер с паузой между ними, то всегда можете отработать клавишу.

Пример, измеряем без дребезга клавишу (0 нажата)  111000111

Теперь с дребезгом (Х это дребезг случайно вылетет 0 или 1) 111ХХ000ХХ111. Дребег два знака. Если измеряте с шагом в три и запоминаете старое значение, то  послед 10 нажатие клавиши надо делать 3 волны. 00 делать много. Но скорее всего так не получится. Вы наверно поняли почему.  Тяжело определи долго или коротко нажата клавиша если клавиша только что нажата. Скорее всего алгоритм надо изменить. Делать всегда когда клавиша нажата, а вот после отжатия выполнить 3 волны и остановится. Будет короткое нажатие пройдут три волны.

Дядя Федор
Offline
Зарегистрирован: 07.07.2016

Благодарю за столь высокую оценку, но она пока не для меня!))) Пока буду пытаться наполнять пустой чайник!))))