Создание библиотек.

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

Здравствуйте.

Не очень давно открыл для себя ардуино, соответственно недавно начал программировать в среде Arduino IDE. Сегодня изучал создание библиотек на примере Morse.h, который описан почти во всех уроках по созданию библиотек. Выглядит она так

Morse.h

#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse
{
    public:
        Morse(int pin);
        void dot();
        void dash();
    private:
        int _pin;
    
};

#endif

Morse.cpp

#include "Arduino.h"
#include "Morse.h"

Morse::Morse(int pin){
    _pin = pin;
    pinMode(_pin, OUTPUT);
}

void Morse::dot(){
    digitalWrite(_pin, HIGH);
    delay(250);
    digitalWrite(_pin, LOW);
    delay(250);
}

void Morse::dash()
{
    digitalWrite(_pin, HIGH);
    delay(1000);
    digitalWrite(_pin, LOW);
    delay(250);
}

Простейшая библиотека, которая добавляет две функции dot() и dash(). Я понял принцип и устройство этой библиотеки, но мне хочется добавить в нее еще команды. Например команду SOS, которая будет состаять из 3-х dot(), 3-x dash(), и еще 3-х dot(). Как это можно реализовать? Я имею в виду, чтобы функция SOS состаяла из ранее описанных в этой библиотеки функций.

void SOS(){
    Morse::dot(); Morse::dot(); Morse::dot();
    Morse::dash(); Morse::dash(); Morse::dash();
    Morse::dot(); Morse::dot(); Morse::dot();
}

Такая запись не прокатила. Судя по всему это не правильно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Видишь ли есть такое изобретение у человечества , как книга. То что сейчас господсвует Интернет и социальные сети, не отменяет этот факт. А еще есть поисковики Гугл. Да и на форуме дохрена этих тем. Которые я лично выложил. Осталось вам их поискать. И да другие тоже выкладывали и ничего.Я на них не в обиде.

http://variable.saraff.ru/page.php?pg=19

https://vk.com/doc16756779_228187070?hash=88e5b6ccd4f822602c&dl=ccc12f55...

negavoid
Offline
Зарегистрирован: 09.07.2016

Да не, правильным путём идёт человек, чего б не подсказать

либо

#include "morse.h"
Morse m(13);

void manual_sos()
{
  m.dot(); m.dot(); m.dot();     // вызываем функции объекта [библиотеки] "вручную"
  m.dash(); m.dash(); m.dash();
  m.dot(); m.dot(); m.dot();
}

void setup() {}
void loop()  { manual_sos(); delay(1000); }

либо в morse.cpp

#include "Arduino.h"
#include "Morse.h"

Morse::Morse(int pin){
    _pin = pin;
    pinMode(_pin, OUTPUT);
}

void Morse::dot(){
    digitalWrite(_pin, HIGH);
    delay(250);
    digitalWrite(_pin, LOW);
    delay(250);
}

void Morse::dash()
{
    digitalWrite(_pin, HIGH);
    delay(1000);
    digitalWrite(_pin, LOW);
    delay(250);
}

void Morse::sos()
{
  dot(); dot(); dot();       // мы находимся внутри области видимости класса
  dash(); dash(); dash();    // и поэтому можем обращаться к функциям
  dot(); dot(); dot();       // сразу по их имени
}

+ добавить в morse.h

#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse
{
    public:
        Morse(int pin);
        void dot();
        void dash();
        void sos();     // добавим объявление функции
    private:
        int _pin;
    
};

#endif

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Боже, как давно это у меня было(больше года назад я это считал эталоном). А сейчас уже туфтой из-за delay(250);

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

Всякое бывает)) Учимся не сразу, что поделать. Лучше подскажи как тут можно сделать без delay()? Для меня это пока что трудновато

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

negavoid, Спасибо! Все работает.

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

negavoid
Offline
Зарегистрирован: 09.07.2016

Suslenkov Andrey

Не нужно тут делать ничего без delay(), не слушайте этого юношу, предпочитающего тратить такты на выполнение if millis() в цикле вместо того же цикла внутри delay, только пустого, усложняя поддержку кода, да и жизнь, и себе, и окружающим неофитам. :)

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

negavoid пишет:

Suslenkov Andrey

