Разбиение кода на части

moct05
Offline
Зарегистрирован: 26.12.2014

Доброго дня всем. Ребята, сильно не пинайте, я только изучаю программирование на ардуине. Видел несколько скейчей, где имеется основной файл *.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-й день и не выходит.

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

moct05
Offline
Зарегистрирован: 26.12.2014

moct05 пишет:

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

Сори. Видимо при написании комментария оно выглядит так. При сохранении комментария все встало на свои места.

moct05
Offline
Зарегистрирован: 26.12.2014

Получается, что мне нужно с 31 по 35 строку перенести в другую вкладку и соответственно в другой файл.

Datak
Offline
Зарегистрирован: 09.10.2014

moct05 пишет:

.... Выходит ошибка, что функция не задекларированна.

Если не задекларирована - значит надо задекларировать:

void Led_On_Off( );

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

Если чуть более продвинуто - декларации выносятся в отдельный .h файл, например Led_On_Off.h
В .ino файл, естественно, добавляется строка #include "Led_On_Off.h"

Это обычное правило, для языка С/С++
Прежде чем использовать любую функцию, (переменную, и вообще что угодно), её необходимо или полностью описать (определить), или хотя бы декларировать (объявить). То есть, сообщить компилятору что такая функция есть, и показать ему как её вызывать.

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

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А еще #include нада делать. 

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

moct05 пишет:

Получается, что мне нужно с 31 по 35 строку перенести в другую вкладку и соответственно в другой файл.

Нет. Получается, что Вам нужно прочитать Кернигана и Ритчи.

moct05
Offline
Зарегистрирован: 26.12.2014

Datak, спасибо. Хороший ответ. Одно но... Я правильно понял что декларировать ее нужно до setup? Так же как и переменные.

Понимаю что вопрос глупый, но из-за того что голова в тупике начинаю подтупливать.

Datak
Offline
Зарегистрирован: 09.10.2014

moct05 пишет:
... Я правильно понял что декларировать ее нужно до setup? Так же как и переменные.

Лучше, да, там же где переменные - так код будет выглядеть понятней.

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

DetSimen пишет:
А еще #include нада делать.

Дык, есть там у меня, написано. Просто код забыл оформить, как положено.))

moct05
Offline
Зарегистрирован: 26.12.2014

Datak, спасибо. Добрался до компа и проверил. Все работает. С темой разобрался. Думаю всем будет полезно.

Позже выложу на сайте что я разработал.

Datak
Offline
Зарегистрирован: 09.10.2014

Datak пишет:
.... можно в любой строке файла

Насчёт любой - погорячился конечно. В любой, но с соблюдением области видимости.

Объявления объявленные внутри блока, разумеется, за пределами этого блока не видны.

Осознал, внезапно. Решил уточнить.))