Объединение двух sketch файлов

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Доброго времени суток, уважаемые!

Совсем недавно занялся ардуино, интересная штука, только почитываю и вникаю в тему.

Возник сразу вопрос - я так понимаю - один скетч файл должен содержать весь код всех подключенных устройств?

И в таком случае у меня есть 2 устройства, сейчас у меня ардуино прошит датчиком температуры, я тестировал как он работает и вот скетч

#include <OneWire.h>
  byte data[12];
  byte addr[8];
  float celsius;
  
OneWire  ds(A5);  // on pin A5

void setup(void) {
  Serial.begin(9600);
  ds.search(addr);
  ds.reset();
  ds.select(addr);
}

void loop(void) {
  byte i;
  
  ds.search(addr);
  ds.reset();
  ds.select(addr);
 
  ds.write(0x44,1);  
  
  delay(1000);     

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);  // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes

  unsigned int raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  celsius = (float)raw / 16.0;

  Serial.println(celsius);
}

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

#define RELE_1 9
#define RELE_2 8
#define ON 0
#define OFF 1
int ledPin = 13; // Светодиод на 13 порту
int inPin = 3; // ИК Датчик движения

void setup()
{
pinMode (ledPin, OUTPUT);
pinMode (inPin, INPUT);
digitalWrite(RELE_1, OFF);
digitalWrite(RELE_2, OFF);
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
}
void loop()
{
if (digitalRead(inPin) ==HIGH)
{
digitalWrite(ledPin, HIGH);
digitalWrite (ledPin, LOW);
digitalWrite(RELE_1, ON);
digitalWrite(RELE_1, OFF);
digitalWrite(RELE_2, ON);
digitalWrite(RELE_2, OFF);
}
}

 

KorPaEv
Offline
Зарегистрирован: 24.11.2014

И еще вопрос - датчик температуры понятно что работает всегда с обновлением, но с реле же все иначе - мне надо послать либо 1 либо 0 на влючение и выключение и никаких delay не будет я так понял? или нет?

bwn
Offline
Зарегистрирован: 25.08.2014

Объединение простое:

1. Подключаем библиотеки, объявляем пины, объявляем глобальные переменные.

2. "Setup" - инициализация устройств

3. "loop" - считывание данных, отработка таймингов и данных, принятие и исполнение решений.

3.1. Удобнее часть кода вынести в отдельные функции которые вызывать по мере надобности. В итоге в "loop" останентся опрос функций, отработка таймингов и принятие решений.

Как то так

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Я пока что с оптимизацией не готов поработать, но вот что получилось, не уверен что правильно и будет работать

У меня еще такой вопрос - на c# пишу управление программно как раз релюхой и тогда каким образом передавать команду именно в скетч на включение и выключение??

Вот скетч и ниже как я понимаю то что я буду передавать но как пока не ясно

#include <OneWire.h>
#define ON 1 //ВОТ ТУТ ОПРЕДЕЛЯЮТСЯ ПАРАМЕТРЫ ВКЛ И ВЫКЛ
#define OFF 0

  byte data[12];
  byte addr[8];
  float celsius;
  int relPinOne = 30; // РЕЛЕ ВИСИТ НА 30 и 31 пинах
  int relPinTwo = 31;
  
OneWire  ds(A5);  // on pin A5

void setup(void) {
  Serial.begin(9600);
  ds.search(addr);
  ds.reset();
  ds.select(addr);
  digitalWrite(relPinOne, OFF); //ИЗНАЧАЛЬНО ОНО ВЫКЛЮЧЕНО
  digitalWrite(relPinTwo, OFF);
  pinMode(relPinOne, OUTPUT);
  pinMode(relPinTwo, OUTPUT);
}

void loop(void) {
  byte i;
  
  ds.search(addr);
  ds.reset();
  ds.select(addr);
 
  ds.write(0x44,1);  
  
  delay(1000);     

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);  // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes

  unsigned int raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  celsius = (float)raw / 16.0;

  Serial.println(celsius);

