Можно ли в arduino вызывать функции из файлов?

Тема в разделе "Arduino & Shields", создана пользователем Nikomas, 27 май 2020.

  1. Nikomas

    Nikomas Нерд

    Друзья, можно ли в Ардуино вызывать необходимые функции из других файлов *.h? Например вот так:
    Код (C++):

    Button.h
    int btn_1time_pressed () {
        // описание однократного нажатия на кнопку
    }
    int btn_2time_pressed () {
        // описание двухкратного нажатия на кнопку
    }
    int btn_long_pressed () {
        // описание длинного нажатия на кнопку
    }
     
    Код (C++):

    Led.h
    int led_error () {
        // трехкратное мигание светодиодом
    }
    int led_confirm () {
        // длинное мигание светодиодом
    }
    int led_done () {
        // короткое мигание светодиодом
    }
     
    Код (C++):

    Buzzer.h
    int buzzer_error () {
        // пятикратный сигнал
    }
    int buzzer_confirm () {
        -- длинный сигнал
    }
    int buzzer_done () {
        // короткий сигнал
    }
     
    Код (C++):

    ...
    if Button btn_1time_pressed=true then
        Led led_done // выполнение функции led_done из файла Led.h
        Buzzer buzzer_done // выполнение функции buzzer_done из файла Buzzer.h
    end
    ...
     
     
    Последнее редактирование: 27 май 2020
  2. KindMan

    KindMan Гик

    можно делать всё, что можно делать в С++
     
  3. b707

    b707 Гуру

    у него программа на Lua :)
     
  4. KindMan

    KindMan Гик

    Блин ... ну это тогда в раздел ESP8266, ESP32
     
  5. Nikomas

    Nikomas Нерд

    вы правы, некоторое время потратил на изучение Lua, но из-за недостатка примеров и грамотной обучалки решил перейти на C++
     
    ИгорьК нравится это.
  6. b707

    b707 Гуру

    код, что вы привели - на С++ работать не будет :)
    Не путайте и себя и других, В С++ таких операторов, как function или end и тп - нет
    Используйте правильный синтаксис
     
    NikitOS нравится это.
  7. Nikomas

    Nikomas Нерд

    исправил
     
  8. b707

    b707 Гуру

    можно, если включить файлы .h в основной директивами #include вот так:
    Код (C++):
    #include "led.h"
    #include "Buzzer.h"

    setup() {
    if (btn_1time_pressed()==true) {
        led_done(); // выполнение функции led_done из файла Led.h
        buzzer_done(); // выполнение функции buzzer_done из файла Buzzer.h

    }
     
    Последнее редактирование: 28 май 2020
  9. Nikomas

    Nikomas Нерд

    Отлично. Т.е. я могу разбить весь код на необходимые мне файлы и подгружать их по мере необходимости?
     
  10. b707

    b707 Гуру

    нет, "по мере необходимости" забудьте - это так в Луа было.
    В Си все файлы используются сразу.
    Для простоты можете считать, что первым действием компилятор "сшивает" все ваши .h и .ino файлы в один
     
  11. KindMan

    KindMan Гик

    Что-то тоже странное… опять LUA? :)
     
    b707 нравится это.
  12. b707

    b707 Гуру

    так и есть :) у ТС там был луа, я его чистил-чистил, чистил-чистил... :)
     
  13. ИгорьК

    ИгорьК Оракул Модератор

    upload_2020-5-28_0-35-44.png

    Пост сдал!
     
    SergeiL нравится это.
  14. Nikomas

    Nikomas Нерд

    )))
    Правда, очень не хватает примеров, где можно что-либо подсмотреть для себя. Не поверите, но я с пищалкой провозился несколько дней. И так и не победил ее.
     
  15. ИгорьК

    ИгорьК Оракул Модератор

    Не поспоришь, с пищалкой примеров не было :)
     
  16. ИгорьК

    ИгорьК Оракул Модератор

    P.S. "А не замахнуться ли нам на Вильяма, понимаете ли, нашего Шекспира".

    Посмотрел на ваши "замыслы" из первого поста...

    Понимаете, что на Lua, что на С++, что на Python - не важно. Сначала надо понять основы языка. Для этого вместо пищалки вы берете учебник и изучаете его. Без всякого железа, только на примерах учебника.

    Добившись более менее каких-то навыков - разбираетесь с тем, как работает железо.

    Примеры с пищалкой вы для ардуино конечно найдёте, но к написанию программы вас это мало приблизит.

    Так что начните с любого учебника С++ и доработайте его до состояния хотя-бы "я понимаю что написано в каждой главе" и сделал по одной задаче из них.
    Тогда с пищалкой проблем не будет. (Возможно)
     
    Последнее редактирование: 28 май 2020
  17. Nikomas

    Nikomas Нерд

    Это скорее не "замысел", а просто алгоритм работы.
    Так и делал все эти дни. Читал. Читал. Смотрел. Пробовал. Но согласитесь, примеров работы в Lua несравнимо меньше чем в Arduino. Взять тот же Ютуб. Если ввести в поиск "ESP8266", то обучалок с работой в Lua всего пару штук. В среде Arduino же несколько десятков. Вот взять ту же плату расширения I/O. Библиотека написана только на Arduino. Я, конечно, потом нашел на каком-то сайте нужную мне библиотеку, но опять таки единичный случай.

    Камнем преткновения в Lua для меня стали именно таймеры. Понимаете, в Ардуино как пишем, так и выполняем. ИМХО. Написали включить пищалку и выключить через delay() и оно заработало. Сразу. Без танцев.

    Согласен, что для меня асинхронность мышления Lua сначала подкупила. Это то, что мне по сути и необходимо. Выполнили событие когда надо, и deepSleep. Нет солнца (а я все это затеял именно для солнечного трекера) - снова deepSleep.

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

    Одним словом, ваш вклад в развитие NodeMCU проектов неоценим, но увы не для новичков.
     
  18. ИгорьК

    ИгорьК Оракул Модератор

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

    Танцы начнутся если в этот момент надо мигать лампочкой (или делать еще что-то). И вы поймете, что delay придется отменить. Да, решения здесь есть и их много, но все это определенные алгоритмы, с которыми вам придется разбираться в любом языке. В любом.
     
    Последнее редактирование: 28 май 2020
  19. ИгорьК

    ИгорьК Оракул Модератор

  20. b707

    b707 Гуру

    Эта простота обманчива. Не советую рассчитывать на использование delay() в сколько-нибудь сложных программах. Правильным является как раз использование асинхронных методов, примерно как в Луа.

    Тут важно научится мыслить как программист. Это нужно и для Луа и для Си... А язык - вторичен.
     
    Daniil и ИгорьК нравится это.