Библиотеки с нуля.

Здесь обсуждаем Arduino
Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Библиотеки с нуля.

Сообщение gurvinok » 08 янв 2016, 21:14

Ну класс это практически структура. Если нет объекта, то как к ее кишкам обращаться??? Это как телефон без микрофона и динамика. Сам есть, а толку ноль.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Библиотеки с нуля.

Сообщение GhostX » 08 янв 2016, 22:41

такие аналогии я уже читал в книге: "Попытка доступа к классу по смыслу сходна попытке сесть за руль чертежа автомобиля." :)
В принципе я бы денек, другой помучился и решил бы проблему, но сколько это займет сил и нервов... :)
Вот этот код был как образец.

Код: Выделить всё

#include <Servo.h>
 
class Flasher
{
  // Переменные - члены класса
  // Инициализируются при запуске
  int ledPin; // номер пина со светодиодом
  long OnTime; // время включения в миллисекундах
  long OffTime; // время, когда светодиод выключен
 
  // Текущее состояние
  int ledState; // состояние ВКЛ/ВЫКЛ
  unsigned long previousMillis; // последний момент смены состояния
 
  // Конструктор создает экземпляр Flasher и инициализирует 
  // переменные-члены класса и состояние
  public:
  Flasher(int pin, long on, long off)
  {
    ledPin = pin;
    pinMode(ledPin, OUTPUT);
 
    OnTime = on;
    OffTime = off;
 
    ledState = LOW;
    previousMillis = 0;
  }
 
  void Update()
  {
    // выясняем не настал ли момент сменить состояние светодиода
 
    unsigned long currentMillis = millis(); // текущее время в миллисекундах
 
    if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
    {
      ledState = LOW; // выключаем
      previousMillis = currentMillis; // запоминаем момент времени
      digitalWrite(ledPin, ledState); // реализуем новое состояние
    }
    else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
    {
      ledState = HIGH; // выключаем
      previousMillis = currentMillis ; // запоминаем момент времени
      digitalWrite(ledPin, ledState); // реализуем новое состояние
    }
  }
};
 
class Sweeper
{
  Servo servo; // сервопривод
  int pos; // текущее положение сервы 
  int increment; // увеличиваем перемещение на каждом шаге
  int updateInterval; // промежуток времени между обновлениями
  unsigned long lastUpdate; // последнее обновление положения 
 
  public: 
  Sweeper(int interval)
  {
    updateInterval = interval;
    increment = 1;
  }
 
  void Attach(int pin)
  {
    servo.attach(pin);
  }
 
  void Detach()
  {
    servo.detach();
  }
 
  void Update()
  {
    if((millis() - lastUpdate) > updateInterval) // время обновлять
    {
      lastUpdate = millis();
      pos += increment;
      servo.write(pos);
      Serial.println(pos);
      if ((pos >= 180) || (pos <= 0)) // конец вращения
      {
        // обратное направление
        increment = -increment;
      }
    }
  }
};
 
Flasher led1(11, 123, 400);
Flasher led2(12, 350, 350);
Flasher led3(13, 200, 222);
 
Sweeper sweeper1(15);
Sweeper sweeper2(25);
 
void setup() 
{ 
  Serial.begin(9600);
  sweeper1.Attach(9);
  sweeper2.Attach(10);
} 
 
 
void loop() 
{ 
  sweeper1.Update();
  sweeper2.Update();
 
  led1.Update();
  led2.Update();
  led3.Update();
}


я с него уже писал что то к серве и работало... Ща поищу, что именно писал.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Библиотеки с нуля.

Сообщение GhostX » 08 янв 2016, 22:52

Быстро нашлось.))
Писал, это просто чтоб понять как оно это все работает.
замечу, тут нет списка объектов!
Работает так, серва крутится до 0 или 100, по достижению инвертируется значение числа, которое прибовляется к позиции. То прибавляли 1, а дошли до 100, прибавлять начинаем -1 и так до 0, потом снова 1.
Тупо , но доходчиво.

Код: Выделить всё

#include <Servo.h> 
class Latok
{
   // Переменные - члены класса
   // Инициализируются при запуске
	Servo servo; // сервопривод
	int pos; // текущее положение сервы 
	int increment; // увеличиваем перемещение на каждом шаге
	int updateInterval; // промежуток времени между обновлениями
	unsigned long lastUpdate; // последнее обновление положения
	public:
	Latok(int interval)
	{
    updateInterval = interval;
    increment = 1;
    }
	void Attach(int pin)
    {
    servo.attach(pin);
    }
    void Update()
    {
      if((millis() - lastUpdate) > updateInterval) // время обновлять
      {
        lastUpdate = millis();
        pos += increment;
        servo.write(pos);
        //Serial.println(pos);
        if ((pos >= 100) || (pos <= 0)) // конец вращения
        {
          // обратное направление
          increment = -increment;
        }
      }
    }
};
Latok Latok1(20);