// КАК Я ПОНЯЛ ЕСЛИ ПРИШЛА КОМАНДА НА ВКЛЮЧЕНИЕ ТО Я ВКЛЮЧАЮ РЕЛЕ ИЛИ НЕТ?? И СООТВЕТСТВЕННО НАОБОРОТ
  if (digitalRead(relPinOne) == ON || digitalRead(relPinTwo) == ON) 
  {
  digitalWrite(relPinOne, ON);
  digitalWrite(relPinTwo, ON);
  }

  if (digitalRead(relPinOne) == OFF || digitalRead(relPinTwo) == OFF)
  {
  digitalWrite(relPinOne, OFF);
  digitalWrite(relPinTwo, OFF);
  }

}

вот код c# но не пойму как передать команду

// Передача данных по нажатию кнопки
 serialPort.Write(OnOff());

bool OnOff()
{
if (checkBox.Checked)
return true;
else return false;
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Ой.

У Вас просто поразительно-бессмысленная "каша" в скетче. Я не в обиду, все через это проходили, просто налицо явный недостаток знаний "азбуки", который вопиет быть восполненным. Бросьте на время датчики и реле, почитайте про переменные,  функции, pinMode, digitalRead, digitalWrite и множество прочих базовых вещей. Вам же потом легче и понятней будет. Стен без фундамента не построить.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Хорошо, посоветуйте что-то действительно полезное для чтива по базовой части

Araris
Offline
Зарегистрирован: 09.11.2012

Буду банален, да и сам часто там подглядываю : http://arduino.ru/Reference

bwn
Offline
Зарегистрирован: 25.08.2014

Если честно, не очень понимаю, что вы хотите получить? Срабатывание реле по температуре или по команде извне? И пост №6 очень обратить внимание.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

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

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

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Я почитал и так понял

1 - задаем переменные, сам пин и переменную для хранения входного значения

2 - объявляем pinMode() с параметром INPUT потому как на вход будет подаваться сигнал из вне

3 - в Loop читаем digitalRead() для пина и записываем в переменную результат, далее в зависимости от результата digitalWrite()

Все так?

// ТОЛЬКО ВОТ ТУТ ДЛЯ ВХОДОВ DIGITAL ВЕРНО ЛИ? Т.к. я понял что они принимают только LOW ИЛИ HIGH
#define ON 1
#define OFF 0

  int relPinOne = 30; // ОБЪЯВИЛ ПИНЫ
  int relPinTwo = 31;
  int valOneIn = 0; // НАЧАЛЬНЫЙ ВХОД НА 0
  int valTwoIn = 0;

void setup(void) {

  digitalWrite(relPinOne, OFF); // ОТКЛЮЧАЮ РЕЛЕ ПРИ ИНИЦИАЛИЗАЦИИ
  digitalWrite(relPinTwo, OFF);
  pinMode(relPinOne, OUTPUT);
  pinMode(relPinTwo, OUTPUT);
}

void loop(void) {

   valOneIn = digitalRead(relPinOne); // ЧИТАЕМ В ПЕРЕМЕННУЮ ЗНАЧЕНИЕ ИЗ ВНЕ
   valTwoIn = digitalRead(relPinTwo);

   // ВОТ ТУТ ТЕПЕРЬ НАВЕРНОЕ ТАК??
   if (valOneIn == 1 && valOneIn == 1)
   {
          digitalWrite(relPinOne , ON);
          delay(200); // ОБЯЗАТЕЛЬНА ЛИ ЗАДЕРЖКА МЕЖДУ ВКЛЮЧЕНИЕМ РЕЛЕ??
          digitalWrite(relPinTwo , ON);
Serial.println("1");
} }

 

Araris
Offline
Зарегистрирован: 09.11.2012

1. Сначала всегда конфигурируем режим пина (pinMode), затем команда пину (digitalWrite).

2. Если пин в режиме OUTPUT, то причем тут digitalRead ?

3. Ну и самое главное, каким образом "ЗНАЧЕНИЕ ИЗ ВНЕ" попадет на пин, подключенный к реле ? Причем он тут вообще ?

4. "ЗАДЕРЖКА МЕЖДУ ВКЛЮЧЕНИЕМ РЕЛЕ" - впервые про такое слышу, вряд ли это нужно.

bwn
Offline
Зарегистрирован: 25.08.2014

1. Принимают LOW,HIGH, аналог 0, 1. Соответственно можно писать непосредственно valOneIn

2. Вместо int - byte. И его за глаза.

3. Строки 12,13 поменять местами с 14,15 (Возможно и так будут работать, но не логично)

4. В "loop" начинается непонятка. valOneIn - глобальная переменная она и так помнит последнее значение (строки 20,21 выкинули)

Конструкции digitalWrite(relPinOne, OFF) заменили на digitalWrite(relPinOne, valOneIn). А вот с какого перепугу она дальше изменится я не вижу.

5. Не лезьте вы пока в управление извне, потренируйтесь с самой ардуиной. Управляете реле по температуре, кнопкой, по времени и т.п.

bwn
Offline
Зарегистрирован: 25.08.2014

О, опоздал пока набирал)))

