Благодарю.. к аналоговому входу цеплять не хотелось бы, чтобы не электролизировать воду.
Заменил подтягивающий к земле резистор (10К) на 1Мом - действительно появились показания.. Значит делитель напряжения работает так, что чем больше подтягивающий резистор, тем чувствительнее?
но показания какие-то хаотичные - показывает 0, в следующий раз 1, потом несколько раз подряд 0 может быть, несколько раз 1 и т.д. причем если соединить провода накоротко - то показания стабильные, хотя и появляются на 2-3й интерации опроса.
т.е. контакт разомкнут в сериале пишет:
Код: Выделить всё
alarmLvl=1;
//замыкаю контакт
alarmLvl=1;
alarmLvl=1;
//WTF???
alarmLvl=0;
/снова размыкаю контакт
alarmLvl=0;
alarmLvl=0;
alarmLvl=1;
возможно это связано с тем что digitalRead использует какой-нибудь средневзвешенный способ чтобы перевести сигнал в 0-1, поэтому такие лаги, иначе просто мистика..
на всякий случай вот схема подключения:
А вот кусок кода относящийся к делу:
Код: Выделить всё
#include <SimpleTimer.h>
#define aLvlPin 8 //уровень жидкости сигнальный
#define critLvlPin 7 //critical level of water
#define lvlTime 10000 //10сек
boolean critLvl = true;
boolean alarmLvl = true;
byte lvlCheckId=255;
SimpleTimer timer; //timer object
void setup()
{
Serial.begin(19200);
//pinMode(relePin, OUTPUT);
//pinMode(ledPin, OUTPUT);
pinMode((aLvlPin, critLvlPin, perPin, durPin, sunPin), INPUT);
//LedSwitch(); //вкл. диод
//digitalWrite(relePin, LOW); //убедится что реле выключено.
//askTimeId=timer.setInterval(askTime, controlCheck); // периодическая проверка ручек управления каждые..
lvlCheckId=timer.setInterval(lvlTime, lvlCheck); //checking water level every..
//sunCheckId=timer.setInterval(sunTime, sunCheck); //checking luminosity every..
//controlCheck(); //опрос регуляторов
lvlCheck(); //опрос уровня жидкости
//sunCheck(); //опрос уровня освещенности
//timer.setTimeout(1000, LedSwitch); //выключить диод через 1с
//timer.setInterval(2000, numprint); //печатать число активных таймеров для отладки
}
void lvlCheck(){
//читаем данные критического и сигнального значения уровня жидкости
critLvl = 1-digitalRead(critLvlPin);
alarmLvl = 1-digitalRead(aLvlPin);
Serial.print("alarmLvl:");
Serial.println(alarmLvl);
Serial.print("critLvl:");
Serial.println(critLvl);
//static int preLvl; //last fixed levev
if (critLvl){ //если уровень критический, то поргаем чаще и вырубаем воду
if (timer.isEnabled(alarmT)){
timer.deleteTimer(alarmT);
Serial.println("Level crit Timer deleted and set");
};
Serial.println("Alarm critical!");
alarmT=timer.setInterval(2000, AlarmBlink);
WaterStop();
Serial.println("Stop watering!");
if (timer.isEnabled(durTimer)){ //если шел полив - отключить таймер
timer.deleteTimer(durTimer);
Serial.println("watering timer deleted");
}
//не использовать 2 таймера одновременно.
}
else if (alarmLvl){ //если сигнальный уровень пройден моргаем раз в 5сек
if (timer.isEnabled(alarmT)){
timer.deleteTimer(alarmT);
Serial.println("Level alarm Timer deleted and set");
};
alarmT=timer.setInterval(5000, AlarmBlink);
Serial.println("Alarm lvl!");
}
else {
if (timer.isEnabled(alarmT)){
timer.deleteTimer(alarmT); //если сигнала низкого уровня нет, то удалить таймер мигания.
Serial.println("Level Timer deleted");
};
};
}
void loop(){
timer.run();
}
Как видно большая часть задач построена на таймерах используя библиотеку SimpeTimer (все по ней:
http://playground.arduino.cc/Code/SimpleTimer).
Довольно удобная вещь, хотя то, что timerID выдается последовательно и не уникально(т.е. выданный и освобожденный ID может быть выдан повторно SIC!

), а еще то, что проверить можно только Enabled (включен), но не "Существует", создает кучу гемороя: если в коде удаляются и создаются таймеры (как у меня), то растет риск, что они начнут путаться между собой(что таки происходит

)... Переписывать неохота, но чую придется.
Впрочем, на показания датчика уровня это влиять никак не должно.