Не нужно тут делать ничего без delay(), не слушайте этого юношу, предпочитающего тратить такты на выполнение if millis() в цикле вместо того же цикла внутри delay, только пустого, усложняя поддержку кода, да и жизнь, и себе, и окружающим неофитам. :)

Возможно. Не думаю, что остановка выполнения кода в данном случае может как-то навредить

negavoid
Offline
Зарегистрирован: 09.07.2016

Suslenkov Andrey пишет:
я хотел позадротить и весь латинский алфавит вбить в эту библиотеку

Забейте, интернет уже сделал это за вас :) https://gist.github.com/baojie/4460468

negavoid
Offline
Зарегистрирован: 09.07.2016

*del double*

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

negavoid пишет:

Забейте, интернет уже сделал это за вас :) https://gist.github.com/baojie/4460468

Я знаю)) просто для практики, чтобы закрепить знания так сказать

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Suslenkov Andrey пишет:
Возможно. Не думаю, что остановка выполнения кода в данном случае может как-то навредить
А здесь работает такая поговорка: Тяжело в учении - легко в бою. Учится менять delay на millis желательно по раньше. А то что приходится для упрощения программирования изучать глубже Си -> C++ -> ОПП, так это хорошо, хотя и трудно.  И да  delay крадет ваши процессорные ресурсы, делая кирпичами как и быстрые, так и медленые процессоры.

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

qwone пишет:

А здесь работает такая поговорка: Тяжело в учении - легко в бою. Учится менять delay на millis желательно по раньше. А то что приходится для упрощения программирования изучать глубже Си -> C++ -> ОПП, так это хорошо, хотя и трудно.  И да  delay крадет ваши процессорные ресурсы, делая кирпичами как и быстрые, так и медленые процессоры.

Это да. Мне тоже знакомый один говорит не использовать delay. Можно конечно услажнить себе жизнь попробовать, может будет хорошей практикой. Как нибудь обязательно перепишу эту библиотеку без delay.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Suslenkov Andrey пишет:

negavoid, Спасибо! Все работает.

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

1. Честно говоря, этот широко раcтиражированный пример - яркий образец того, как не нужно писать программы:

- во-первых, название библиотеки категорически не отражает ее содержимого,

- во-вторых, автор взялся писать на тему, в которой он совершенно не разбирается.

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

2. Мне кажется, если Вы хотите сделать что-то хоть минимально полезное, то в библиотеке должна быть не куча функций под разные символы, а одна функция, воспроизводящая строку текста. (+ разумеется, некоторые дополнительные функции: например тот же сигнал SOS передается совсем не так, как строка "SOS")

3. Ну и само-собой длительность точки должна быть настраиваемой.

Suslenkov Andrey
Offline
Зарегистрирован: 25.05.2017

andriano пишет:

1. Честно говоря, этот широко раcтиражированный пример - яркий образец того, как не нужно писать программы:

- во-первых, название библиотеки категорически не отражает ее содержимого,

- во-вторых, автор взялся писать на тему, в которой он совершенно не разбирается.

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

2. Мне кажется, если Вы хотите сделать что-то хоть минимально полезное, то в библиотеке должна быть не куча функций под разные символы, а одна функция, воспроизводящая строку текста. (+ разумеется, некоторые дополнительные функции: например тот же сигнал SOS передается совсем не так, как строка "SOS")

3. Ну и само-собой длительность точки должна быть настраиваемой.

 

Я начал писать эту библиотеку не ради практической пользы, а ради тренировки, чтобы понять, как это вообще делается. То есть ради обучения. Само сабой, я еще ничего в этом не понимаю, но ведь не все сразу) И тему создал я для того, чтобы более продвинутые пользователи помогли мне в этом.

Я еще буду пробвать сделать строку текста, хотя, чесно говоря, совершенно не представляю, как это сделать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Suslenkov Andrey пишет:
Я еще буду пробвать сделать строку текста, хотя, чесно говоря, совершенно не представляю, как это сделать.

Насмешил. Я же говорю, что бы был толк в программировании надо копать Си->Cи++-> ООП очень глубоко.

Но ответ на ваш вопрос лежит на глубине 1-2 метра http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-po...     Учите классы и указатели. Без них у вас ничего не получится.