не работает библиотека 'MAX6675'

vde69
Offline
Зарегистрирован: 10.01.2016

установил библиотеку (не обругалось, но в списке библиотек не появилась), хотя папка MAX6675 появилась

#include "max6675.h"

int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

получаю ошибку: error: 'MAX6675' does not name a type

 

уже весь мозг сломал, подскажите куда копать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vde69 пишет:

установил библиотеку (не обругалось, но в списке библиотек не появилась), хотя папка MAX6675 появилась

 

IDE перезапускали?

vde69
Offline
Зарегистрирован: 10.01.2016

комп перегружал...

 

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

Открыть хидер и посмотреть имя типа, например.

vde69
Offline
Зарегистрирован: 10.01.2016
class MAX6675 {
 public:
  MAX6675(int8_t SCLK, int8_t CS, int8_t MISO);

 

 

 

 

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

Тогда смотри другие ошибки.

Вангую, что не может найти max6675.h

vde69
Offline
Зарегистрирован: 10.01.2016

ну, да, не может найти, но почему не понимаю....

вроде не первая библиотека :)

вечером попробую явно обновить файловые права и переустановить среду, больше в голову ничего не приходит...

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

Потому что надо так

#include <max6675.h>

 

vde69
Offline
Зарегистрирован: 10.01.2016

Radjah пишет:

Потому что надо так

#include <max6675.h>

 

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

хотя так <max6675.h> я то-же пробовал, то-же ошибка...

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

"тоже" без дефиса пишется.

Хидер где лежит?

Либы складываются примерно так: (arduino_ide)\library\(libname)\(header).h

vde69
Offline
Зарегистрирован: 10.01.2016

Radjah пишет:

"тоже" без дефиса пишется.

Хидер где лежит?

Либы складываются примерно так: (arduino_ide)\library\(libname)\(header).h

он лежит где стандартные библиотеки (разумеется с собственном каталоге с именем хидера), я знаю, что так делать не рекомендуется для избежания бардака, но мне так удобно, все в одной директории получается "портабле" (я иногда так на флешке ношу все вместе и ide и библиотеки и проекты),

сейчас доступа к телу нет, вечером еще отпишусь

vde69
Offline
Зарегистрирован: 10.01.2016

короче я сдался, распотрошил библиотеку, перенес в свой модуль то, что мне нужно (примерно 30 строк кода), и все заработало (правда пока без датчика, а только в теории, но датчик едет и думаю все будет гуд)

 

в чем косяк с библиотекой так и не понял, снес ее к чертям :)

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

midnight1979
Offline
Зарегистрирован: 22.03.2016

Может кому пригодится - ОТОБРАЖЕНИЕ ТЕМПЕРАТУРЫ С MAX6675 в связке с использованием библиотеки "u8glib".

У меня возникли проблемы при использования библиотеки MAX6675. Но скорее всего по большей части своего рода "конфликт" с библиотекой "u8glib", также в проекте используются ультразвуковые датчики (возможно и с их обработкой конфликтует) - не стал сильно копать кто из моих уже подключенных библиотек "не дает нормально работать этой термопаре" :).

В своем проекте я использую для визуализации LCD128x64 и интерфейс организован в виде нескольких страниц по которым осуществляется переход кнопками. 

Сама библиотека ug8lib выполняет вывод страниц в цикле while (так уж задумано разработчиками) - вот тут и начинаются "приколы" - показания температуры попросту застывают на месте. (в это же время на другой странице, где у меня отображаются уровни в емкостях с водой (используются HC-SR04) - все работает изумительно)

Застывают и в случае использования глобальных переменных - т.е. я присваиваю значение глобальной переменной в секции LOOP функцией thermocouple.readCelsius(), и если внутри "лупа" u8lib пытаться выводить через эту же функцию, то - дикие тормоза и в общем то тоже показания не изменяются пока не выйдешь из "лупа" (смена страницы).

Вобщем не сдружились эти две библиотеки похоже :)

