#1 2019-11-14 00:19:07

Xwells
Учасник
З Киев
Зареєстрований: 2019-11-13
Повідомлень: 6

Функция и чем ее "кормить"...

Всем доброго вечера!
Вопрос мой, надеюсь, простой... но ответа на просторах интернета я так и не нашел. Возможно это связано с неумением конкретизировать вопрос...
В общем ситуация такая: есть библиотека OneWire Тыць есть Nano есть скетч...

//для DS18b20
#include <OneWire.h>
//----------------------- МОДУЛИ -----------------------------
OneWire ds1(8); 
OneWire ds2(9);   

... в котором присутствуют 2а датчика один на 8м пине, второй на 9м (да, я в курсе что можно их на один пин вешать пачками )
и так: есть Библиотека(Класс(объект))-OneWire. Eсть ds1/ds2 - префикс экземпляра/метода (в сети как только это не называют) и собственно сам метод(функция) - OneWire myWire(pin) объясните плиз: что такое ds1/ds2 в смысле как "это" условное "имя" правильно называется? Возможно, для меня, это уже существенно ускорит поиск решения следующего вопроса...
Идем дальше... скетч:

//------------------ БИБЛИОТЕКИ --------------------
//для DS18b20
#include <OneWire.h>

//------------------- УСТАНОВКИ --------------------------
#define DEBUG 1          // ВКЛ/ВЫКЛ листинга в монитор порта
#define inPin 2          // пин 2 для прерывания 0 от датчика движения (HC-SR505)
#define myinterval 10000   // Время от последнего прерывания до заставки в мс
#define period1 10000   // Время от последнего прерывания до заставки в мс

//----------------------- МОДУЛИ -----------------------------
OneWire ds1(8);                       // Создаем объект (датчик температуры) OneWire для шины 1-Wire, на пине 8. Имя ds1.
OneWire ds2(9);

//----------------------ПЕРЕМЕННЫЕ-----------------------------

int temp_switcher = 1;
byte data[2];                   // Место для значения температуры локального датчика
float temp_dev1 = 0, temp_dev2 = 0, temp_dev3 = 0;    //Переменные значений температуры с датчиков

//----------------- Настройка железа --------------------------
void setup() {

#if (DEBUG==1)
  Serial.begin(9600); //открываем порт для связи с ПК
#endif
}

//!!!!!!!!!!!!!!!!!!!!!!! Запускаем основной цикл !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