Araris
Offline
Зарегистрирован: 09.11.2012

bwn пишет:

2. Вместо int - byte. И его за глаза.

Для valOneIn и valTwoIn тип boolean тоже неплох, повышает читабельность кода.

Radjah
Offline
Зарегистрирован: 06.08.2014

А нахрена вообще константы с номерами пинов объявлять?

Накидал #define и все дела.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Дело в том что я пока не могу подключить одновременно 2 устройства...поэтому пытаюсь реализовать управление релюхой програмно.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

-----------------

Конструкции digitalWrite(relPinOne, OFF) заменили на digitalWrite(relPinOne, valOneIn). А вот с какого перепугу она дальше изменится я не вижу.

------------------

Вот тут я пока и не понимаю как мне получить команду на сам ардуино в скетче.

В студии то я написал

       private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox.Checked)
                sp.Write("1");
            else sp.Write("0");
            textBoxSwitch.Text = sp.ReadLine();
        }

я передаю в зависимости от чекбокса значение, но как его принимает ардуино не пойму.

Radjah
Offline
Зарегистрирован: 06.08.2014
char brecv;
if (Serial.available() > 0) {
brecv = Serial.read();
}

Например так. Без проверок и прочего.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Я прочел вот тут

http://arduino.ru/Reference/Serial/Read

об этом же...что надо использовать Serial 

Еще писали о том что надо использовать порты TX и RX но у меня все заработало с Digital. В чем разница?

KorPaEv
Offline
Зарегистрирован: 24.11.2014

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

вот код, с радостью ваши советы почитаю.

#include <OneWire.h>
#define ON 0
#define OFF 1

  byte data[12];
  byte addr[8];
  float celsius;
  int relPinOne = 30; // ОПРЕДЕЛИЛ ПИНЫ
  int relPinTwo = 31;
  
OneWire  ds(A5);  // on pin A5

void setup(void) {
  Serial.begin(9600);
  ds.search(addr);
  ds.reset();
  ds.select(addr);
  pinMode(relPinOne, OUTPUT); // ТУТ ИМЕННО НА ВЫВОД, ПОТОМУ КАК Я РЕЛЕ ТЫРКАЮ ВСЕ ВРЕМЯ
  pinMode(relPinTwo, OUTPUT);
  digitalWrite(relPinOne, OFF); // ИЗНАЧАЛЬНО ВЫКЛЮЧАЮ ОБЕ РЕЛЮХИ
  digitalWrite(relPinTwo, OFF);

}

void loop(void) {
// ТЕМПЕРАТУРУ ВЫНЕСУ ДАЛЬШЕ В ОТДЕЛЬНУЮ ФУНКЦИЮ
  byte i;
  
  ds.search(addr);
  ds.reset();
  ds.select(addr);
 
  ds.write(0x44,1);  
  
  delay(1000);     

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);  // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes

// КСТАТИ ВОТ ТУТ ВООБЩЕ ПОКА НЕ ПОНИМАЮ ЧТО ПРОИСХОДИТ - Т.К. СКЕТЧ КАЧАЛ ОТДЕЛЬНО
  unsigned int raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  celsius = (float)raw / 16.0;

  Serial.println(celsius);

