Датчик температуры

denis707
Offline
Зарегистрирован: 09.09.2013

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

попробуйте



int temp30 = 30;    //      точки для
int temp70 = 70;    //      установки
int temp110 = 110;  //      значений порогов 
int temp150 = 150;  //      по измерениям
   
int sensPIN = 0;    // подключение сенсора    

                    //     выходы на показометр
int pin1 = 3;       //     + катушки на 30 град. 
int pin2 = 5;       //     - катушки на 30 град. 
int pin3 = 9;       //     + катушки на 70 град.  
int pin4 = 11;      //     - катушки на 70 град. 
 
int chustvitelnost = 255;   // гипотенуза прямоугольного треугольника
 
void setup()
{
  pinMode(pin1,OUTPUT);
  pinMode(pin2,OUTPUT);
  pinMode(pin3,OUTPUT);
  pinMode(pin4,OUTPUT);
}
 
void loop()
{
int temp = analogRead(sensPIN);  // A0 для входа аналового датчика
 // остальное обработка по температуре
  if (temp<=temp30) 
    {
     analogWrite(pin1,255);
     analogWrite(pin2,0);
     analogWrite(pin3,0);
     analogWrite(pin4,0); 
    }
    else   if (temp>temp30 && temp<temp70)  
    {
     int ugol = map(temp, temp30, temp70, 0, 90);
     analogWrite(pin1,chustvitelnost*cos(ugol*3.1416/180));
     analogWrite(pin2,0);
     analogWrite(pin3,chustvitelnost*sin(ugol*3.1416/180));
     analogWrite(pin4,0); 
    }
    else  if (temp==temp70)  
    {
     analogWrite(pin1,0);
     analogWrite(pin2,0);
     analogWrite(pin3,255);
     analogWrite(pin4,0); 
    }
    else  if (temp>temp70 && temp<temp110)
    {
     int ugol = map(temp,temp70,temp110, 0,90);
     analogWrite(pin1,0);
     analogWrite(pin2,chustvitelnost*sin(ugol*3.1416/180));
     analogWrite(pin3,chustvitelnost*cos(ugol*3.1416/180));
     analogWrite(pin4,0); 
    }
    else  if (temp==temp110)  
    {
     analogWrite(pin1,0);
     analogWrite(pin2,255);
     analogWrite(pin3,0);
     analogWrite(pin4,0); 
    }
    else   if (temp>temp110 && temp<temp150)  
    {
     int ugol = map(temp,temp110,temp150, 0,90);
     analogWrite(pin1,0);
     analogWrite(pin2,chustvitelnost*cos(ugol*3.1416/180));
     analogWrite(pin3,0);
     analogWrite(pin4,chustvitelnost*sin(ugol*3.1416/180)); 
    }
    else  if (temp>=temp150)  
    {
     analogWrite(pin1,0);
     analogWrite(pin2,0);
     analogWrite(pin3,0);
     analogWrite(pin4,255);
    }   
}
MadAirMan
Offline
Зарегистрирован: 24.12.2012

Привет. Код заработал, идет плавное изменение показний. 

Осталось от калибровать сенсор.

вот значения которые Вы просили, только удалось изменить только в пределах от 50-35 градусов. Нет подходящего термометра. 

Вот значения с аналогово порта:

50-144

46-131

40-113

39-110

38-107

37-104

36-101

35-98

Как видно изменения идут через каждые 3 пункта. 

По Вашему коду практически все понятно. 

Заранее благодарен Вам. 

MadAirMan
Offline
Зарегистрирован: 24.12.2012

Контакты по цветам:

красный и зеленый - 30 градусов (обмотка работает в диапазоне от 150 до 70 градусов по циферблату). Установил на пины 11- зеленый, 9 - красный. 

Белый и желтый -70 градусов (обмотка работает в диапазоне от 70 до 150 градусов по циферблату. Установил на пины 5- желтый, 3- белый. 

По датчику ничего не смогу вам сказать, у него нет маркировки. 

Купил оригинальный датчик от данного показометра показания совпадают. Подключаю их через сопротивление в 10 КОм

MadAirMan
Offline
Зарегистрирован: 24.12.2012

Еще кое что.

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

int temp30 = 30;    //      точки для
int temp70 = 70;    //      установки
int temp110 = 110;  //      значений порогов
int temp150 = 150; //      по измерениям
 
на
 
int temp30 = 90;    
int temp70 = 180;   
int temp110 = 270; 
int temp150 = 360; 

и при добавление строки "float temp", учитывая измененные точки порогов

float temp = 90 установка ровно на 30 градусов по циферблату

float temp = 180 установка ровно на 70 градусов по циферблату

float temp = 270 установка ровно на 110 градусов по циферблату

float temp = 360 установка ровно на 150 градусов по циферблату

denis707
Offline
Зарегистрирован: 09.09.2013

 

для начала нужно узнать показания сенсора при 30 и 70 градусах, а затем если понадобится немного уменьшить угол для равномерного движения по шкале, но угол нужно уменьшать с двух сторон (если нужно уменьшить на 30 градусов то нужно будет поменять     int ugol = map(temp, temp30, temp70, 15, 75);  по 15 градусов с каждой стороны)

denis707
Offline
Зарегистрирован: 09.09.2013

MadAirMan пишет:

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

int temp30 = 30;    //      точки для
int temp70 = 70;    //      установки
int temp110 = 110;  //      значений порогов
int temp150 = 150; //      по измерениям
 
на
 
int temp30 = 90;    
int temp70 = 180;   
int temp110 = 270; 
int temp150 = 360; 

эти точки и нужно выставить по показаниям датчика на этих температурах.

denis707
Offline
Зарегистрирован: 09.09.2013

MadAirMan пишет:

Контакты по цветам:

красный и зеленый - 30 градусов (обмотка работает в диапазоне от 150 до 70 градусов по циферблату). Установил на пины 11- зеленый, 9 - красный. 

Белый и желтый -70 градусов (обмотка работает в диапазоне от 70 до 150 градусов по циферблату. Установил на пины 5- желтый, 3- белый. 

По датчику ничего не смогу вам сказать, у него нет маркировки. 

Купил оригинальный датчик от данного показометра показания совпадают. Подключаю их через сопротивление в 10 КОм

эти обмотки немного не так работают (не утверждаю ), думаю они расположены друг к другу под 90 градусов и работают в паре, обмотка на 30 градусов поворачивает стрелку на 30 а при подключении второй (на 70) пытается отклонить к 70 и при равных напряжениях устанавливает между ними на 50, ну и так далее только меняя полярность уже выбирается нужный сегмент для отклонения.

denis707
Offline
Зарегистрирован: 09.09.2013

до 110 градусов можно снять показания с цифрового датчика пипа ds18b20 повесить на один радиатор рядом друг с другом и нагревать паяльником (только не касаясь ))) )

