подскажите по работе ФУНКЦИИ в arduion IDE

Тема в разделе "Arduino & Shields", создана пользователем archeryMaster, 6 дек 2016.

  1. archeryMaster

    archeryMaster Нуб

    Всем привет, пишу вот такое код для дальномера:
    При первой прошивке всё ОК, при второй и далее выдаёт ошибку:
    _______________________________________________________________________________
    Arduino: 1.6.12 (Windows 7), Плата:"Arduino/Genuino Uno"

    C:\Users\Преподаватель\Documents\Arduino\Robot_0.4\Robot_0.4.ino: In function 'void loop()':

    Robot_0.4:23: error: 'Zamer' was not declared in this scope

    exit status 1
    'Zamer' was not declared in this scope

    Как Такое лечить???
    ____________________________________________________________________________
    #include <Servo.h> //используем библиотеку для работы с сервоприводом
    Servo servoEho; //объявляем переменную servo типа Servo
    #define echo 2
    #define trig 3
    float duration, cm;
    float Ugol[19];
    float Rastoyanie[18];

    void setup() {
    servoEho.attach(10); //привязываем привод к порту 10
    pinMode(echo, INPUT);
    pinMode(trig, OUTPUT);
    Serial.begin (9600);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    // Zamer();
    for (int i = 0; i <= 18; i++) {
    servoEho.write(10 * i); //ставим вал под 0
    delay(300);
    Ugol = 10 * i;
    Rastoyanie = Zamer();
    Serial.print(Ugol);
    Serial.print(" = ");
    Serial.println(i);
    //delay(700); //ждем 2 секунды
    //замер
    }
    }


    long Zamer(){
    digitalWrite(trig, LOW);
    delayMicroseconds(5);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    duration = pulseIn(echo, HIGH);
    cm = (duration / 2)/29.1;
    return cm;
    }
     
  2. ostrov

    ostrov Гуру

    Попробуй между setup и loop написать:
    long Zamer();
     
  3. Securbond

    Securbond Гуру

    В последних версиях arduino IDE, функция в скетче должна быть написана до того как Вы её используете, а не в конце скетча.
    Попробуйте переместить это
    Код (C++):
    long Zamer(){
    digitalWrite(trig, LOW);
    delayMicroseconds(5);
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    duration = pulseIn(echo, HIGH);
    cm = (duration / 2)/29.1;
    return cm;
    }
    После этого
    Код (C++):
    void setup() {
      servoEho.attach(10); //привязываем привод к порту 10
      pinMode(echo, INPUT);
      pinMode(trig, OUTPUT);
      Serial.begin (9600);
    }
     
     
  4. ostrov

    ostrov Гуру

    Можно просто объявить заранее, а писать потом.
     
    Securbond нравится это.
  5. Securbond

    Securbond Гуру

    Спасибо за науку. Вам не верить нет причин, но по возможности проверю))
     
  6. rkit

    rkit Гуру

    Стандартная практика - включать .h файл для .c-файла в самом .c-файле.
     
  7. 9xA59kK

    9xA59kK Гик

    Объявляем Функцию в которой не надо ничего возвращать напрмер
    void Zamer(){
    ...........
    ...........
    }

     
    Последнее редактирование: 6 дек 2016
    Securbond нравится это.
  8. rkit

    rkit Гуру

    А как она должна возвращать значения тогда? Бред.
     
  9. AlexU

    AlexU Гуру

    Проблема кроется в "кракозябрах" между 'Users\' и '\Documents':
    Устраните их -- т.е. сохраните скетч в папке, в пути к которой не будет кириллицы (так же в именах желательно избегать пробелов) -- и всё наладится...
     
  10. Securbond

    Securbond Гуру

    Здесь не форум программистов. И то что для Вас стандартная практика, для других не очевидная вещь. Люди обращаются за советом.... Следуя Вашей логики на 8 из 10 вопросов на этом форуме можно отвечать - "чтайте учебник по С", " java", "python"...
     
  11. rkit

    rkit Гуру

    Ответ уже был дан в теме, а я его расширил.
    Направлять людей на книги не то что можно, а нужно. Кто же виноват в том, что 8 из 10 людей пытаются программировать, не зная теории? Короткий ответ на форуме может помочь залатать конкретный код, но не даст человеку реального знания, потому что не к чему эту информацию прикрепить. Кусок кожи без скелета.
     
    Последнее редактирование: 6 дек 2016
  12. AlexU

    AlexU Гуру

    Ай-ай-ай. Не вводите людей в заблуждение, так ничего не вернёте...
     
  13. rkit

    rkit Гуру

    Вот наглядный пример человека, который научился по советам с форумов.
     
  14. 9xA59kK

    9xA59kK Гик

    Немного накосячил исправляюсь
    long multiply(int a, int b)
    {
    return a * b;
    }
     
  15. 9xA59kK

    9xA59kK Гик

    Человек такое существо разнообразное, например посади его за руль авто и покажи как им управлять и уже через минут 15 он на нем поедет, хотя и знать ничего об авто не будет. Так мы человеки устроены, может подражать и копировать очень быстро не вникая в суть.
    Чем ардуина и привлекает столько народу , можно вообще ничего не знать о программировании , просто копировать части кода и будет как то работать, не вникая в суть.
    Это замануха, для того чтобы потом начать вникать, изучать и т.п. и т.д.
     
  16. Securbond

    Securbond Гуру

    Кому то будет достаточно кусочка кода, что бы сделать какую нибудь безделицу и радоваться жизни, а кто захочет, тот конечно пойдет дальше, купит книгу и будет изучать, если ему это нужно.....
     
  17. 9xA59kK

    9xA59kK Гик

    Да согласен полностью, вот к примеру вчерась пришел ко мне товарищ и пожаловался он на то что у него сгорело автомобильное зарядное КЕДР 10А. Там на мк ATTiny13 собрана вся схема управления зарядом.
    Ну и поковырялись, за пару часов запустили это дело на ардуине UNO, не особо вникая в суть всего этого. Первая прошивка для пробы заняла 5 строк кода, дольше разбирались куда и чего подключать. И я вовсе не программист и не был им с роду. И самое интересное что за основу был взят пример диммера на ардуине, из просторов инета .
     
  18. mcureenab

    mcureenab Гуру

    .h файл тут не при чем. Достаточно поместить объявление функции или другого идентификатора до того как она будет использована в тексте программы. .h файл нужен когда функция используется в разных единицах компиляции, чтобы не дублировать спецификацию вручную.
     
  19. ZAZ-965

    ZAZ-965 Гуру

    Предварительное объявление функции будет выглядеть так
    Код (C++):
    long multiply(int , int );
    т.е. вы сообщаете компилятору имя функции, тип возвращаемого значения + количество и тип параметров
     
    Alex19 и 9xA59kK нравится это.
  20. archeryMaster

    archeryMaster Нуб

    Мда... сделал папку в корне, всё заработало, кириллица не работает.