Разбиение кода на части
- Войдите на сайт для отправки комментариев
Доброго дня всем. Ребята, сильно не пинайте, я только изучаю программирование на ардуине. Видел несколько скейчей, где имеется основной файл *.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, спасибо. Добрался до компа и проверил. Все работает. С темой разобрался. Думаю всем будет полезно.
Позже выложу на сайте что я разработал.
Насчёт любой - погорячился конечно. В любой, но с соблюдением области видимости.
Объявления объявленные внутри блока, разумеется, за пределами этого блока не видны.
Осознал, внезапно. Решил уточнить.))