простой счетчик расхода воды для теплого пола
простой счетчик расхода воды для теплого пола
Здравствуйте подскажите по написанию программы хочу купить датчик расхода жидкости
для теплых полов, хочу вывести на дисплей расход в литрах но не знаю с чего начать видел готовые проекты но там идет дисплей 16х2 и там много не нужной мне информаци, мне хотелось на семисегментнике, можно и на дисмлее 16х2 но тогда мне нужно информацию с 3-х датчиков выводить.
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Предположим что у Вас выход с расходомера 450 имп/л.
Тогда Q (л/мин) = F(Гц)*60/450=0,133*F.
Измеряете частоту, умножаете на коэфф, выводите.
Тогда Q (л/мин) = F(Гц)*60/450=0,133*F.
Измеряете частоту, умножаете на коэфф, выводите.
Re: простой счетчик расхода воды для теплого пола
как вывести это на си, через таймер счетчик с счетом импульсов?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Надо определиться с контроллером, на его основе разработать электрическую схему, установить среду программирования поддерживающую Си, набить там программу, скомпилировать, зашить в контроллер, посмотреть что получилось, исправить косяки и потом радоваться.
Можно еще что-то почитать, задать четкий вопрос по непонятому - Вам помогут. А на абстрактные вопросы тут не отвечают.
Частоту проще измерять через таймер, да.
Можно еще что-то почитать, задать четкий вопрос по непонятому - Вам помогут. А на абстрактные вопросы тут не отвечают.
Частоту проще измерять через таймер, да.
Re: простой счетчик расхода воды для теплого пола
а как более точно написать: "помогите написать программу" или что то я не правильно написал?
- Реклама
Re: простой счетчик расхода воды для теплого пола
подскажите если я не правильно создал тему или что исправить или дописать
Re: простой счетчик расхода воды для теплого пола
микроконтроллер атмега16 среда программирования атмел студио 6
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.2
aen
Вам нужно прочитать Правила форума.
http://radiokot.ru/forum/viewtopic.php?f=19&t=6538
Нарушение Правил форума п. 2.2
aen
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Это равнозначно сделайте за меня. Но только если кто-то возжелает это сделать, без ТЗ и схемы никак не сможет.gulevskyd писал(а):"помогите написать программу"
Если брать тот же коэфф преобразования расходомера (450), можно посчитать количество импульсов за 13,33 сек. Потом просто разделить на 100. И у Вас опять будут л/мин. А можно собрать обычный частотомер на логике, только время счета не стандартное, а деление на 100 - это всего-лишь точка постоянно засвеченная на индикаторе после второго разряда справа.
Re: простой счетчик расхода воды для теплого пола
нет я не хочу чтоб за меня это делали я просто хочу чтоб помогли с чего все начать что за чем идет я начинаю изучать таймера счетчики читать я про них читал а практики нет охота и попрактиковаться и чтоб интерес был и польза.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Поморгайте светодиодом - примеров полно.
Подключите один семисегементный индикатор, что-нибудь отобразите.
Подключите N индикаторов - что-нибудь отобразите.
После этого придет хоть какое-то понимание. А если появятся вопросы, то это будут ВОПРОСЫ действительные.
Сейчас то Вы что хотите? Как посчитать частоту я Вам предложил.
Подключите один семисегементный индикатор, что-нибудь отобразите.
Подключите N индикаторов - что-нибудь отобразите.
После этого придет хоть какое-то понимание. А если появятся вопросы, то это будут ВОПРОСЫ действительные.
Сейчас то Вы что хотите? Как посчитать частоту я Вам предложил.
Re: простой счетчик расхода воды для теплого пола
я вас понял попробую напишу код а потом буду задавать вопросы
Re: простой счетчик расхода воды для теплого пола
Без вариантов, ибо Си спущен нам богами, а других языков и совсем на этой планете нет. А те кто на них (несуществующих) пишут упыри инопланетные.Z_h_e писал(а):поддерживающую Си
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Андрей СШ, Ваш сарказм абсолютно не в тему. ТС спрашивал именно как написать на С. Не кажется ли Вам, чтобы написать на С нужна среда которая поддерживает С?
Re: простой счетчик расхода воды для теплого пола
Ладно затупил.
Re: простой счетчик расхода воды для теплого пола
здравствуйте написал немного кода #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;
}
}
}
здесь идет подсчет импульсов на входе а мне нужно литры в минуту если я правильно понимаю мне нужен еще один счетчик который будет отсчитывать этот промежуток времени, не будут ли конфликтовать эти счетчики если будут скажите пожалуйсти как этого избежать
#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;
}
}
}
здесь идет подсчет импульсов на входе а мне нужно литры в минуту если я правильно понимаю мне нужен еще один счетчик который будет отсчитывать этот промежуток времени, не будут ли конфликтовать эти счетчики если будут скажите пожалуйсти как этого избежать
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: простой счетчик расхода воды для теплого пола
Про литры/минуту Вам уже писали выше - нужно измерять частоту, а не подсчитывать кол-во импульсов. При таком раскладе, Вы получите общий расход в литрах.здесь идет подсчет импульсов на входе а мне нужно литры в минуту
Либо можете отсчитать 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]); //вывод цифры
Код: Выделить всё
_delay_ms(200);
if (signal==10)
Представьте, что перед задержкой значение = 9, а во время задержки увеличилось на 2. И всё, будете ждать миллиарды импульсов, чтобы сработало условие.
Можно, конечно, поставить условие ">=", но тогда будете терять импулься. Всё равно придётся делить переменную на 10.
Re: простой счетчик расхода воды для теплого пола
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(Гц)-чего процессора?
#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(Гц)-чего процессора?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
При чем здесь частота процессора? Частота следования импульсов с Вашего расходомера - это и есть расход. Я же Вам предложил простой способ измерения расхода, что же там может быть непонятного.
Re: простой счетчик расхода воды для теплого пола
подскажите пожалуйста как мне измерять частоту уже голову сломал не могу понять как мне это реализовать.
Кто-то делает через второй таймер кто-то как-то через регистр захвата. Читаю понимаю а как у себя это все собрать немного не догоняю.
Кто-то делает через второй таймер кто-то как-то через регистр захвата. Читаю понимаю а как у себя это все собрать немного не догоняю.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: простой счетчик расхода воды для теплого пола
Ну например настраиваете прерывание от таймера так, чтобы оно возникало через нужный промежуток времени. В этом обработчике прерывания от таймера проводите нужную математику и обнуляете счетчик импульсов.
А можно период считать, самый быстрый способ посчитать частоту, по двум импульсам определите. Режим захват таймера удобен для этого.
А можно период считать, самый быстрый способ посчитать частоту, по двум импульсам определите. Режим захват таймера удобен для этого.



