Page 54 of 109

Re: Термостат ∆T=0,1°C

Posted: 26 May 2012 09:30
by KBH
Уважаемый hardlock, может быть Вас не затруднит добавить в программу проверку наличия датчика?
Насколько я понимаю, нужно после команды чтения (или инициализзации) проверить есть ли ответ.
Если да- идём дальше, если нет - на индикатор прочерки или какие-то нереальные цифры (но не ноль) и один из выходов 1. Я в программировании ноль, изучать языки на седьмом десятке трудновато (запоминалка не та), поэтому даже не представляю как это не писать на Си.
В ветку про переделки уже обращался с такой просьбой, но туда, похже, уже ни кто не заглядывает.

Re: Термостат ∆T=0,1°C

Posted: 26 May 2012 18:10
by Mkonst
hardlock wrote:
Mkonst wrote:Куплю тот что вы посоветовали
берите самый простой, красный. Никаких суперярких и т.д.
Купил красенький светодиод, все заработало на отлично!!! Спасибо!

Re: Термостат ∆T=0,1°C

Posted: 28 May 2012 09:31
by stolbtlt
Здравствуйте!
Хочу выразить признательность автору проекта и поделиться своей реализацией.
За пару лет мною собраны 4 термостата с фукцией нагрева для электрических конвекторов (1,5 кВт), теплого пола (800 Вт), бака на 100 л воды (2 кВт). В своей конструкции использовал индикатор с ОА, супервизор, импульсный БП от зарядника на 5 В, реле, или реле+пускатель, трехпроводное подключение ds18b20 и прошивку с 1 стр. данной темы. В процессе эксплуатации столкнулся с отсутствием програмного контроля наличия датчика и как следствие постоянного включения нагрузки (предложение на 33 стр. не катит). В связи с этим пришлось отказаться от авторской (не силен в Си) и использовать универсальную прошивку для инкубатора (http://hardlock.org.ua/download/file.php?id=1004), предварительно ее подшаманив, сделав установки под себя.
Если возникнут вопросы по моей конструкции, то с удовольствием отвечу.
Всем творческих успехов!

Добавлено спустя 10 часов 33 минуты 14 секунд:
От рассыпухи к готовым изделиям

Re: Термостат ∆T=0,1°C

Posted: 28 May 2012 20:04
by IYra
KBH,
Для проверки датчика можно попробовать прочитать третий байт

t1 = w1_read() ;//LSB
t2 = w1_read() ;//MSB
t3 = w1_read() ;// регистр
if (t3 > 250) Tnew = 10999 ;


На экране будут гореть 999.9 и нагреватель отключится.
Проверял на инкубаторе с несколькими датчиками.
Отключал по разному датчики а затем снова подключал на работающем
приборе.
Проверка работала

Re: Термостат ∆T=0,1°C

Posted: 28 May 2012 22:20
by stolbtlt
IYra, типа так надо сделать?

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
BYTE t1;
BYTE t2;
BYTE t3;
BYTE i;
WORD Temp;
WORD T;
BYTE Ff;
// Reinitialize Timer 1 value
TCNT1H=0x8F;
TCNT1L=0xD1;
w1_init(); //инициализация шины 1-wire
for (i=0; i<11; i++) //шоб не моргало изображение делаем обновление эрана 10 раз
{
ShowDisplayData();
}
w1_write(0xCC); //выдаём в шину 1-wire код 0xCC, что значит "Skip ROM"
for (i=0; i<11; i++) //шоб не моргало изображение делаем обновление эрана 10 раз
{
ShowDisplayData();
}
Updating = !Updating; //это шоб читать температуру через раз
if (Updating) //если в этот раз читаем температуру, то
{
w1_write(0xBE); //выдаём в шину 1-wire код 0xCC, что значит "Read Scratchpad"
for (i=0; i<11; i++) //шоб не моргало изображение делаем обновление эрана 10 раз
{
ShowDisplayData();
}
t1=w1_read(); //LSB читаем младший байт данных
for (i=0; i<11; i++) //шоб не моргало изображение делаем обновление эрана 10 раз
{
ShowDisplayData();
}
t2=w1_read(); //MSB читаем старший байт данных
t3=w1_read(); //регистр читаем третий байт данных
if (t3 > 250) Tnew=10999;


... и далее авторский код

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 10:55
by KBH
Спапасибо, конечно, но тов. Протеус пишет нули при разрыве датчика как этой дообавкой, как и без неё.

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 11:09
by stolbtlt
А товарищ IYra пишет
IYra wrote:На экране будут гореть 999.9 и нагреватель отключится.
Проверял на инкубаторе с несколькими датчиками.
Отключал по разному датчики а затем снова подключал на работающем приборе.
Проверка работала
Кто не точен ?!

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 11:26
by KBH
В железе завтра попробую.

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 11:40
by stolbtlt
При добавлении в аторскую прошивку изменений от IYra и нажатии Shift+F9 CodeVisionAVR пишет
The estimated Data Stack usage of 41 bytes
exceeds the amount allocated for this purpose in the C Compiler configuration.
It is recommended to increase the Data Stack size in the
Project/Configure/C Compiler/Code Generation menu.

Вопрос - А можно ли это значение увеличивать?

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 12:25
by KBH
stolbtlt wrote:Кто не точен ?!
Тинька проголосовала за правоту Протеуса.
Блин, зря дело бросил.

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 12:57
by stolbtlt
Изменил Date Stack c 40 на 41
При прошивке Епрома CodeVisionAVR выдал окно с сообщением об ошибке адресов, тоесть тупо места нет.
Интересно как IYra это обошел ?!

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 14:10
by KBH
Он там разные датчики отключает. Надо понимать у него "для инкубатора с тремя датчиками",т.е. уже
другая программа.

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 16:52
by stolbtlt
Я конечно не силен в Си, но дорогу осилит идущий.
Уважаемый КВН протестируйте пож-та с тов. Протеусом измененный код.
В железе проверил - действительно индицируется 999.9 и нагрузка не включается, когда на живую отключил датчик. Если потом подцепить датчик, то все нормуль :-)

Re: Термостат ∆T=0,1°C

Posted: 29 May 2012 18:45
by IYra
Там еще надо вставить проверку
что-то типа

if (t3 > 250)
{
Tnew = 10999 ;
}
else if (T & 0b10000000) //если отрицательная температура

и дальше авторский код.

На прошивке Hardlock'a у меня сейчас нет возможности проверить.

Re: Термостат ∆T=0,1°C

Posted: 30 May 2012 04:21
by KBH
IYra, вставлял так:
if (t3 > 250)
{
Tnew = 10999 ;
}
else if (T & 0b10000000) //если отрицательная температура-
безрезультано.
А так:
Tnew = 1000 + (T * 10) + ((Ff * 10) / 16);
}
}
else
{
w1_write(0x44);
}
if (t3 > 250)
{
Tnew = 10999 ;
}
-всё заработало.
Т.е. зависит от того, куда вставить. У меня "Термостат для Covirayhik" на 4 выхода.
Был хороший, а теперь вообще конфетка.
Огромное всем спасибо.
Виноват. Я else перед if (T & 0b10000000) забыл.
И так и так работает

