Спойлер
Код: Выделить всё
#define OUT PB1 // выход на помпу
#define butHIGH PB3 //датчик HIGH
#define butLOW PB4 //датчика LOW
#define butUSER PB2 //кнопка ручного режима
#define LED PB0 //индикатор ручного режима
boolean B_HIGH, B_LOW, B_USER, MOTOR = 0;
//unsigned long timer;
void startPomp() { //функция запуск помпи
digitalWrite(OUT, HIGH);
digitalWrite(LED, HIGH);
}
void stopPomp() { //функция остановки помпи
digitalWrite(OUT, LOW);
digitalWrite(LED, LOW);
}
void setup() {
pinMode(butLOW, INPUT_PULLUP);
pinMode(butHIGH, INPUT_PULLUP);
pinMode(butUSER, INPUT_PULLUP);
pinMode(OUT, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop() {
B_HIGH = !digitalRead(butHIGH); // считать текущее положение датчика HIGH
B_LOW = !digitalRead(butLOW); // считать текущее положение датчика LOW
B_USER = digitalRead(butUSER); // считать текущее положение датчика USER
delay(100);
if(B_USER == false){
startPomp();
}
else
if (B_HIGH == false & B_LOW == false) {
digitalWrite(OUT, HIGH);
}
else
if (B_HIGH == true & B_LOW == true) {
stopPomp();
}
}Спойлер
Код: Выделить всё
/*
* Контролер фекального насоса.
*/
#define F_CPU 1200000UL
#define OUT PB1
#define butHIGH PB3
#define butLOW PB4
#define butUSER PB2
#define LED PB0
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char timer1 = 20; //установка времени ТМ/4 5 секунд
//unsigned char motor=0;
volatile unsigned char temp=0;
// Оброботчик прерывания по таймеру TIMER0
ISR(TIM0_OVF_vect){
temp++;
}
int main(void)
{
// Датчики
DDRB &= ~((1<<butLOW)|(1<<butHIGH)|(1<<butUSER)); // входы
PORTB |= (1<<butLOW)|(1<<butHIGH)|(1<<butUSER); // подтянуты
// Выход
DDRB |= (1<<OUT)|(1<<LED); // выход
PORTB &= ~(1<<OUT)|~(1<<LED); // выключен
// Настраиваем таймер
TIMSK0 = (1<<TOIE0); // Включаем таймер TIMER0
TCCR0B = (1<<CS02) | (1<<CS00); // Пределитель таймера на 1/1024
// Задаем режим сна
MCUCR &= ~(1<<SM1); // idle mode
MCUCR &= ~(1<<SM0); // idle mode
MCUCR |= (1<<SE);
sei();
while (1)
{
// Засываем до прерывания по таймеру
asm("sleep");
// Таймер сработал
TIMSK0 &= ~ (1<<TOIE0); // Останавливаем TIMER0
if( temp >= timer1 )
{
if ( (PINB & (1<<butLOW)) && (PINB & (1<<butHIGH)) ) // если сработали нижний и верхний датчики (високий уровень)
{
PORTB |= (1<<OUT); // ПУСК насоса
}
temp=0;
}
if (!(PINB & (1<<butLOW))) // если сработал нижний датчик
{
PORTB &= ~(1<<OUT); // СТОП насоса
}
TIMSK0 = (1<<TOIE0); // Включаем таймер TIMER0
sei();
}
return 0;
}
