Страница 1 из 2
простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 19:08:22
gulevskyd
Здравствуйте подскажите по написанию программы хочу купить датчик расхода жидкости

для теплых полов, хочу вывести на дисплей расход в литрах но не знаю с чего начать видел готовые проекты но там идет дисплей 16х2 и там много не нужной мне информаци, мне хотелось на семисегментнике, можно и на дисмлее 16х2 но тогда мне нужно информацию с 3-х датчиков выводить.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 19:42:35
Z_h_e
Предположим что у Вас выход с расходомера 450 имп/л.
Тогда Q (л/мин) = F(Гц)*60/450=0,133*F.
Измеряете частоту, умножаете на коэфф, выводите.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 19:54:41
gulevskyd
как вывести это на си, через таймер счетчик с счетом импульсов?
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:01:07
Z_h_e
Надо определиться с контроллером, на его основе разработать электрическую схему, установить среду программирования поддерживающую Си, набить там программу, скомпилировать, зашить в контроллер, посмотреть что получилось, исправить косяки и потом радоваться.
Можно еще что-то почитать, задать четкий вопрос по непонятому - Вам помогут. А на абстрактные вопросы тут не отвечают.
Частоту проще измерять через таймер, да.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:10:58
gulevskyd
а как более точно написать: "помогите написать программу" или что то я не правильно написал?
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:13:17
gulevskyd
подскажите если я не правильно создал тему или что исправить или дописать
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:21:58
gulevskyd
микроконтроллер атмега16 среда программирования атмел студио 6
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.2
aen
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:22:43
Z_h_e
gulevskyd писал(а):"помогите написать программу"
Это равнозначно сделайте за меня. Но только если кто-то возжелает это сделать, без ТЗ и схемы никак не сможет.
Если брать тот же коэфф преобразования расходомера (450), можно посчитать количество импульсов за 13,33 сек. Потом просто разделить на 100. И у Вас опять будут л/мин. А можно собрать обычный частотомер на логике, только время счета не стандартное, а деление на 100 - это всего-лишь точка постоянно засвеченная на индикаторе после второго разряда справа.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:43:39
gulevskyd
нет я не хочу чтоб за меня это делали я просто хочу чтоб помогли с чего все начать что за чем идет я начинаю изучать таймера счетчики читать я про них читал а практики нет охота и попрактиковаться и чтоб интерес был и польза.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 20:51:16
Z_h_e
Поморгайте светодиодом - примеров полно.
Подключите один семисегементный индикатор, что-нибудь отобразите.
Подключите N индикаторов - что-нибудь отобразите.
После этого придет хоть какое-то понимание. А если появятся вопросы, то это будут ВОПРОСЫ действительные.
Сейчас то Вы что хотите? Как посчитать частоту я Вам предложил.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср дек 02, 2015 21:00:13
gulevskyd
я вас понял попробую напишу код а потом буду задавать вопросы
Re: простой счетчик расхода воды для теплого пола
Добавлено: Чт дек 03, 2015 12:53:53
Андрей СШ
Z_h_e писал(а):поддерживающую Си
Без вариантов, ибо Си спущен нам богами, а других языков и совсем на этой планете нет. А те кто на них (несуществующих) пишут упыри инопланетные.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Чт дек 03, 2015 13:11:08
Z_h_e
Андрей СШ, Ваш сарказм абсолютно не в тему. ТС спрашивал именно как написать на С. Не кажется ли Вам, чтобы написать на С нужна среда которая поддерживает С?
Re: простой счетчик расхода воды для теплого пола
Добавлено: Чт дек 03, 2015 14:11:05
Андрей СШ
Ладно затупил.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср мар 23, 2016 20:28:35
gulevskyd
здравствуйте написал немного кода #include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void SPI_out(char data,char data1);
volatile int a=0;
volatile int c=0;
volatile int d=0;
unsigned char number[] =
{
0b11111100, //0
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11110110, //9
};
volatile unsigned long signal = 0; // глобальная переменная
void timer_0 (void)
{
//настраиваем на срабатывание INT0 по переднему фронту
MCUCR |= (1<<ISC01)|(1<<ISC00);
//разрешаем внешнее прерывание INT0
GICR |= (1<<INT0);
sei();
}
//функция обработчик внешнего прерывания INT0
ISR( INT0_vect )
{
signal++;
}
void port(void)
{
DDRD=~(1<<2);
PORTD&=~(1<<2);
}
void SPI_out(char data,char data1) //функция вывода цифры на индикатор
{
SPDR=data; //запись в регистр данных SPI
while(!(SPSR & (1<<SPIF))) //ждем окончания передачи по SPI
PORTB |= 0x01; //подаем импульс положительной полярности на вход SHCP сдвигового регистра
SPDR=data1; //запись в регистр данных SPI
while(!(SPSR & (1<<SPIF))) //ждем окончания передачи по SPI
//_delay_us(100); //ждем 100мкс
PORTB &= ~0x01; //снимаем импульс положительной полярности со входа SHCP сдвигового регистра
}
int main(void)
{
timer_0();
port();
DDRB=0xFF;
SPCR=0b01110011; //прерывания запрещены, SPI включен, младший бит передается первым, МК ведущий, импульсы положительной полярности, скорость CLK/128
TIMER0();
while(1)
{
SPI_out(number[signal],number[d]); //вывод цифры
_delay_ms(200);
if (signal==10)
{
signal=0;
d=d+1;
}
if (d==10)
{
d=0;
}
}
}
здесь идет подсчет импульсов на входе а мне нужно литры в минуту если я правильно понимаю мне нужен еще один счетчик который будет отсчитывать этот промежуток времени, не будут ли конфликтовать эти счетчики если будут скажите пожалуйсти как этого избежать
Re: простой счетчик расхода воды для теплого пола
Добавлено: Ср мар 23, 2016 22:50:24
Аlex
здесь идет подсчет импульсов на входе а мне нужно литры в минуту
Про литры/минуту Вам уже писали выше - нужно измерять частоту, а не подсчитывать кол-во импульсов. При таком раскладе, Вы получите общий расход в литрах.
Либо можете отсчитать 1 минуту и подсчитать кол-во импульсов за эту минуту. Хотя, по сути, это будет та же частота - импульсы за единицу времени.
не будут ли конфликтовать эти счетчики
Не совсем понятно, что за конфликт Вы имеете в виду и что за счётчики.
Что касается кода.
Вот эта вот стряпня :
Код: Выделить всё
if (signal==10)
{
signal=0;
d=d+1;
}
if (d==10)
{
d=0;
}
излишняя.
Достаточно было ограничить переменную
signal 99-тью, а в SPI гнать делённое значение на 10 и остаток от деления:
Код: Выделить всё
SPI_out(number[signal/10],number[signal%10]); //вывод цифры
И ещё, вот тут :
косяк.
Представьте, что перед задержкой значение = 9, а во время задержки увеличилось на 2. И всё, будете ждать миллиарды импульсов, чтобы сработало условие.
Можно, конечно, поставить условие ">=", но тогда будете терять импулься. Всё равно придётся делить переменную на 10.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Сб мар 26, 2016 21:31:13
gulevskyd
Alex спасибо за поправки код подправил #include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void SPI_out(char data,char data1);
volatile int a=0;
volatile int c=0;
volatile int d=0;
unsigned char number[] =
{
0b11111100, //0
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11110110, //9
};
volatile unsigned long signal = 0; // глобальная переменная
void timer_0 (void)
{
//настраиваем на срабатывание INT0 по переднему фронту
MCUCR |= (1<<ISC01)|(1<<ISC00);
//разрешаем внешнее прерывание INT0
GICR |= (1<<INT0);
sei();
}
//функция обработчик внешнего прерывания INT0
ISR( INT0_vect )
{
signal++;
}
void port(void)
{
//DDRB|=(1<<2);
//PORTB|=(1<<2);
//DDRB=~(1<<0)&~(1<<1);
//PORTB&=~(1<<0)&~(1<<1);
DDRD=~(1<<2);
PORTD&=~(1<<2);
}
void SPI_out(char data,char data1) //функция вывода цифры на индикатор
{
SPDR=data; //запись в регистр данных SPI
while(!(SPSR & (1<<SPIF))) //ждем окончания передачи по SPI
PORTB |= 0x01; //подаем импульс положительной полярности на вход SHCP сдвигового регистра
SPDR=data1; //запись в регистр данных SPI
while(!(SPSR & (1<<SPIF))) //ждем окончания передачи по SPI
//_delay_us(100); //ждем 100мкс
PORTB &= ~0x01; //снимаем импульс положительной полярности со входа SHCP сдвигового регистра
}
int main(void)
{
timer_0();
port();
DDRB=0xFF;
SPCR=0b01110011; //прерывания запрещены, SPI включен, младший бит передается первым, МК ведущий, импульсы положительной полярности, скорость CLK/128
//TIMER0();
while(1)
{
SPI_out(number[signal/10],number[signal%10]); //вывод цифры
if (signal==99)
{
signal=0;
}
}
}
я так и не могу сообразить как мне применить ту формулу которая написана в начале форума и как мне считать за определенную единицу времени куда эту формулу подставить
Q (л/мин) = F(Гц)*60/450=0,133*F. 60-это секунд в минуте я правильно понял. F(Гц)-чего процессора?
Re: простой счетчик расхода воды для теплого пола
Добавлено: Вс мар 27, 2016 12:47:37
Z_h_e
При чем здесь частота процессора? Частота следования импульсов с Вашего расходомера - это и есть расход. Я же Вам предложил
простой способ измерения расхода, что же там может быть непонятного.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Вс мар 27, 2016 20:32:39
gulevskyd
подскажите пожалуйста как мне измерять частоту уже голову сломал не могу понять как мне это реализовать.
Кто-то делает через второй таймер кто-то как-то через регистр захвата. Читаю понимаю а как у себя это все собрать немного не догоняю.
Re: простой счетчик расхода воды для теплого пола
Добавлено: Вс мар 27, 2016 20:43:52
Z_h_e
Ну например настраиваете прерывание от таймера так, чтобы оно возникало через нужный промежуток времени. В этом обработчике прерывания от таймера проводите нужную математику и обнуляете счетчик импульсов.
А можно период считать, самый быстрый способ посчитать частоту, по двум импульсам определите. Режим захват таймера удобен для этого.