// ВОТ ТУТ УПРАВЛЕНИЕ РЕЛЮХОЙ - ЧИТАЮ НА ВХОД 1 или 0 и включаю или выключаю и отдаю результат в порт
if (Serial.available() > 0) { 
        char inputVal = Serial.read();
        Serial.println(inputVal);
      if (inputVal == '1')
   {
          digitalWrite(relPinOne , 0);
          digitalWrite(relPinTwo , 0);
          Serial.println("ON");
   }
   else
   {
          digitalWrite(relPinOne , 1);
          digitalWrite(relPinTwo , 1);
          Serial.println("OFF");
    }}
}

 

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Кстати я пока еще не совсем понял почему digitalRead тут нельзя использовать, выходит это для явных операций внутри скетча только?

Radjah
Offline
Зарегистрирован: 06.08.2014

KorPaEv пишет:

Я прочел вот тут

http://arduino.ru/Reference/Serial/Read

об этом же...что надо использовать Serial 

Еще писали о том что надо использовать порты TX и RX но у меня все заработало с Digital. В чем разница?

Ты тогда определись уже.

Ты спрашиваешь про получение команды на ардуине извне. Я написал пример чтения из Serial.

Теперь ты пишешь про цифровые пины.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

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

Для чтения этих команд используется Serial как написано в документации.

Но там же написано и про цифровые порты как раз, поэтому меня это запутало.

bwn
Offline
Зарегистрирован: 25.08.2014

Строки 15-17 бесполезны. Строка 35 замораживает программу. DS18 требуется не менее 750мС на конвертацию при 12бит режиме, после конвертации результат хранится до отключения питания или новой команды. Соответственно можете подать команду и уйти в основной цикл, вернутся через секунду или больше и считать показания.

Строки 45-48 определяют какой режим  (9-12бит) использовался и приводят в соответствие. Если используете 12бит можно исключить.

digitalRead использовать можно, просто вначале вы под это дело выделили глобальные переменные.

digitalWrite(relPinOne , !digitalRead(relPinOne)); - инверсия предыдущего состояния.

 

KorPaEv
Offline
Зарегистрирован: 24.11.2014

bwn пишет:

Строки 15-17 бесполезны.

Потому как те же самые действия задаются в основном цикле? 

bwn пишет:

Строка 35 замораживает программу. DS18 требуется не менее 750мС на конвертацию при 12бит режиме, после конвертации результат хранится до отключения питания или новой команды. Соответственно можете подать команду и уйти в основной цикл, вернутся через секунду или больше и считать показания.

Вот тут вообще ничего не понятно.

bwn пишет:

digitalRead использовать можно, просто вначале вы под это дело выделили глобальные переменные.

digitalWrite(relPinOne , !digitalRead(relPinOne)); - инверсия предыдущего состояния.

еще пока тоже не понятно как работать с Read

И вопрос сразу, каким образом мне определить подключен ли какое то из устройств? Соответственно как вынести код температуры в функцию отдельную и вызывать в случае если он подключен, либо же вызивать так же командой из своей софтины?

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

1. Верно

2. http://arduino.ru/tutorials/BlinkWithoutDelay

3. 

 void dallasStartTemp()
  {
      ds.reset();          //Сброс датчиков
      ds.write(0xCC);      //Команда инициации
      ds.write(0x44);      //Команда на конвертирование
  }

Соответственно создаете другие функции. Присваиваете требуемые задержки и проверяете их в основном цикле. Там же проверяете свои команды извне.

4. Наличие DS18 можно определить по адресу и CRC. Почитайте на форуме и даташит. Как надежно определить работу блока реле без доп.обвязки не представляю.

5. Команда digitalRead() читает состояние цифрового пина (если не горелый), но что вы хотите от нее получить в данном случае непонятно.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Понял, спасибо, буду дальше ковыряться!

KorPaEv
Offline
Зарегистрирован: 24.11.2014

могу ли я сделать так для определения подключения датчика температуры?


#include <OneWire.h>

#define ON 0
#define OFF 1

  byte data[12];
  byte addr[8];
  float celsius;
  int relPinOne = 30; 
  int relPinTwo = 31;
  
OneWire  ds(A5);  // on pin A5

void setup(void) {
  Serial.begin(9600);
  ds.search(addr);
  ds.reset();
  ds.select(addr);
  pinMode(relPinOne, OUTPUT); 
  pinMode(relPinTwo, OUTPUT);
  digitalWrite(relPinOne, OFF); 
  digitalWrite(relPinTwo, OFF);

}

