Спочатку купив датчик протоки на АліЕкспресс, бронзовий такий з пропеллером всередині. Там датчик Холла. І ще термодатчик.
Зробив проєкт на Atmega8 – все працює, але рядом радянський холодильник, від перешкод якого программа реально збивається і двічі чуть не підшмалила ТЕНи (зазвичай просто зависає і не включає обігрів).
Тому вирішив я провести перевірку, на скільки Ордуїно протистоятиме таким потужним перешкодам. Програма мало чим відрізняється від коду на AVR-GCC, переваг мало в Ардуіно. А саме лише 2
- Не потрібен програматор
- USART працює на борту через той же СОМ-порт.
int waterFlowNormal, minimumWaterFlow, TC2_OVF;
int afterReset = 0;
int heatOff = 7;
int heatOn = 4;
int transistor = 8;
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
pinMode(7, OUTPUT);
pinMode(4, OUTPUT);
pinMode(2, OUTPUT);
pinMode(transistor, OUTPUT);
pinMode(5, INPUT_PULLUP);
// timer2 setup from https://www.teachmemicro.com/arduino-timer-interrupt-tutorial/
TIMSK2 = (TIMSK2 & B11111110) | 0x01;
TCCR2B = (TCCR2B & B11111000) | 0x07;
// Timer/Counter 1 initialization
// Clock source: T1 pin Rising Edge
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: On
// Input Capture on Rising Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (0 << COM1B1) | (0 << COM1B0) | (0 << WGM11) | (0 << WGM10);
TCCR1B = (1 << ICNC1) | (1 << ICES1) | (0 << WGM13) | (0 << WGM12) | (1 << CS12) | (1 << CS11) | (1 << CS10);
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
//Serial.begin(9600);
minimumWaterFlow = 1;
}
ISR(TIMER2_OVF_vect) {
TC2_OVF++;
if (TC2_OVF > 30) { // 30 is 10 LED ttogles in 19 seconds
TC2_OVF = 0;
// Toggle LED
digitalWrite( 2, digitalRead( 2 ) ^ 1 );
//
if (afterReset < 100) {
afterReset++;
}
//code for timer counting impulses
if ( TIFR1 & (1 << TOV1 )) { // if it has been overflow
waterFlowNormal = 1; // because overflow means in was more than 65535 tics (real test leads from ~5 to ~30)
TIFR1 = (1 << TOV1 ); // clear the flag of overflow
}
else {
if ((short int)TCNT1 > minimumWaterFlow) {
waterFlowNormal = 1;
}
else {
waterFlowNormal = 0;
}
}
//Serial.println(TCNT1);
TCNT1 = 0; // clear in any case
}
}
void loop() {
if (afterReset < 6) {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(70);
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(60);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
if (waterFlowNormal == 1) {
digitalWrite(heatOff, LOW);
digitalWrite(heatOn, HIGH);
digitalWrite(transistor, HIGH);
}
else {
digitalWrite(heatOff, HIGH);
digitalWrite(heatOn, LOW);
digitalWrite(transistor, LOW);
}
}
В майбутньому хочу зробити індикацію температури води в градусах і винести показання до душу на 10 метрів від датчика протоки. Це дозволило б регулювати температуру з точністю до 1 градуса.
Власники газових котлів, в яких то виключається обігрів, то кип’яток ошпарює – стоять с стороні і смокчуть морозиво
UPDATE
Тести, проведені на дачі з працюючим холодильником довели, що Ардуіно ні разу не зависло. В основному коли включається холодильник, Ардуїно сприймає це як одиночний сигнал з датчика протоки і включає підігрів на 1 секунду. Також таке відбувається іноді коли спрацьовує накачування насоса (управляється механічним реле тиску, накачує до 2х атмостер).
Але виявлено, що іноді, коли включається реле підігріву, самі ТЕНи нагрівача не включаються. Можливо це стається у зв’язку з наявністю в обігрівачі захисту від перевищення температури. В любому випадку це вже не має відношення до Ардуіно.
Висновок – гарно спроектована плата не боїться сильних перешкод, в той же час на швидкоруч зліплена плата зазнає руйнівного впливу електромагнітних перешкод.