Вопрос по переменному сопротивлению
- Войдите на сайт для отправки комментариев
Чт, 30/01/2014 - 14:06
Добрый день!
подскажите пожалуйста можно ли при использовании переменного сопротивления
сделать так,чтобы при изменении мы получали на равных промежутках значения от 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 ?
Проверка кода без условия т.е чистые показания все равно показывают на нелинейное повышение ближе к нулю.
ну и сопротивление проверено тестером и там линейная зависимость.
Заранее благодарен

Попробуйте так
Спасибо большое.
То,что и искал.
только вот проблема в неправильных значениях осталась.(ближе к нулю появляются значения 40,80,когда лимит от 0-24)
Я с подобными выбрыками тоже сталкивался (шумы и дефекты сборки). Выхода всего два - или перебирать дешёвые потенциометры пока не подберёте нормально работающий вариант или покупать дорогой за 10 - 30 дол. Я для себя выбрал первый.
собираю все пока на макетке.вот думаю может в ней дело.
а потенциометры тестером проверял-нормально работают.
еще раз спасибо
bezzeb, Стоит выложить весь скетч, тогда может будет понятно откуда лишние цифры.
#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-нет(сопротивления менял местами).
bezzeb, может на дисплее не стираются цифры от предыдущих измерений? Перед последним блоком вывода (118строка) дайте строку пробелов для проверки.
lcd.setCursor(0,0); lcd.print (" "); и потом вернуть курсов в начало.Действительно, все работает.
Большое спасибо