Max6675 или не хватает пинов

shamsing
Offline
Зарегистрирован: 17.06.2014

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

Заранее спасибо !

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Входы модулей CS надо подключать к разным пинам, а SO и SCK  можно паралелить. Какую библиотеку используешь? 

И вообще, неплохо было бы маленький, но полный скетч привести. Который просто читает температуру с 2х датичиков и выводит в сериал.

shamsing
Offline
Зарегистрирован: 17.06.2014

По подключению я так и сделал, а вот пример кода с двумя датчиками не нашёл, нашёл адафрутовскую библиотеку для подключения одного , как туда второй впихнуть не понятно, но там же и вторая проблема при подсоединении второго датчика таким образом первый сразу же начинает выдавать абсолютный бред колеблющийсяот 100 до 3000 что впринципе не возможно, термопара всего до 1200 где то может измерять. Пришлось ds18b20 подсоединить , благо температура воды выше 100 градусов не должна быть, но подключение новой библиотеки повлекло за собой увеличение кода, теперь памяти пишет что не хватает (, проблема за броблемой

sadman41
Offline
Зарегистрирован: 19.10.2016

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

  // Stop conversion
  digitalWrite(_max6675CsPin, LOW);
...
  uint32_t result = SPI.transfer(0x00);
  result <<= 8;
  result |= SPI.transfer(0x00);
...
  digitalWrite(_max6675CsPin, HIGH);
... 
 float temperature = ((result >> 3) * 25) / 100;
...

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

А каков смысл в

float temperature = ((result >> 3) * 25) / 100;

почему не 

float temperature = result >> 5;

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Хороший вопрос. Спасибо, что обратили внимание. Это архитектурные наслоения, за которыми не уследил.

Изначально у меня было просто ((result >> 3) * 25) и итог передавался в функцию, которая делала строковое представление float из int, не применяя сам float. В ней указывалось, что точку надо поставить так, чтобы получилось два знака после неё. А при копипасте забыстрофиксил делением, чтобы функцией не пугать.  

Конечно же там делить надо на 100.0:

float temperature = ((result >> 3) * 25) / 100.0;

или

float temperature = (result >> 3) * 0.25;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

PS кстати тоже беззнаковая, а так можно? умножать на 0,25 (проверил, можно)

sadman41
Offline
Зарегистрирован: 19.10.2016

Куда там из uint32 вывалишься...

shamsing
Offline
Зарегистрирован: 17.06.2014

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Если Вам знакомы только три слова, то пояснения навряд ли внесут бОльшую ясность. К сожалению.

Допустим, я поясню, что SPI.transfer() - это чтение с шины. Два байта читаем, в одно число слепляем.

shamsing
Offline
Зарегистрирован: 17.06.2014

Ok я понял на каком это уровне )

будем пытаться