void loop() {


  switch (temp_switcher) {

    case 1:
      Serial.print("Case1! ");
      static unsigned long start_time, stop_time;
      static boolean is_once;
      start_time = millis();
      if (is_once == 0) {
        stop_time = start_time + 1000;
        is_once = 1;
        temp_switcher = 2;
        Serial.print("start_time - "); Serial.println(start_time / 1000);
        Serial.println();
        break;
      }
      stop_time = start_time + myinterval;
      temp_switcher = 2;
      Serial.print("start_time - "); Serial.println(start_time / 1000);
      Serial.println();
      break;

    case 2:

      if (millis() >= (stop_time - 1000) ) {
        ds1.reset();      // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
        ds1.write(0xCC);  // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устройство
        ds1.write(0x44);  // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
        temp_switcher = 3;
        Serial.print("Case2!"); Serial.print("Time - "); Serial.println(millis() / 1000);
        Serial.print("start_time - "); Serial.print(start_time / 1000); Serial.print("   stop_time - "); Serial.println(stop_time / 1000);
        Serial.println();
      }
      break;

    case 3:

      if (millis() >= stop_time) {
        ds1.reset();     // Теперь готовимся получить значение измеренной температуры
        ds1.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устройство
        ds1.write(0xBE); // Просим передать нам значение регистров со значением температуры

        data[0] = ds1.read(); // Читаем младший байт значения температуры
        data[1] = ds1.read(); // А теперь старший

        temp_dev1 =  ((data[1] << 8) | data[0]) * 0.0625; //Формируем значение: - сперва "склеиваем" значение, затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
        temp_switcher = 1;
        Serial.print("Case3!"); Serial.print("Time - "); Serial.println(millis() / 1000);
        Serial.print("start_time - "); Serial.print(start_time / 1000); Serial.print("   stop_time - "); Serial.println(stop_time / 1000);
        Serial.print("temp_dev1 = "); Serial.println(temp_dev1, 1);
        Serial.println(" ");
      }
      break;

  }
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Скетч, по сути, с просторов интернета но переделанный без delay и без "бесконечного долбления" датчика запросами на измерения температуры как здесь + замашка на многопоточность т.к. есть еще NRF24 + GLCD и много что будет вешаться в дальнейшем...
Хочется выше изложенный скетч "упаковать" в функцию вида: long myTemp( XXXXX, unsigned long myinterval) которая будет использоваться в loop-e - myTemp(ds1, 5000); myTemp(ds2, 10000); ... ну или как то близко к этому... подскажите как это сделать или ссылкой поделитесь где про это почитать можно... т.е. по сути я не могу понять как в "автоматическом" режиме менять данные в скетче(будущей функции): xxx.reset();
                                       xxx.write(0xCC);
                                       xxx.write(0x44);
а именно ххх на ds1, ds2, mySensor и все что взбредет в голову как имя датчика...
з.ы. код лично для себя... без тапков пожалуйста... но, готов к конструктивной критике как в плане реализации функции так и скетча в целом...
з.з.ы.  знаю что "таймеры" в if-ках сделаны не правильно...переполнения не боюсь.. но постараюсь исправить... hmm
з.з.з.ы надеюсь понятно изложил суть "проблемы"...  roll

Неактивний

#2 2019-11-14 01:26:01

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 716

Re: Функция и чем ее "кормить"...

#include <OneWire.h>

OneWire ds(11);

unsigned long currentMillis;
float temp;

/////////////////////////////////////////////

float getTemp()
{
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr))
  {
    ds.reset_search();
    return -1000;
  }
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); 

  byte present = ds.reset();
  ds.select(addr);  
  ds.write(0xBE); 

  for (int i = 0; i < 9; i++) 
  { 
    data[i] = ds.read();
  }

  ds.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); 
  float TemperatureSum = tempRead / 16;

  return TemperatureSum; 
}

///////////////////////////////////////////////


void setup() 
{
  currentMillis = millis();
}

void loop()
{
  if(millis() - currentMillis > 1000)
  {
    temp = getTemp();
    currentMillis = millis(); 
  }
}

Неактивний

#3 2019-11-14 07:52:52

Watchdog
Гість

Re: Функция и чем ее "кормить"...

http://www.dut.edu.ua/uploads/l_1529_63503135.pdf

#4 2019-11-14 13:06:50

Xwells
Учасник
З Киев
Зареєстрований: 2019-11-13
Повідомлень: 6

Re: Функция и чем ее "кормить"...

2vvr  о чем это? Я ведь спрашивал как данные передать в функцию.. как забрать я и так знаю... + т.б. может скетч и правильно написан с точки зрения программирования, но с точки зрения работы устройства точно НЕТ. На датчик посылается 2а запроса.. первый на измерение а второй на передачу температуры ведущему устройству. Зазор запросов от 94-750мс ( в зависимости от битности измерения)... и главное... датчик ВРУЧНУЮ прописан в теле функции... а если его имя завтра будет другим? а если датчика станет 2а? копи-пастить вторую функцию и руками вбивать имя датчика? Или вычитывать функцию чтоб узнать как "правильно" назвать датчик чтоб все завелось?
2Watchdog  ))) подход конечно радикальный... за "словарь" конечно спасибо... 787страниц это вообще не вопрос... это мы быстренько... )))

Неактивний

#5 2019-11-14 13:18:36

Watchdog
Гість

Re: Функция и чем ее "кормить"...

Xwells пише:

... 2Watchdog  ))) подход конечно радикальный... за "словарь" конечно спасибо... 787страниц это вообще не вопрос... это мы быстренько... )))

Это лучший словарь, из тех которые я знаю. Стандарты вы не потянете. Есть ещё проще: https://proklondike.net/books/cpp/cplus_dlja_chainikov.html

#6 2019-11-14 13:23:51

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Функция и чем ее "кормить"...

Ну, а чего ты хотел-то? Ты задаёшь вопросы как в детском саду и при этом ещё и

