простой счетчик расхода воды для теплого пола
Здравствуйте подскажите по написанию программы хочу купить датчик расхода жидкости
для теплых полов, хочу вывести на дисплей расход в литрах но не знаю с чего начать видел готовые проекты но там идет дисплей 16х2 и там много не нужной мне информаци, мне хотелось на семисегментнике, можно и на дисмлее 16х2 но тогда мне нужно информацию с 3-х датчиков выводить.
- Реклама
Предположим что у Вас выход с расходомера 450 имп/л.
Тогда Q (л/мин) = F(Гц)*60/450=0,133*F.
Измеряете частоту, умножаете на коэфф, выводите.
Тогда Q (л/мин) = F(Гц)*60/450=0,133*F.
Измеряете частоту, умножаете на коэфф, выводите.
как вывести это на си, через таймер счетчик с счетом импульсов?
Надо определиться с контроллером, на его основе разработать электрическую схему, установить среду программирования поддерживающую Си, набить там программу, скомпилировать, зашить в контроллер, посмотреть что получилось, исправить косяки и потом радоваться.
Можно еще что-то почитать, задать четкий вопрос по непонятому - Вам помогут. А на абстрактные вопросы тут не отвечают.
Частоту проще измерять через таймер, да.
Можно еще что-то почитать, задать четкий вопрос по непонятому - Вам помогут. А на абстрактные вопросы тут не отвечают.
Частоту проще измерять через таймер, да.
а как более точно написать: "помогите написать программу" или что то я не правильно написал?
- Реклама
подскажите если я не правильно создал тему или что исправить или дописать
микроконтроллер атмега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
Это равнозначно сделайте за меня. Но только если кто-то возжелает это сделать, без ТЗ и схемы никак не сможет.gulevskyd писал(а):"помогите написать программу"
Если брать тот же коэфф преобразования расходомера (450), можно посчитать количество импульсов за 13,33 сек. Потом просто разделить на 100. И у Вас опять будут л/мин. А можно собрать обычный частотомер на логике, только время счета не стандартное, а деление на 100 - это всего-лишь точка постоянно засвеченная на индикаторе после второго разряда справа.
нет я не хочу чтоб за меня это делали я просто хочу чтоб помогли с чего все начать что за чем идет я начинаю изучать таймера счетчики читать я про них читал а практики нет охота и попрактиковаться и чтоб интерес был и польза.
Поморгайте светодиодом - примеров полно.
Подключите один семисегементный индикатор, что-нибудь отобразите.
Подключите N индикаторов - что-нибудь отобразите.
После этого придет хоть какое-то понимание. А если появятся вопросы, то это будут ВОПРОСЫ действительные.
Сейчас то Вы что хотите? Как посчитать частоту я Вам предложил.
Подключите один семисегементный индикатор, что-нибудь отобразите.
Подключите N индикаторов - что-нибудь отобразите.
После этого придет хоть какое-то понимание. А если появятся вопросы, то это будут ВОПРОСЫ действительные.
Сейчас то Вы что хотите? Как посчитать частоту я Вам предложил.
я вас понял попробую напишу код а потом буду задавать вопросы
Без вариантов, ибо Си спущен нам богами, а других языков и совсем на этой планете нет. А те кто на них (несуществующих) пишут упыри инопланетные.Z_h_e писал(а):поддерживающую Си
Андрей СШ, Ваш сарказм абсолютно не в тему. ТС спрашивал именно как написать на С. Не кажется ли Вам, чтобы написать на С нужна среда которая поддерживает С?
здравствуйте написал немного кода #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;
}
}
}
здесь идет подсчет импульсов на входе а мне нужно литры в минуту если я правильно понимаю мне нужен еще один счетчик который будет отсчитывать этот промежуток времени, не будут ли конфликтовать эти счетчики если будут скажите пожалуйсти как этого избежать
Про литры/минуту Вам уже писали выше - нужно измерять частоту, а не подсчитывать кол-во импульсов. При таком раскладе, Вы получите общий расход в литрах.здесь идет подсчет импульсов на входе а мне нужно литры в минуту
Либо можете отсчитать 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.
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(Гц)-чего процессора?
При чем здесь частота процессора? Частота следования импульсов с Вашего расходомера - это и есть расход. Я же Вам предложил простой способ измерения расхода, что же там может быть непонятного.
подскажите пожалуйста как мне измерять частоту уже голову сломал не могу понять как мне это реализовать.
Кто-то делает через второй таймер кто-то как-то через регистр захвата. Читаю понимаю а как у себя это все собрать немного не догоняю.
Кто-то делает через второй таймер кто-то как-то через регистр захвата. Читаю понимаю а как у себя это все собрать немного не догоняю.
Ну например настраиваете прерывание от таймера так, чтобы оно возникало через нужный промежуток времени. В этом обработчике прерывания от таймера проводите нужную математику и обнуляете счетчик импульсов.
А можно период считать, самый быстрый способ посчитать частоту, по двум импульсам определите. Режим захват таймера удобен для этого.
А можно период считать, самый быстрый способ посчитать частоту, по двум импульсам определите. Режим захват таймера удобен для этого.



