Разбиение кода на части
- Войдите на сайт для отправки комментариев
Доброго дня всем. Ребята, сильно не пинайте, я только изучаю программирование на ардуине. Видел несколько скейчей, где имеется основной файл *.ino с основновным кодом и куча файлов, среди них тоже есть файлы *.ino. В них находятся функции, к которым обращается основной файл. Хочу понять как это делается.
Нашел не большой код на котором пытаюсь разобраться что да как. Скомпилиоровал код и ошибок не вылазит.
int LedPin = 13; // Подключаем светодиод к порту 13 int ButPin = 10; // Подключаем кнопку к выходу 10 int valBut = 0; // Задаем переменную, для счетчика long previousMillis = 0; // Зададим начальное значение для счетчика millis long TimePush = 500; // Время нажатия на кнопку int LedVal = LOW; // устанавливаем начальное состояние светодиода void setup(){ pinMode(LedPin, OUTPUT); // Инициализируем порт "ledPin" как выходной } void loop(){ if(digitalRead(ButPin) == HIGH) // если кнопка нажата { if(millis() - previousMillis >= 1) // начинаем считать время нажатия { previousMillis = millis(); // valBut++; // с каждой миллисекундой увеличиваем значение valBut } }else // если кнопку отпустили, то valBut становится равным 0 { // это необходимо для защиты от срабатывания при частых valBut = 0; // многократных нажатиях } if(valBut >= TimePush) // как толькозначение valLed становится равным TimtPush { // Led_On_Off(); //Переходим к функции включения и выключения диода. Разбил код // valBut = 0; // и устанавливаем valBut = 0 } } void Led_On_Off() { digitalWrite(LedPin, LedVal =! LedVal); // то инвертируем состояние LedPin valBut = 0; // и устанавливаем valBut = 0 }
Не могу понять как перенести функцию void Led_On_Off на другую вкладку. Создаю новую вкладку. Даю ей имя dop. Автоматически появляется в папке с кодом этот файл с расширением .ino. Супер!!! это получилось сделать. Копирую эту функцию от void до } в созданную вкладку. Сохраняю все и запускаю компиляцию. Выходит ошибка, что функция не задекларированна.
Помогите плиз понятным языком (с примером) как это сделать. Туплю уже 3-й день и не выходит.
Пы.Сы. При вставки кода, использовал информацию с сайта, но почему-то он не пронумеровался и не свернулся. И выглядит как простой текст. Может чего не так сделал.
ы.Сы. При вставки кода, использовал информацию с сайта, но почему-то он не пронумеровался и не свернулся. И выглядит как простой текст. Может чего не так сделал.
Сори. Видимо при написании комментария оно выглядит так. При сохранении комментария все встало на свои места.
Получается, что мне нужно с 31 по 35 строку перенести в другую вкладку и соответственно в другой файл.
.... Выходит ошибка, что функция не задекларированна.
Если не задекларирована - значит надо задекларировать:
По-простому, декларацию можно добавить прямо в файл, где эта функция используется - куда угодно, но обязательно выше места первого вызова. Обычно, конечно, добавляют ближе к началу файла, чтобы сразу было видно, какие внешние функции нам понадобятся.
Если чуть более продвинуто - декларации выносятся в отдельный .h файл, например Led_On_Off.h
В .ino файл, естественно, добавляется строка #include "Led_On_Off.h"
Это обычное правило, для языка С/С++
Прежде чем использовать любую функцию, (переменную, и вообще что угодно), её необходимо или полностью описать (определить), или хотя бы декларировать (объявить). То есть, сообщить компилятору что такая функция есть, и показать ему как её вызывать.
В ардуиновой среде это правило слегка нарушается - декларировать не обязательно - препроцессор сам просматривает весь .ino файл, и сам добавляет декларации для всех найденных функций. Но способ работает только в пределах одного файла, поэтому, при переносе части кода в другой, появилась эта ошибка.
А еще #include нада делать.
Получается, что мне нужно с 31 по 35 строку перенести в другую вкладку и соответственно в другой файл.
Нет. Получается, что Вам нужно прочитать Кернигана и Ритчи.
Datak, спасибо. Хороший ответ. Одно но... Я правильно понял что декларировать ее нужно до setup? Так же как и переменные.
Понимаю что вопрос глупый, но из-за того что голова в тупике начинаю подтупливать.
Лучше, да, там же где переменные - так код будет выглядеть понятней.
Но если по каким-то причинам очень хочется - пожалуйста, никто не запрещает, можно в любой строке файла. Но обязательно до того места, где эта функция впервые вызывается.
Дык, есть там у меня, написано. Просто код забыл оформить, как положено.))
Datak, спасибо. Добрался до компа и проверил. Все работает. С темой разобрался. Думаю всем будет полезно.
Позже выложу на сайте что я разработал.
Насчёт любой - погорячился конечно. В любой, но с соблюдением области видимости.
Объявления объявленные внутри блока, разумеется, за пределами этого блока не видны.
Осознал, внезапно. Решил уточнить.))