Xwells пише:

без тапков пожалуйста

Так не бывает.

С тапками, могу подсказать. Надо, поехали ...

Ты можешь покороче вопрос задать без соплей на полстраницы? Что тебе конкретно нужно? Передать в функцию объет описанный как

OneWire ds1(8);
OneWire ds2(9);

это?
Ну так и передавай.

void myFunct(OneWire & ds) {
     ds.la-la-la();
}
...
myFunct(ds1);

Или чего тебе надо-то?

Неактивний

#7 2019-11-14 14:56:01

Xwells
Учасник
З Киев
Зареєстрований: 2019-11-13
Повідомлень: 6

Re: Функция и чем ее "кормить"...

2Кака Красава! Не, реально красава! В одной строке спас!  big_smile  Я же говорил что вопрос скорее пустяковый, но как его правильно задать не знал -> сопли... ведь все знаю что правильно заданный вопрос содержит 50%+ ответа...
За тапок спасибо... за дело тапком можно!  smile
И еще глупый вопрос roll где про эту конструкцию - (OneWire & ds) почитать... ну что за синтаксис что куда и как передаётся? Или надо в Классы поглубже лезть?
з.ы. не, ну реально СПАСИБО... уважил! з.з.ы. Watchdog меня учебниками уже затарил, так что я готов - назови просто главу big_smile

2Watchdog Я Ваш "тонкий" намек понял еще по первой ссылке smile и поверьте "изучение" контроллеров и языка я начинал с attyny13 сначала в DIP а потом и в SOT корпусе и язык изучал еще по отксереному учебнику, и "програмировал" еще в CVAVR + Proteus8 и зашивал все это через COM порт... физический... не USB... и мануал к контроллеру (регистры счетчиков/таймеров/прерывания) переводил с английского со словарем в руках а не с GoogleTranslate... потом забросил... слишком уж это не комфортно было, что паять что писать... а с появлением "готовых" решений на платах с USB + практически не ограниченной элементной базой и мизерной стоимостью датчиков и т.д. опять решил "размятся" - но кому надо это грязное белье? Я, пока, не ставлю себе задачу стать проФФессиональным программистом и написать сверх крутой софт... я пытаюсь заставить нужные МНЕ железяки выполнять нужные МНЕ действия... возможно это пока криво получается и местами я все же упираюсь в знание языка, но всему свое время... уж поверте я разберусь...  wink
2all Сори за оффтоп - нахлынуло smile

Неактивний

#8 2019-11-14 18:03:22

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 384

Re: Функция и чем ее "кормить"...

Xwells пише:

ну что за синтаксис

Это ссылки. Читается в любой книге по С++

Неактивний

#9 2019-11-14 18:38:45

Watchdog
Гість

Re: Функция и чем ее "кормить"...

Xwells пише:

... я пытаюсь заставить нужные МНЕ железяки выполнять нужные МНЕ действия... возможно это пока криво получается и местами я все же упираюсь в знание языка, но всему свое время... уж поверте я разберусь...  wink
2all Сори за оффтоп - нахлынуло smile

Разберётесь, если будете уделять время образованию. Мало уметь пользоваться дрелью, нужно ещё знать где отверстия сверлить. Успехов.

#10 2019-11-14 22:27:55

Xwells
Учасник
З Киев
Зареєстрований: 2019-11-13
Повідомлень: 6

Re: Функция и чем ее "кормить"...

Kaka пише:

Это ссылки. Читается в любой книге по С++

Ооооо я так и знал... 100500 раз про них читал и указатели тоже... не укладывается у меня это в голове  sad ... все равно спасибо. Направление понял... будем дальше муштровать...

Неактивний

#11 2019-11-15 15:09:14

Avazart
Учасник
Зареєстрований: 2019-05-05
Повідомлень: 181

Re: Функция и чем ее "кормить"...

Может не судьба? И это не Ваше?

Неактивний

#12 2019-11-15 23:53:28

Xwells
Учасник
З Киев
Зареєстрований: 2019-11-13
Повідомлень: 6

Re: Функция и чем ее "кормить"...

Avazart пише:

Может не судьба? И это не Ваше?

Самый результативный пост темы...

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму