Вопрос по переменному сопротивлению

bezzeb
Offline
Зарегистрирован: 02.11.2013

Добрый день!

подскажите пожалуйста можно ли при использовании переменного сопротивления

сделать так,чтобы при изменении мы получали на равных промежутках значения от 0 до 10.
Т.е например 0-100 =0,100-200=1

и при этом не расписывая интервалы как здесь т.е краткий вариант?



if (Hister_znach <= 100 ) {
   Hister = 0; }
  else
 if (Hister_znach <= 200 && Hister_znach > 100) {
  Hister = 1;}
  else
 if (Hister_znach <= 300 && Hister_znach > 200 ) {
  Hister = 2;}
  else
 if (Hister_znach <= 400 && Hister_znach > 300){
  Hister = 3;}
  else
 if (Hister_znach <= 500 && Hister_znach > 400 ){
  Hister = 4;}
  else
 if (Hister_znach <= 600 && Hister_znach > 500 ){
  Hister = 5;}
  else
 if (Hister_znach <= 700 && Hister_znach > 600 ){
  Hister = 6;}
  else
 if (Hister_znach <= 800 && Hister_znach > 700 ){
  Hister = 7;}
  else
 if (Hister_znach <= 900 && Hister_znach > 800 ){
  Hister = 8;}
  else
 if (Hister_znach >= 1000 ){
  Hister = 9;}

Также интересует в каких случаях при таком коде с сопротивлением 10КОм значения от 10 до 3 идет нормально,а потом лезут цифры 40,30 ?

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

Заранее благодарен

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробуйте так

 
  Hister_znach = map(Hister_znach, 0, 1000, 0, 9); 
  if (Hister_znach > 1000 )   Hister = 9;
bezzeb
Offline
Зарегистрирован: 02.11.2013

Спасибо большое.

То,что и искал.
только вот проблема в неправильных значениях осталась.(ближе к нулю появляются значения 40,80,когда лимит от 0-24)

vvadim
Offline
Зарегистрирован: 23.05.2012

Я с подобными выбрыками тоже сталкивался (шумы и дефекты сборки). Выхода всего два - или перебирать дешёвые потенциометры пока не подберёте нормально работающий вариант или покупать дорогой за 10 - 30 дол.  Я для себя выбрал первый.

bezzeb
Offline
Зарегистрирован: 02.11.2013

собираю все пока на макетке.вот думаю может в ней дело.

а потенциометры тестером проверял-нормально работают.

еще раз спасибо

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

bezzeb, Стоит выложить весь скетч, тогда может будет понятно откуда лишние цифры.

bezzeb
Offline
Зарегистрирован: 02.11.2013




#include <Wire.h> 
#include <LiquidCrystal_I2C.h>//библиотека для работы с LCD
#include <OneWire.h>
#include <DallasTemperature.h>
//////////////////////////////пин термосопротивления
#define ONE_WIRE_BUS 3  
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer; 
 /////////////////////////переменные 
 unsigned int Temp = 0;
 int Hister =0;
 int Svet = 0;
 int a = 0;//для гистерезиса
 int b = 0;//для гистерезиса
 int z = 0; //переменная температуры с датчика 
 long prevmicros = 0;//переменная для хранения значений таймера
 int sek=0;//значение секунд
 int minu=0;//значение минут
 int chas=0;//значение часов
 boolean counter=false; // счетчик для полусекунд
 
LiquidCrystal_I2C lcd(0x27,16,2);//инициализация портов 
const int svet_pin = 2;//пин кнопки авто/ручной 
const int nagr_pin = 1;  // переменная для хранения состояния кнопки
void setup()
{
 Serial.begin(9600);
  sensors.begin(); 
  //////////////////////экран///////////////////////////////
 lcd.init();                      
 lcd.backlight();
 ///////////////////////кнопки/////////////////////////////
 pinMode(svet_pin, OUTPUT); 
  pinMode(nagr_pin, OUTPUT); 
 }

void loop()
{
 //////////////////////////////////////////часы////////////////////////////////////////// 
  if (micros() - prevmicros >=500000)
 {    prevmicros = micros();  //принимает значение каждые полсекунды
   counter=!counter;
   if (counter==false)
   {     sek++;              //переменная секунда + 1
     lcd.setCursor(10,0);
     lcd.print(":");         //выводим символ ":"между часами и минутами
     lcd.setCursor(13,0);
     lcd.print(":");         //выводим символ ":"между  минутами и секундами
   }
   else
   {
     lcd.setCursor(10,0);
     lcd.print(" ");    // мигание :
     lcd.setCursor(13,0);
     lcd.print(" ");    // мигание :
   }
   
   if(sek>59)//если переменная секунда больше 59 ...
   {
     sek=0;//сбрасываем ее на 0
     minu++;//пишем +1 в переменную минута
   }
   if(minu>59)//если переменная минута больше 59 ...
   {
     minu=0;//сбрасываем ее на 0
     chas++;//пишем +1 в переменную час
   }
   if(chas>23)//если переменная час больше 23 ...
   {
     chas=0;//сбрасываем ее на 0
   }
      
   lcd.setCursor(8,0);//выводим значение часов 
   if (chas>=0 && chas<10) {
     lcd.print("0");
     lcd.print(chas);}//количество часов
     else lcd.print(chas);
     
   lcd.setCursor(11,0);//выводим значение минут
   if (minu>=0 && minu<10) {
     lcd.print("0");
     lcd.print(minu);}//количество минут
     else lcd.print(minu);
     
   lcd.setCursor(14,0);//выводим значение секунд
   if (sek>=0 && sek<10) {
     lcd.print("0");
     lcd.print(sek);}//количество секунд
     else lcd.print(sek);
 }
////////////////////////программа/////////////////////////////////////////////////
 ///считывание пинов****************************
 int Temp_znach = analogRead(A0);
 int Hister_znach = analogRead(A1);
 int Svet_znach = analogRead(A2);
  
  sensors.requestTemperatures();
  z=sensors.getTempCByIndex(0);
//************************ условие гистерезиса********************
 Hister = map(Hister_znach, 0, 1023, 0, 10); 
 //*****************************условие температуры******************************
 Temp = map(Temp_znach, 0, 1023, 0, 100); 
//*****************************условие света******************************
Svet = map(Svet_znach, 0, 1023, 0, 24);
 
 a = Temp+Hister;
 b = Temp-Hister;
 //////программа нагревателя///////////////
 if (z <= b){
digitalWrite(nagr_pin, HIGH);
 }
 else 
if  (z >= a){
digitalWrite(nagr_pin, LOW);
}
 lcd.setCursor(0,0);
     lcd.print(Temp);    
     lcd.setCursor(3,0);
     lcd.print(Svet);    
     lcd.setCursor(6,0);
     lcd.print(Hister); 
     lcd.setCursor(1,6);
     lcd.print(z); 
/////программа света//////////////

}

грубо говоря програмные часы +включение нагревателя по  датчику+включение света по времени.
Больше грешу на контакт т.к 1 канал безупречно работает,а другие 2-нет(сопротивления менял местами).

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

bezzeb, может на дисплее не стираются цифры от предыдущих измерений? Перед последним блоком вывода (118строка) дайте строку  пробелов для проверки. lcd.setCursor(0,0); lcd.print ("                "); и потом вернуть курсов в начало.

bezzeb
Offline
Зарегистрирован: 02.11.2013

Действительно, все работает.

Большое спасибо