MadAirMan
Offline
Зарегистрирован: 24.12.2012

Т. Е. Нужно изменить это

else  if (temp>temp70 && temp<temp110)

    {
     int ugol = map(temp,temp70,temp110, 0,90);
   На это 
    else  if (temp>temp70 && temp<temp110)
    {
     int ugol = map(temp,temp70,temp110, 90, 180);
и так далее или нет?
 
У меня нет контрольно но прибора.  Для проверки показаний. 
Завтра все до делаю. 
 
Денис, спасибо Вам за помощь. От всей души благодарен. 
 

 

denis707
Offline
Зарегистрирован: 09.09.2013

нет, угол взят стандартный в 90 градусов, этот угол нужно будет менять только в том случае когда температуры близкие к отсчетным не будут влиять на стрелку, те можно закоментировать вход датчика, и поскольку цена деления 2,5 градуса записать температуру в 32 и уменьшая угол добиться отклонения стрелки на первое деление после 30.

т.е.



int temp30 = 30; // точки для
int temp70 = 70; // установки
int temp110 = 110; // значений порогов
int temp150 = 150; // по измерениям

int sensPIN = 0; // подключение сенсора



int temp = 32;  // выставляем температуру для колибровки прибора

// выходы на показометр
int pin1 = 3; // + катушки на 30 град.
int pin2 = 5; // - катушки на 30 град.
int pin3 = 9; // + катушки на 70 град.
int pin4 = 11; // - катушки на 70 град.

int chustvitelnost = 255; // гипотенуза прямоугольного треугольника

void setup()
{
pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(pin3,OUTPUT);
pinMode(pin4,OUTPUT);
}

void loop()
{
//int temp = analogRead(sensPIN); // A0 для входа аналового датчика
// остальное обработка по температуре
if (temp<=temp30)
{
analogWrite(pin1,255);
analogWrite(pin2,0);
analogWrite(pin3,0);
analogWrite(pin4,0);
}
else if (temp>temp30 && temp<temp70)
{
int ugol = map(temp, temp30, temp70, 0, 90);  // а здесь колибруем уменьшая угол
                                              // например уменьшеный на 20 градусов
                                              // int ugol = map(temp, temp30, temp70, 10, 80); 
analogWrite(pin1,chustvitelnost*cos(ugol*3.1416/180));
analogWrite(pin2,0);
analogWrite(pin3,chustvitelnost*sin(ugol*3.1416/180));
analogWrite(pin4,0);
}

 

 

а за переключение отвечают эти строки

analogWrite(pin1,chustvitelnost*cos(ugol*3.1416/180));
analogWrite(pin2,0);
analogWrite(pin3,chustvitelnost*sin(ugol*3.1416/180));
analogWrite(pin4,0);

в зависимости от температуры выбираются контакты катушки т.е. этот участок отвечает за подключение катушек в направлении 30 и 70, т.е. управляет выводами плуса на этих катушках а минусы сажает на минус.

далее

analogWrite(pin1,0);
analogWrite(pin2,chustvitelnost*sin(ugol*3.1416/180));
analogWrite(pin3,chustvitelnost*cos(ugol*3.1416/180));
analogWrite(pin4,0);

этод код поменял контакты местами на первый контакт подал минус и начал управлять другим контактом катушки(сделав из катушки 30 катушку 110)

 

т.е. мы включили сразу обмотку на 30 и начали отклонять к 70 , для этого формулы уменьшают напряжение на катушке 30 и увеличивают на катушке 70 пока не притянут к 70, а после 70 мы поменяли полярность на катушке на 30 и она стала катушкой на 110 и теперь она начинает отклонять уже к 110, уменьшая напряжение на катушке 70 и увеличивая на катушке 110.(по сути формулы нужны для равномерного распределения шкалы, при линейном перемещении будет правильно показывать только на отсчетных точках 30,70,110,150 , и при равных напряжениях в двух обмотках между отсчетными точками50,90,130)

denis707
Offline
Зарегистрирован: 09.09.2013

MadAirMan пишет:

Вот значения с аналогово порта:

50-144

46-131

40-113

39-110

38-107

37-104

36-101

35-98

Как видно изменения идут через каждые 3 пункта. 

если я правильно понял, то нужно

int temp30 = 84;
int temp70 = 204;
int temp110 = 324;
int temp150 = 444;

только сразу откалибруйте угол без датчика.