void setup() 
{ 
  Latok1.Attach(9);
}
void loop() 
{ 
  Latok1.Update();
  
}

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Библиотеки с нуля.

Сообщение gurvinok » 09 янв 2016, 14:21

Я думаю по этому примеру сразу все встанет на свои места.

Код: Выделить всё

#include <avr/io.h>

class summa // Объявляем класс summa
{
	private: // Объявляем объекты класса доступные только в данном классе
	
	char x;  // Объект класса переменная
	char y;  // Объект класса переменная
	
	char summ(void) // Объект класса функция
	{
		return x+y;
	}
	
	public: // Объявляем объекты класса доступные в любом месте программы
		
	char date(char date_1, char date_2) // Обхъект класса функция
	{
		x = date_1;
		y = date_2;
		
		return summ();
	}	
};

int main(void) // Основная функция программы
{
	char x = 0; // Локальная переменная
	
	DDRB = 0xFF; // Настраиваем порт В на вывод
	
	summa reshenie; // Создание экземпляра класса с именем reshenie
	
    while(1) // Бесконечный цикл
    {
       PORTB = reshenie.date(x, 1); // Вывод в порт данных полученных при вызове объекта date() экхемпляра класса reshenie
	   x++; // Увеличиваем переменную
    }
}
Данный пример соберет даже ардуина, так как у студии и дуины один и тот же компилятор GCC.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Библиотеки с нуля.

Сообщение GhostX » 09 янв 2016, 20:14

int main(void) // Основная функция программы

Это работает аналогично лупу из ардуины?

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Библиотеки с нуля.

Сообщение gurvinok » 09 янв 2016, 20:31

Не совсем. В ардуино это будет так.

Код: Выделить всё

class summa // Объявляем класс summa
{
   private: // Объявляем объекты класса доступные только в данном классе
   
   char x;  // Объект класса переменная
   char y;  // Объект класса переменная
   
   char summ(void) // Объект класса функция
   {
      return x+y;
   }
   
   public: // Объявляем объекты класса доступные в любом месте программы
      
   char date(char date_1, char date_2) // Обхъект класса функция
   {
      x = date_1;
      y = date_2;
      
      return summ();
   }   
};

// --------------------------------------------------------------------------------------------
  char x = 0; // Локальная переменная
  char data = 0;
  summa reshenie; // Создание экземпляра класса с именем reshenie
// --------------------------------------------------------------------------------------------

void setup() {
  
}

void loop() {
  
  data = reshenie.date(x, 1); // Запись данных в переменную data полученных при вызове объекта date() экхемпляра класса reshenie
  x++; // Увеличиваем переменную

}
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Библиотеки с нуля.

Сообщение GhostX » 10 янв 2016, 07:51

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

Код: Выделить всё

summa reshenie; //  вот так пишется создание экземпляра класса, но не всегда.
иногда вот так:

Код: Выделить всё

//---
class summa  //Вот такой вариант не совсем понятен, не встречал еще ни где в примерах, кроме как в примере тут 
                  //на форуме. И книге по с++ но там искал что то другое и читал урывками, там не об этом речь шла.
{
//тут всякое разное и сейчас не интересное
}reshenie; // а вот такое обозначение, если не ошибаюсь список объектов.
//---
summa reshenie(1,45,123); //так если нужно задать какие то параметры в самом классе единожды.  
                                     //например пауза между шагами сервы. Пользовался, удобно, не нужно по классу рыскать.
//----
summa reshenie;                   //  вот так, если нужно задать параметры, которые 
void loop() {                        //  постоянно обновляются и их необходимо обновлять. 3 дня ошибки летели, вымотали,
data = reshenie.date(x, 1);     // даже радости не испытал, получилось и получилось, идем дальше...[/color]
}
//----

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Библиотеки с нуля.

Сообщение gurvinok » 10 янв 2016, 10:31

Такая проблема возникает когда все превратилось в кашу. Перемешались классы, объекты, экземпляры классов и т.д. Я поэтому поводу не зря говорил что лучше не забивать голову ООП, а просто писать на чистых функциях. Если охота сгруппировать переменные, то можно использовать структуры. И никаких проблем с пониманием кода.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1112
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Библиотеки с нуля.

Сообщение GhostX » 10 янв 2016, 10:36

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

Аватара пользователя
gurvinok
Сообщения: 1480
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Библиотеки с нуля.

Сообщение gurvinok » 10 янв 2016, 10:42

Чтение книги с зада на пред)))
Если долго мучиться, может быть получится.

Ответить