Re: Термостат ∆T=0,1°C

Posted: 08 Jun 2012 11:55
by deltov
Довелось намедни померить температуру в пароварке кипящей. Получил значение 99,3 град. По паспорту датчик вроде имеет точность +/- 0,5 град. Вот и озадачился, а почему не около сотни. Вода московская из под крана. Мож какой неизвестный мне физический процесс влияет?

Re: Термостат ∆T=0,1°C

Posted: 08 Jun 2012 13:15
by sevsur
deltov wrote:Довелось намедни померить температуру в пароварке кипящей. Получил значение 99,3 град. По паспорту датчик вроде имеет точность +/- 0,5 град. Вот и озадачился, а почему не около сотни. Вода московская из под крана. Мож какой неизвестный мне физический процесс влияет?
Так а давление атмосферное какое было? 100 градусов если давление 760 мм ртутного столба, а если давление другое и температура другая будет. вот эту ссылочку посмотри http://www.chemport.ru/data/data4.shtml. А прибор я думаю правильно замерил. :-)

Re: Термостат ∆T=0,1°C

Posted: 12 Jun 2012 22:21
by deltov
sevsur, вот спасибо за науку. Подзабывать стал я школьную программу чёй-то. :-)

Re: Термостат ∆T=0,1°C

Posted: 20 Jun 2012 20:11
by ssql
Собрал термостат. Работает отлично)))Огромное спасибо автору!!!Но вот появилась необходимость сделать на больших индикаторах... ну и понятное дело что стало оч тускло...Как можно сделать чтоб по 2 транзюка не ставить (схема ОА) а то места в корпусе не хватит( Или может подскажите как в исходнике поменять, а то я только начинаю контроллеры ковырять))) Заранее благодарю)

Re: Термостат ∆T=0,1°C

Posted: 20 Jun 2012 20:51
by hardlock
ssql, какой ток нужен на сегмент? если меньше 20мА, то можно обойтись транзисторами на общие аноды. в программе чуть подправим.

Добавлено спустя 8 минут 23 секунды:
в начале файла, рядом с дэфайнами Анода и Катода добавляем (оставляем один вариант, остальные коментируем)

Code: Select all

#define AnodePNP        //для индикатора с ОА и pnp транзисторами
#define CathodeNPN    //для индикатора с ОК и npn транзисторами
в функцию ShowDisplayData добавляем следующее:

Code: Select all