void loop(void) {


if ( ds.search(addr)) {
    // ТУТ ВЫЗОВ ФУНКЦИИ КОТОРАЯ РАБОТАЕТ С ТЕМПЕРАТУРОЙ
  }
else Serial.println("No more addresses.");

if (Serial.available() > 0) { 
        char inputVal = Serial.read();
        Serial.println(inputVal);
      if (inputVal == '1')
   {
          digitalWrite(relPinOne , 0);
          digitalWrite(relPinTwo , 0);
          Serial.println("ON");
   }
   else
   {
          digitalWrite(relPinOne , 1);
          digitalWrite(relPinTwo , 1);
          Serial.println("OFF");
    }}
}

а вот этот код как раз в функцию типа

void TempOut()
{  
byte i;
  
  ds.search(addr);
  ds.reset();
  ds.select(addr);

  ds.write(0x44,1);  
  
  delay(500);     

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);  // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes

  unsigned int raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  celsius = (float)raw / 16.0;

  Serial.println(celsius);
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

А вы сами то пробовали проверить? Мне лично кажется, что 29 строка ни к чему не приведет. А delay() хоть в основном цикле, хоть в функции тормозом быть не перестал.

Araris
Offline
Зарегистрирован: 09.11.2012

KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.

 

bwn
Offline
Зарегистрирован: 25.08.2014

Araris пишет:

KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.

 

Согласен, но там проблема с таймингами, они в библиотеке забиты. Да и 2кБ памяти тоже кушает. Человек похоже пытается написать код без компиляции, тогда это процесс долгий. Мне полдня хватило чтобы разобратся с Далласами напрямую. Последний раз на Синклере програмировал.

Araris
Offline
Зарегистрирован: 09.11.2012

bwn пишет:

Согласен, но там проблема с таймингами, они в библиотеке забиты.

Отнюдь. В библиотеке есть функции setResolution() и setWaitForConversion(false).

bwn
Offline
Зарегистрирован: 25.08.2014

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

Araris
Offline
Зарегистрирован: 09.11.2012

Совет мой был для топикстартера.

Топикстартер - явный новичек, зачем сразу нагружать его конструкциями типа int raw = (data[1] << 8) | data[0]; byte cfg = (data[4] & 0x60);, ему и так нелегко.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Пытаюсь откомпилить пример с гита, у меня датчик на A5 висит, поправил в примере на 5 порт у меня сыпятся ошибки