В итоге сделал следующее - выдернул из библиотеки нужные мне куски (мне только Цельсии нужны были, а больше там собственно ничего интересного и нет:)):

Инициализирую модуль термопары в секции Setup следующим образом:

/* Инициализация MAX6675*/
  pinMode(thermoCS, OUTPUT);
  pinMode(thermoCLK, OUTPUT);
  pinMode(thermoDO, INPUT);

 

  digitalWrite(thermoCS, HIGH);
 
ВМЕСТО: MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
 
Далее в скетче оставил следующие функции (из библиотеки): 
// Читаем показания в градусах Цельсия
double readCelsius(void) {
 
  uint16_t v;
 
  digitalWrite(thermoCS, LOW);
  //_delay_ms(1);
 
  v = spiread();
  v <<= 8;
  v |= spiread();
 
  digitalWrite(thermoCS, HIGH);
 
  if (v & 0x4) {
    // uh oh, no thermocouple attached!
    return NAN;
    //return -100;
  }
 
  v >>= 3;
 
  return v * 0.25;
}
 
// Функция чтения SPI - взята из библиотеки MAX6675
byte spiread(void) {
  int i;
  byte d = 0;
 
  for (i = 7; i >= 0; i--)
  {
    digitalWrite(thermoCLK, LOW);
    //_delay_ms(1);
    if (digitalRead(thermoDO)) {
      //set the bit to 0 no matter what
      d |= (1 << i);
    }
 
    digitalWrite(thermoCLK, HIGH);
    // _delay_ms(1);
  }
 
  return d;
}
 
Все delay закомментировал - не нужны мне лишние задержки и на результат измерений это никаким образом не повлияло...
В итоге всё нормально заработало как и требовалось. 

 

Ajlex71
Offline
Зарегистрирован: 10.12.2016

Возникла проблема с выводом температуры на экран. При инициализации выводит, а потом ни в какую не обновляет. Неделю мучил код разные ардуинки. Проблема оказалась в  частом опрашивании датчика.

 

СДелал так:

  unsigned long currentMillis = millis();

  if ((currentMillis-previousMillis)>=500) {
    setTPayTP =   readCelsius(thrmSCKPay,thrmCSPay,thrmSOPay); // получили температуру паяльника с MAX6675
    setTFenTP = readCelsius(thrmSCKPay,thrmCSPay,thrmSOPay);//200;// readCelsius(thrmSCKFen,thrmCSFen,thrmSOFen) // получили температуру фена с MAX6675
    previousMillis=currentMillis;
//  byte setFenVent = 5; // Максимальные обороты вентилятора фена
//  unsigned long timeTemp;
  }

И все заработало. Без

 if ((currentMillis-previousMillis)>=500)

ни в какую не обновляет. 

При этом время обновления гдето между 170 и 180 мс. 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Ajlex71 пишет:
Неделю мучил код разные ардуинки. Проблема оказалась в  частом опрашивании датчика.

Походу, производители напрасно пишут даташиты...
Прочитали бы в нём, что Conversion Time - 0.17...0.22s и не нужно было бы никого мучить...

Ajlex71
Offline
Зарегистрирован: 10.12.2016

Олег я по образованию экономист.
И с англицким если честно туго. Поэтому приходится методом проб и ошибок.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Да это я так, поворчать...
Я, кстати, тоже на этом влетел первый раз - при высокой частоте опроса показания не обновлялись.
Минут через 10 залез в ДШ и посмотрел, каков этот параметр.
Так что язык вероятного противника, хотя бы на уровне Гугл-транслэйта знать никому не повредит ))

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

Ajlex71 пишет:
Олег я по образованию экономист. И с англицким если честно туго. Поэтому приходится методом проб и ошибок.

Вы меня просто огорчили... А я по простоте душевной думал, что в экономике минимум полтораста лет существуют какие-никакие теории...

Ajlex71
Offline
Зарегистрирован: 10.12.2016

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