#ifdef CathodeNPN
  PORTB = byCharacter[byDisplay[0]];
  PORTD.5 = 1;
  delay_us(LED_delay);
  PORTD.5 = 0;    
     
  PORTB = byCharacter[byDisplay[1]];
  PORTD.1 = 1;
  delay_us(LED_delay);
  PORTD.1 = 0;
      
  PORTB = byCharacter[byDisplay[2]];
  PORTD.0 = 1;
  delay_us(LED_delay);
  PORTD.0 = 0;
      
  PORTB = byCharacter[byDisplay[3]];
  PORTD.4 = 1;
  delay_us(LED_delay);
  PORTD.4 = 0;
#endif

#ifdef AnodePNP
  PORTB = ~byCharacter[byDisplay[0]];
  PORTD.5 = 0;
  delay_us(LED_delay);
  PORTD.5 = 1;    
     
  PORTB = ~byCharacter[byDisplay[1]];
  PORTD.1 = 0;
  delay_us(LED_delay);
  PORTD.1 = 1;
      
  PORTB = ~byCharacter[byDisplay[2]];
  PORTD.0 = 0;
  delay_us(LED_delay);
  PORTD.0 = 1;
      
  PORTB = ~byCharacter[byDisplay[3]];
  PORTD.4 = 0;
  delay_us(LED_delay);
  PORTD.4 = 1;
#endif
И компилируем. Всё.

Re: Термостат ∆T=0,1°C

Posted: 20 Jun 2012 21:32
by ssql
Да, до 20 мА самое то!!Спасибо))Завтра доберусь до паяльника сделаю)

Re: Термостат ∆T=0,1°C

Posted: 22 Jun 2012 10:23
by ssql
Уважаемый hardlock, если не затруднит посмотрите я правильно сделал??

Code: Select all

#ifdef AnodePNP
  PORTB = ~byCharacter[byDisplay[0]];  
  if (Minus)
  {
    PORTB = PINB & 0b11111110;
  }                           
  #ifdef heat
  if (LoadOn)
  #endif
  
  #ifdef cold
  if (!LoadOn)
  #endif
  {
    PORTB = PINB & 0b11111011;
  }           
  if (View == 1)
  {
    PORTB = PINB & 0b11110111;
  } 
  
  PORTB = ~byCharacter[byDisplay[0]];
  PORTD.5 = 0;
  delay_us(LED_delay);
  PORTD.5 = 1;    
     
  PORTB = ~byCharacter[byDisplay[1]];
  PORTD.1 = 0;
  delay_us(LED_delay);
  PORTD.1 = 1;
      
  PORTB = ~byCharacter[byDisplay[2]];
  PORTD.0 = 0;
  delay_us(LED_delay);
  PORTD.0 = 1;
      
  PORTB = ~byCharacter[byDisplay[3]];
  PORTD.4 = 0;
  delay_us(LED_delay);
  PORTD.4 = 1;
#endif
  
  /*PORTD.5 = 1;
  delay_us(LED_delay);
  PORTD.5 = 0;    
     
  PORTB = ~byCharacter[byDisplay[1]];
  PORTD.1 = 1;
  delay_us(LED_delay);
  PORTD.1 = 0;
      
  PORTB = ~byCharacter[byDisplay[2]] & 0b11111011;
  PORTD.0 = 1;
  delay_us(LED_delay);
  PORTD.0 = 0;
      
  PORTB = ~byCharacter[byDisplay[3]];
  PORTD.4 = 1;
  delay_us(LED_delay);
  PORTD.4 = 0;
#endif*/
 
  
  }
а то индикация в протеусе не работает. Запутался немножко...

Re: Термостат ∆T=0,1°C

Posted: 22 Jun 2012 12:48
by hardlock
ssql, вроде всё правильно, только точку забыли после третьего знака и коментарий в конце лишний :-)

А в протеусе может и не работать - уж больно глючная штука, большинство конструкций в нём не работают. Пробуйте в железе.

Re: Термостат ∆T=0,1°C

Posted: 23 Jun 2012 00:53
by ssql
Даа.. протеус глюкнутый... в железе все отлично. Единственное как советовали поставил светодиод и резюк на 3к3.. у меня тинька постоянно в ребуте.увеличение номинала несколько улучшает ситуацию. вопрос, почему так?

Re: Термостат ∆T=0,1°C

Posted: 23 Jun 2012 11:17
by stolbtlt
ssql что значит - постоянно в ребуте ?
Схема рабочая, проверяйте свою конструкцию на предмет `соплей` и стабильности питания.
По поводу Протеуса, то не так все однозначно - использую ver 7.7, но на разных компах эта прога ведет себя не одинаково - на быстрых (проц + озу) нареканий нет.
Успехов!
По просьбам трудящихся фото используемых в кострукции `запчастей` :-)