C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp: In member function 'bool DallasTemperature::validAddress(const uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:67: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:67: error:   initializing argument 1 of 'static uint8_t OneWire::crc8(uint8_t*, uint8_t)'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp: In member function 'void DallasTemperature::readScratchPad(const uint8_t*, uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:107: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:107: error:   initializing argument 1 of 'void OneWire::select(uint8_t*)'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp: In member function 'void DallasTemperature::writeScratchPad(const uint8_t*, const uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:174: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:174: error:   initializing argument 1 of 'void OneWire::select(uint8_t*)'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:181: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:181: error:   initializing argument 1 of 'void OneWire::select(uint8_t*)'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp: In member function 'bool DallasTemperature::readPowerSupply(const uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:194: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:194: error:   initializing argument 1 of 'void OneWire::select(uint8_t*)'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp: In member function 'bool DallasTemperature::requestTemperaturesByAddress(const uint8_t*)':
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:341: error: invalid conversion from 'const uint8_t*' to 'uint8_t*'
C:\Program Files (x86)\Arduino\libraries\DallasTempetature\DallasTemperature.cpp:341: error:   initializing argument 1 of 'void OneWire::select(uint8_t*)'
KorPaEv
Offline
Зарегистрирован: 24.11.2014

bwn пишет:

Araris пишет:

KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.

 

Согласен, но там проблема с таймингами, они в библиотеке забиты. Да и 2кБ памяти тоже кушает. Человек похоже пытается написать код без компиляции, тогда это процесс долгий. Мне полдня хватило чтобы разобратся с Далласами напрямую. Последний раз на Синклере програмировал.

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

bwn
Offline
Зарегистрирован: 25.08.2014

Проверьте, что у вас в папке с библиотекой нет еще одной с таким же именем, не забудьте перезагрузить IDE после установки библиотеки. Код который вы привели вначале, это из стандартного примера OneWire, но почему то кастрированный, исчезли проверки CRC.

А самое лучшее - проверка своих домыслов в железе.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

bwn пишет:

Проверьте, что у вас в папке с библиотекой нет еще одной с таким же именем, не забудьте перезагрузить IDE после установки библиотеки. Код который вы привели вначале, это из стандартного примера OneWire, но почему то кастрированный, исчезли проверки CRC.

А самое лучшее - проверка своих домыслов в железе.

Проверил, у меня в папке Arduino/libraries лежит только папка которую стянул с гита и назвал ее DallasTempetature

Внутри лежит один файл с библиотекой и cpp.

 

А самое лучшее - проверка своих домыслов в железе. - Это вы о чем?

bwn
Offline
Зарегистрирован: 25.08.2014

Дерните оттуда же keywords и "examples" и попробуйте со стандартными примерами. Еще смущает аналоговый пин, где то проскакивала инфа, что надо цеплять на цифровые.

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

Araris
Offline
Зарегистрирован: 09.11.2012

Вот этой https://www.dropbox.com/s/xyxmjwb0hhyhn75/DallasTemperature.zip?dl=0 пользуюсь сам. Попробуйте.

Датчик на A5 я бы не стал цеплять, лучше на цифровой пин.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Проблема была, кстати, не в библиотеках Dallas, скачал последнюю версию OneWire - все откомпилилось и заработало.

Теперь я опять же возвращаюсь к своему вопросу - поправьте если я не так мыслю.

У нас в Setup() инициализация датчиков. Получается могу ли я именно в Setup проверить подключен ли какой то из датчиков и уже далее запустить

sensors.begin(); ????
 
Зачем каждый раз проверять в цикле подключен ли датчик, когда я могу это сделать при инициализации и сооветственно уже дальше работать с ним если он подключен.
В библиотеке есть функция isConnected() я так понял туда передается указатель на  адрес датчика, так что туда надо передавать чтобы проверить?
 
 
Radjah
Offline
Зарегистрирован: 06.08.2014

Ну тут от задачи зависит. Вдруг датчик у тебя на соплях прилеплен и отваливается то и дело.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Radjah пишет:

Ну тут от задачи зависит. Вдруг датчик у тебя на соплях прилеплен и отваливается то и дело.

Тогда все же в цикле проверять. Так что все же передать, какой адрес в функцию isConnected для этого датчика?

Araris
Offline
Зарегистрирован: 09.11.2012

Можно проще сделать. Там есть #define DEVICE_DISCONNECTED_C -127, то есть если чтение температуры вернуло -127 градусов, то DEVICE_DISCONNECTED.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Araris пишет:

Можно проще сделать. Там есть #define DEVICE_DISCONNECTED_C -127, то есть если чтение температуры вернуло -127 градусов, то DEVICE_DISCONNECTED.

вот так заработало

void loop(void)
{ 
  sensors.requestTemperatures(); // Send the command to get temperatures
 int errorTemp = sensors.getTempCByIndex(0);
if (errorTemp != DEVICE_DISCONNECTED_C)
{Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));}
  delay(1000); 
}

Протестил, датчик отключаешь, монитор порта пустой. Все работает хорошо.

Я уже наверное задолбал вас со своими вопросами, но сразу возник еще один по ходу.

Смотрите как лучше сделать?

Такая ситуация - у меня например при отключении датчика температуры и подключения реле на выход ком порта все равно будут фактически выводиться в цикле строки постоянно, но пустые

Выходит когда я подам команду на включение реле у меня в ответ вернется следующее
ON

""
""

""

""

""

""

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

Radjah
Offline
Зарегистрирован: 06.08.2014

Тогда пиши последнее значение, например, или "ERR"

Araris
Offline
Зарегистрирован: 09.11.2012

KorPaEv пишет:

Такая ситуация - у меня например при отключении датчика температуры и подключения реле на выход ком порта все равно будут фактически выводиться в цикле строки постоянно, но пустые

Ответ прост и очевиден - отлавливайте пустые строки if-ом и не выводите их.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Хорошо, попробую!