Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.07.2015
Сообщений: 5
1

Написать программу для контроля уровня воды

05.07.2015, 21:50. Показов 1063. Ответов 7
Метки нет (Все метки)

есть прибор. в нём два датчика уровня воды. вот что нужно реализовать. если на верхнем и нижнем датчике нет воды то попищать , сбросить пар, доливать воду до тех пор пока не роявится вода на верхнем датчике. вот код.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
parostruika
 */ 
 
 #define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
void preset (){
    DDRB = 0xFF;
    PORTB = 0x00;
    DDRC = 0x00;
    PORTC = 0xFF;
    }
 
 
int main(void)
{ preset() ;
    {PORTB = 0b00000001; //влючаю нагрев
    while(PC0==0)  // пока на датчике верхнего уровня нет воды
    if (PINC&(1<<PC1)) // если на датчике нижнего нет воды то ( pinc0- датчик верхнего уровня,  pinc1-датчик нижнего уровня)
        { PORTB = 0b00000010   ;// выключаю нагрев, пищу 10 сек
            _delay_ms(10000) ;
             PORTB = 0b00000100;// прекратил пищать включил сброс пара
             _delay_ms(10000);
             PORTB = 0b00001100;// сбрасываю пар и заправляюсь одновременно
                _delay_ms(10000000);}
        else PORTB = 0b00000001; // включаю нагрев
    }
            
 
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2015, 21:50
Ответы с готовыми решениями:

Использование входов ПЛК Mitsubishi Aplpha 2 для прямого контроля уровня воды
Здраствуйте. Имеется в наличии контроллер Mitsubishi Aplpha 2 -24VDC 8In4Out Можно ли на нем...

Найти высоту уровня воды в баке водонапорной башни над уровнем земли, а также давление воды у крана 6 этажа
Доброго время суток. Задача: Давление воды в кранах водопровода на 2 этаже шестиэтажного дома равно...

Написать программу замены элементов списков первого уровня на элементы списка самого низкого уровня в цикл
Пажалуйста помогите с задачкой Пример: (((a)) (b) (((c) e)) (((d)))) -&gt; ((c) (d) (c) (d))

Водонапорная башня цилиндрической формы имеет радиус основания 10 метров. Ввести замеренную высоту уровня воды и рассчитать объем воды в башне.
Водонапорная башня цилиндрической формы имеет радиус основания 10 метров. Ввести замеренную высоту...

__________________
7
шКодер самоучка
2132 / 1846 / 904
Регистрация: 09.10.2013
Сообщений: 4,032
Записей в блоге: 7
06.07.2015, 10:36 2
я не уверен, но вроде так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
parostruika
 */ 
 
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
 
#define CHK_PIN(PORT, PIN) ((PORT)&(1 << (PIN)))
enum commands{
    OFF   = 0b000000000,
    HOT   = 0b00000001,
    BEEP  = 0b00000010,
    DROP  = 0b00000100,
    WATER = 0b00001000
};
enum delays {
    d_1s = 1000,
    d_10s = 10000,
    d_1m = 60000
};
 
void preset () {
    DDRB = 0xFF;
    PORTB = OFF;
    DDRC  = 0x00;
    PORTC = 0xFF;
}
// ( pinc0- датчик верхнего уровня,  pinc1-датчик нижнего уровня)
int main(void) {
    preset();
    while(1) { // цикл проверки состояния
        if (PC0==0) {  // если на датчике верхнего уровня нет воды
            // PINC&(1<<PC1)
            if (CHK_PIN(PINC, PC1)) { // если на датчике нижнего нет воды то
                PORTB = BEEP;// выключаю нагрев, пищу 10 сек
                _delay_ms(d_10s);
                // сброс пара
                PORTB = DROP;
                _delay_ms(d_10s);
                /*/
                // наполняем до нижнего уровня
                PORTB = DROP | WATER;// | BEEP;
                // PINC&(1<<PC1)
                while(CHK_PIN(PINC, PC1)) {
                    _delay_ms(d_1s);
                }
                //*/
                //PORTB = OFF;
                // сбрасываю пар и заправляюсь одновременно
                PORTB = DROP | WATER;
                while(PC0==0) { // пока не наполним доверху
                    _delay_ms(d_1s);
                }
            }
        }
        PORTB = HOT; // включаю нагрев
        _delay_ms(d_1s);
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 05.07.2015
Сообщений: 5
06.07.2015, 18:05  [ТС] 3
ПриветCra3y, Проверил твой код, в протеусе работает не очень. тоесть цикл заполнения водой работает постояно. а нужно что бы сигнал верхнего датчика останавливал заправку и включал нагев.
Посмотри может можно поправить.? заранее спасибо. и ещё сбрось свои реквизиты я тебе помогу чем нить
0
шКодер самоучка
2132 / 1846 / 904
Регистрация: 09.10.2013
Сообщений: 4,032
Записей в блоге: 7
06.07.2015, 18:30 4
Lelik_balabolik, если честно, то у меня нет опыта работы с МК.
я правил код, основываясь на предположении, что проверки состояния пинов и коды операций правильные в изначальном коде.
если посмотреть по анологии с PC1, то возможно, надо так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
parostruika
 */ 
 
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
 
#define CHK_PIN(PORT, PIN) ((PORT)&(1 << (PIN)))
enum commands{
    OFF   = 0b000000000,
    HOT   = 0b00000001,
    BEEP  = 0b00000010,
    DROP  = 0b00000100,
    WATER = 0b00001000
};
enum delays {
    d_1s = 1000,
    d_10s = 10000,
    d_1m = 60000
};
 
void preset () {
    DDRB = 0xFF;
    PORTB = OFF;
    DDRC  = 0x00;
    PORTC = 0xFF;
}
// ( pinc0- датчик верхнего уровня,  pinc1-датчик нижнего уровня)
int main(void) {
    preset();
    while(1) { // цикл проверки состояния
        if (0 == CHK_PIN(PINC, PC0)) {  // если на датчике верхнего уровня нет воды
            // PINC&(1<<PC1)
            if (CHK_PIN(PINC, PC1)) { // если на датчике нижнего нет воды то
                PORTB = BEEP;// выключаю нагрев, пищу 10 сек
                _delay_ms(d_10s);
                // сброс пара
                PORTB = DROP;
                _delay_ms(d_10s);
                /*/
                // наполняем до нижнего уровня
                PORTB = DROP | WATER;// | BEEP;
                // PINC&(1<<PC1)
                while(CHK_PIN(PINC, PC1)) {
                    _delay_ms(d_1s);
                }
                //*/
                //PORTB = OFF;
                // сбрасываю пар и заправляюсь одновременно
                PORTB = DROP | WATER;
                while(0 == CHK_PIN(PINC, PC0)) { // пока не наполним доверху
                    _delay_ms(d_1s);
                }
            }
        }
        PORTB = HOT; // включаю нагрев
        _delay_ms(d_1s);
    }
    return 0;
}
Добавлено через 16 минут
Хотя, если считать что отсутствие сигнала == сброшенному пину, то
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#define F_CPU 1000000
#include <avr/io.h>
#include <util/delay.h>
 
#define CHK_PIN(PORT, PIN) ((PORT)&(1 << (PIN)))
enum commands{
    OFF   = 0b00000000,
    HOT   = 0b00000001,
    BEEP  = 0b00000010,
    DROP  = 0b00000100,
    WATER = 0b00001000
};
enum delays {
    d_1s = 1000,
    d_10s = 10000,
    d_1m = 60000
};
 
void preset () {
    DDRB = 0xFF;
    PORTB = OFF;
    DDRC  = 0x00;
    PORTC = 0xFF;
}
// ( pinc0- датчик верхнего уровня,  pinc1-датчик нижнего уровня)
int main(void) {
    preset();
    while(1) { // цикл проверки состояния
        if (0 == CHK_PIN(PINC, PC0)) {  // если на датчике верхнего уровня нет воды
            // PINC&(1<<PC1)
            if (0 == CHK_PIN(PINC, PC1)) { // если на датчике нижнего нет воды то
                PORTB = BEEP;// выключаю нагрев, пищу 10 сек
                _delay_ms(d_10s);
                // сброс пара
                PORTB = DROP;
                _delay_ms(d_10s);
                /*/
                // наполняем до нижнего уровня
                PORTB = DROP | WATER;// | BEEP;
                // PINC&(1<<PC1)
                while(0 == CHK_PIN(PINC, PC1)) {
                    _delay_ms(d_1s);
                }
                //*/
                //PORTB = OFF;
                // сбрасываю пар и заправляюсь одновременно
                PORTB = DROP | WATER;
                while(0 == CHK_PIN(PINC, PC0)) { // пока не наполним доверху
                    _delay_ms(d_1s);
                }
            }
        }
        PORTB = HOT; // включаю нагрев
        _delay_ms(d_1s);
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 05.07.2015
Сообщений: 5
06.07.2015, 18:37  [ТС] 5
к сожалению тоже работает не правильно. цикл заправки не останавливается при наличии воды на двух датчиках.

Добавлено через 4 минуты
второй код работает отменно. киньте адрес куда отправлять коньяк.\

Добавлено через 1 минуту
if (0 == CHK_PIN(PINC, PC0)) что это значит?
0
шКодер самоучка
2132 / 1846 / 904
Регистрация: 09.10.2013
Сообщений: 4,032
Записей в блоге: 7
06.07.2015, 18:41 6
Цитата Сообщение от Lelik_balabolik Посмотреть сообщение
if (0 == CHK_PIN(PINC, PC0)) что это значит?
"если сброшен PC0 на порту PINC"
Макрос CHK_PIN объявлен почти в начале кода
0
0 / 0 / 0
Регистрация: 05.07.2015
Сообщений: 5
06.07.2015, 20:30  [ТС] 7
Послушай. А как бы мне с тобой в скайпе поболтать. Поучиться у тебя. Я могу заплатить. на примере этой програмки. Мне пинок нужен. чтоб я дальше мог развиваться... ну так как?
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
06.07.2015, 20:38 8
Что делает тема в этом разделе вообще? В "Микроконтроллеры", либо "КИП, датчик" бегом.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2015, 20:38

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Электронный измеритель уровня воды в бочке, для дачи
Имеется бочка, уровень воды в которой до сегодняшнего дня оставался загадкой по причине отсутствия...

Написать программу, создающие ведомости для каждой группы по всем дисциплинам с указанием формы контроля (зачет, экзамен)
Помогите решить пожалуйста В деканате факультета журналистики имеются списки студентов разных...

Подбор датчика уровня для воды/пара (при температуре 300 °C и давлении 125 кг/см²)
ДОбрый вечер всем. Я столкнулся со следующей проблемой! Мне необходимо найти датчик который будет...

Написать программу сетевого контроля нелицензионного софта
Доброго всем времени суток. Получил на диплом интересную тему, теперь ищу информацию по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.