Семисегментный двухразрядный индикатор
- Войдите на сайт для отправки комментариев
Пт, 22/11/2013 - 01:52
Всем привет! Мозгов не хватает чтобы решить проблему!
Вот схема 
Вот код
unsigned char number[] = {
B11000000,//0
B11111001,//1
B10100100,//2
B10110000,//3
B10011001,//4
B10010010,//5
B10000010,//6
B11111000,//7
B10000000,//8
B10010000,//9
};
byte t;
unsigned char count = 0;
//числа для вывода на индикатор
unsigned char data1 = 0;
unsigned char data2 = 0;
void setup(){}
void loop()
{
data1 = 5;
data2 = 2;
//порт, к которому подкл. сегменты
PORTD = 0xff;
DDRD = 0xff;
//вывод, к которому подкл. анод
PORTB = 0;
DDRB = (1<<1)|(1<<0);
while(1){
PORTB &= ~((1<<1)| (1<<0));
if (count == 0) {
PORTD = number[data2];
PORTB |= (1<<1);
}
if (count == 1) {
PORTD = number[data1];
PORTB |= (1<<0);
}
count++;
if (count == 2) count = 0;
delay(10);
}
}
Переменные data1 и data2 виводят значения на индикаторы 1 и 2. Но переменная t будет принимать значение от 0 до 99 и мне надо выводить его на индикаторы. Как сделать чтобы двузначное число t посредством data1 и data2 выводились на индикаторы 1 и 2.
Все просто
byte number[] = { B11000000,//0 B11111001,//1 B10100100,//2 B10110000,//3 B10011001,//4 B10010010,//5 B10000010,//6 B11111000,//7 B10000000,//8 B10010000,//9 }; byte t = 0; bool digit = 0; int count = 0; void setup() { //порт, к которому подкл. сегменты PORTD = 0xff; DDRD = 0xff; //вывод, к которому подкл. анод PORTB = 0; DDRB = (1<<1)|(1<<0); } void loop() { if (count == 200) { count = 0; t++; if (t == 100) t = 0; } count++; if (digit) { PORTD = number[t%10]; PORTB |= (1<<1); } else { PORTD = number[t/10]; PORTB |= (1<<0); } digit = !digit; delay(5); }Большое спасибо! Работает!
чоткий вопрос
все по существу и ответы что надо....
вот был бы такой форум))))
Все просто
PD7 не получается.ЧерезPD7 не получается.
byte number[] = { B11000000,//0 B11111001,//1 B10100100,//2 B10110000,//3 B10011001,//4 B10010010,//5 B10000010,//6 B11111000,//7 B10000000,//8 B10010000,//9 }; byte t = 0; bool digit = 0; int count = 0; bool point_1 = 1; bool point_2 = 0; void setup() { //порт, к которому подкл. сегменты PORTD = 0xff; DDRD = 0xff; //вывод, к которому подкл. анод PORTB = 0; DDRB = (1<<1)|(1<<0); } void loop() { if (count == 200) { count = 0; t++; if (t == 100) t = 0; } if (count%67 == 0) { point_1 = !point_1; point_2 = !point_2; } count++; if (digit) { PORTD = number[t%10]; if (point_1) PORTD &= ~(1<<7); PORTB |= (1<<1); } else { PORTD = number[t/10]; if (point_2) PORTD &= ~(1<<7); PORTB |= (1<<0); } digit = !digit; delay(5); }Здравствуйте, maksim!
Я сделал как советовал NeiroN
Получается что весь порт D занят работой индикаторов. И digitalWrite(7,HIGH) ничего не включает, тоесть невозможно достучаться до PD7.
Я сделал как советовал NeiroN
Я свой код не менял, прото добавил...
Попробую по вашему. Спасибо!
if(Temp_OUTSIDE>=0) { tens_OUTSIDE = Temp_OUTSIDE / 10; ones_OUTSIDE = Temp_OUTSIDE % 10; digitalWrite(OUTSIDE_minus, LOW); // - знак минус на LED } if(Temp_OUTSIDE<0) { tens_OUTSIDE = (Temp_OUTSIDE * (-1)) / 10; ones_OUTSIDE = (Temp_OUTSIDE * (-1)) % 10; digitalWrite(OUTSIDE_minus, HIGH); // - знак минус на LED }Все отлично работает , но столкнулся с проблемой: как разложить на десятки и единицы число с минусом ? ( нужно вывести температуру на улице ) - после того как темература уменьшается ниже 0 гр на дисплее вместо цифр - бурказябры скачут !
ВЕЗЕТ МНЕ НА ОТВЕТЫ - выше код который решает эту проблему !
да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины
да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины
пины на сегменты считайте что никак, для управления сегментами используется полный порт, а в ардуине полный порт только один - порт D. Можно, конечно, переписать без прямой записи в порт - но это весь скетч ломать.
Пины на аноды поменять легко - строчки 22 и 23 кода
да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины
пины на сегменты считайте что никак, для управления сегментами используется полный порт, а в ардуине полный порт только один - порт D. Можно, конечно, переписать без прямой записи в порт - но это весь скетч ломать.
Пины на аноды поменять легко - строчки 22 и 23 кода
я к сожалению в узких рамках прибор где стоял атмега8 вышел из строя пришлось и атмегу заменить на Nano и функционал немного поменять поэтому задействовать не могу конкретный порт
я описал каждую цифру 0-9, но не понимаю как это заставить работать если не описать се от 0 до 99
#define a 11 #define b 1 #define c 10 #define d 7 #define e 4 #define f 13 #define g 12 #define d1 17 #define d2 16 void setup() { pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); } void loop() { digitalWrite(d1, HIGH); f5(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); } void f1() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } void f2() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW); } void f3() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); } void f4() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); } void f5() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); } void f6() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } void f7() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } void f8() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } void f9() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); } void f0() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); } void fP () { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); }так ваш код хоть что показывает или нет
так ваш код хоть что показывает или нет
показывает ровно то что указано в лупе
void loop() { digitalWrite(d1, HIGH); f5(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); }т.е. цифру 50 я вижу потому как на первом сегменте вклюючаю цифру 5, жду 10 мили секунд , выключаю первый сегмент и показываю на втором сегменте цыфру 0 жду так же 10 мили сек и пошло заново , я не соображу как отобразить переменную в которую пиштся с сенсора показания
т.е. цифру 50 я вижу потому как на первом сегменте вклюючаю цифру 5, жду 10 мили секунд , выключаю первый сегмент и показываю на втором сегменте цыфру 0 жду так же 10 мили сек и пошло заново , я не соображу как отобразить переменную в которую пиштся с сенсора показания
тогда все верно, переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц. И так быстро-быстро по кругу, иначе будет мерцать.
Лучше это делать на таймерах, иначе МК ничего другого делать не сможет
для начала, в качестве домашнего задания, напиши одну универсальную функцию, которой на вход подаешь одну цифру 0..9, а она зажигает правильные сегменты. Потом разберешь значение твоей переменной на цифры и легко выведешь с помощью этой функции.
Пока у него скилл такой, что он для каждого значения 0..99 будет свой case писать. :)
switch(его переменная){ case 0: digitalWrite(d1, HIGH); f0(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 50: digitalWrite(d1, HIGH); f5(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 99: digitalWrite(d1, HIGH); f9(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f9(); delay (10); digitalWrite(d2, LOW); break; default: break; }Пока у него скилл такой, что он для каждого значения 0..99 будет свой case писать. :)
switch(его переменная){ case 0: digitalWrite(d1, HIGH); f0(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 50: digitalWrite(d1, HIGH); f5(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 99: digitalWrite(d1, HIGH); f9(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f9(); delay (10); digitalWrite(d2, LOW); break; default: break; }вот вы смеетесь, а ведь все равно не понятно , про что прочесть какой метод по средствам чего куда обращается как ищет что сравнивает когда коментариев нет у кода как понять как работает то что бы можно было применять в условиях моей задачи, ну либо я максимально туп и не вижу очевидных вещей
"Да что тут думать!")
// 3xled #include "led.h" const uint8_t segment[] = { _A, _B, _C, _D, _E, _F, _G, _H }; const uint8_t common[] = { COMMON }; uint8_t segment_buffer[COMMON_MAX]; void ledInit() { for (uint8_t i = 0; i < SEGMENT_MAX; i++) out(segment[i]); for (uint8_t i = 0; i < COMMON_MAX; i++) out(common[i]); } // с периодичностью <= 12 / COMMON_MAX ms (60 hz) void led() { static uint8_t com; off(common[com]); if (++com >= COMMON_MAX) com = 0; for (uint8_t i = 0; i < SEGMENT_MAX; i++) segment_buffer[com] & 1<<i ? off(segment[i]) : on(segment[i]); on(common[com]); } // шрифт const uint8_t font[] PROGMEM = { MASK_A | MASK_B | MASK_C | MASK_D | MASK_E | MASK_F , //0 a MASK_B | MASK_C , //1 -- MASK_A | MASK_B | MASK_D | MASK_E | MASK_G, //2 f| |b MASK_A | MASK_B | MASK_C | MASK_D | MASK_G, //3 --g MASK_B | MASK_C | MASK_F | MASK_G, //4 e| |c MASK_A | MASK_C | MASK_D | MASK_F | MASK_G, //5 -- .h MASK_A | MASK_C | MASK_D | MASK_E | MASK_F | MASK_G, //6 d MASK_A | MASK_B | MASK_C , //7 MASK_A | MASK_B | MASK_C | MASK_D | MASK_E | MASK_F | MASK_G, //8 MASK_A | MASK_B | MASK_C | MASK_D | MASK_F | MASK_G //9 }; // преобразуем в шрифт uint8_t getFont(uint8_t dig) { return pgm_read_byte(&font[dig & 0x0f]); } // display 0 - 255 void display(uint8_t bin) { for (uint8_t i = 0; i < COMMON_MAX - 1; i++) segment_buffer[i] = 0; if (bin / 100) segment_buffer[0] = getFont(bin / 100); bin %= 100; if (bin / 10 || segment_buffer[0]) segment_buffer[1] = getFont(bin / 10); segment_buffer[2] = getFont(bin % 10); }shamsing
Вы же уже научились показывать число 50? так что сложного то?
или вот что непонятного в этой фразе?
переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.
спрашивайте - поясню
shamsing
Вы же уже научились показывать число 50? так что сложного то?
или вот что непонятного в этой фразе?
переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.
спрашивайте - поясню
я к сожалению могу работать с контроллером либо по ночам в командировке , либо как сейчас когда дома и болен, по удивлениям из коментариев я видимо не понимаю очевидную вещ
у автора есть массив в котором записано в двоичном коде на какой пин включить какой выключить для получения нужного символа на индикаторе, в какой то из строк вот мне не понятной идёт ображение что при 3 нужно обратиться к ячейке массива тоже номер 3 а где такие строки как ы моем коде , что бы потугить первую цыфру и зажеч вторую и наоборот для достижения двух значного числа если не выключать по почередности то получится дублирование на обоих сегментах
PORTD = number[t%10]; // тут в порт пишется символ первой цыфры двухзначного числа т.е. соответствующая ячейка из массива if (point_1) PORTD &= ~(1<<7); // а вот это не понятная строка PORTB |= (1<<1); // и эта тоже"Да что тут думать!")
// 3xled #include "led.h" const uint8_t segment[] = { _A, _B, _C, _D, _E, _F, _G, _H }; const uint8_t common[] = { COMMON }; uint8_t segment_buffer[COMMON_MAX]; void ledInit() { for (uint8_t i = 0; i < SEGMENT_MAX; i++) out(segment[i]); for (uint8_t i = 0; i < COMMON_MAX; i++) out(common[i]); } // с периодичностью <= 12 / COMMON_MAX ms (60 hz) void led() { static uint8_t com; off(common[com]); if (++com >= COMMON_MAX) com = 0; for (uint8_t i = 0; i < SEGMENT_MAX; i++) segment_buffer[com] & 1<<i ? off(segment[i]) : on(segment[i]); on(common[com]); } // шрифт const uint8_t font[] PROGMEM = { MASK_A | MASK_B | MASK_C | MASK_D | MASK_E | MASK_F , //0 a MASK_B | MASK_C , //1 -- MASK_A | MASK_B | MASK_D | MASK_E | MASK_G, //2 f| |b MASK_A | MASK_B | MASK_C | MASK_D | MASK_G, //3 --g MASK_B | MASK_C | MASK_F | MASK_G, //4 e| |c MASK_A | MASK_C | MASK_D | MASK_F | MASK_G, //5 -- .h MASK_A | MASK_C | MASK_D | MASK_E | MASK_F | MASK_G, //6 d MASK_A | MASK_B | MASK_C , //7 MASK_A | MASK_B | MASK_C | MASK_D | MASK_E | MASK_F | MASK_G, //8 MASK_A | MASK_B | MASK_C | MASK_D | MASK_F | MASK_G //9 }; // преобразуем в шрифт uint8_t getFont(uint8_t dig) { return pgm_read_byte(&font[dig & 0x0f]); } // display 0 - 255 void display(uint8_t bin) { for (uint8_t i = 0; i < COMMON_MAX - 1; i++) segment_buffer[i] = 0; if (bin / 100) segment_buffer[0] = getFont(bin / 100); bin %= 100; if (bin / 10 || segment_buffer[0]) segment_buffer[1] = getFont(bin / 10); segment_buffer[2] = getFont(bin % 10); }я уверен 100% рабочий код, но не фига не понятный
shamsing. вы видно настолько не понимаете, что даже спросить толком не можете. Не понял, в чем у вас затык.
Давайте по порядку
Возьмем число 35
- как получить из него первую цифру "3" и вторую"5" - знаете?
- как вывести в первый сегмент "3" - есть проблемы?
- потом выключам первый сегмент, включаем второй - все понятно?
- выводим во второй сегмент "5" - даже не спрашиваю - точно так же как в первый цифру три!
ЭТО ВСЕ!!
Код в первом сообщении к вашей задаче отношения не имеет. Если хотите - потом сидите и разбирайтесь, ищите в учебнике незнакомые слова. Но сейчас себе голову забивать не стоит.
У вас есть двузначное десятичное число, например 52. Вам нужно вывести его на индикатор. Как выводить цифры по отдельности вы уже знаете. Осталось понять, как получить отдельно первую и вторую цифры для вывода. Это просто.
52 / 10 = 5 - это первая цифра, получается делением числа на 10
52 % 10 = 2 - это вторая цифра, остаток числа после деления на 10
Осталось только вывести на индикатор первую полученную цифру в левый разряд, а через 10 мс вторую полученную цифру в правый разряд. Собственно и все
shamsing. вы видно настолько не понимаете, что даже спросить толком не можете. Не понял, в чем у вас затык.
Давайте по порядку
Возьмем число 35
- как получить из него первую цифру "3" и вторую"5" - знаете?
- как вывести в первый сегмент "3" - есть проблемы?
- потом выключам первый сегмент, включаем второй - все понятно?
- выводим во второй сегмент "5" - даже не спрашиваю - точно так же как в первый цифру три!
ЭТО ВСЕ!!
Код в первом сообщении к вашей задаче отношения не имеет. Если хотите - потом сидите и разбирайтесь, ищите в учебнике незнакомые слова. Но сейчас себе голову забивать не стоит.
"- как получить из него первую цифру "3" и вторую"5" - знаете?"
с помощью оператора % (modulo) (35%10) получаю вторую цифру "5"
с помощью оператора / (division) (35/10) получу первую цифру "3"
а вот что у меня не вяжется так как вызвать функцию под названием f3(); а затем когда цифра изменится например на 4 должна вызваться f4();
затык что с чем сравнивать
...пла'чу ...
а вот что у меня не вяжется так как вызвать функцию под названием f3(); а затем когда цифра изменится например на 4 должна вызваться f4();
затык что с чем сравнивать
http://arduino.ru/Reference/SwitchCase
мои прогнозы сбываюцца.
когда если не сейчас это делать когда я рядом с котлом могу находиться для которого переделываю автоматику сломавшуюся, а топить уже нужно
если б вы сразу написали, что вы переделываете автоматику для котла - я бы сразу послал вас нах и не связывался
Пока у него скилл такой, что он для каждого значения 0..99 будет свой case писать. :)
switch(его переменная){ case 0: digitalWrite(d1, HIGH); f0(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 50: digitalWrite(d1, HIGH); f5(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f0(); delay (10); digitalWrite(d2, LOW); break; . . . case 99: digitalWrite(d1, HIGH); f9(); delay (10); digitalWrite(d1, LOW); digitalWrite(d2, HIGH); f9(); delay (10); digitalWrite(d2, LOW); break; default: break; }Вы были правы к сожалению я догадался это реализовать только таким образом как вы и предполагали, хотя это и полный брад но мне пока что более короткий и возможно быстродейственнее код не доступен
#define a 11 #define b 1 #define c 10 #define d 7 #define e 4 #define f 13 #define g 12 #define d1 8 #define d2 16 // к какому аналоговому пину мы подключены #define THERMISTORPIN 17 // сопротивление при 25 градусах по Цельсию #define THERMISTORNOMINAL 10000 // temp. для номинального сопротивления (практически всегда равна 25 C) #define TEMPERATURENOMINAL 25 // сколько показаний используем для определения среднего значения #define NUMSAMPLES 10 // бета коэффициент термистора (обычно 3000-4000) #define BCOEFFICIENT 2770//3950 // сопротивление второго резистора #define SERIESRESISTOR 10000 int samples[NUMSAMPLES]; void setup() { //Serial.begin(9600); pinMode(18, INPUT);//кнопка минус pinMode(19, INPUT);//кнопка плюс pinMode(20, INPUT);//кнопка функции pinMode(21, INPUT);//кнопка старт/стоп pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); } void loop() { uint8_t i; float average; // сводим показания в вектор с небольшой задержкой между снятием показаний for (i=0; i< NUMSAMPLES; i++) { samples[i] = analogRead(THERMISTORPIN); //delay(10); } // рассчитываем среднее значение average = 0; for (i=0; i< NUMSAMPLES; i++) { average += samples[i]; } average /= NUMSAMPLES; average = 1023 / average - 1; average = SERIESRESISTOR / average; float steinhart; steinhart = average / THERMISTORNOMINAL; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // инвертируем steinhart -= 273.15; // конвертируем в градусы по Цельсию //Serial.println(int(steinhart)); if((int(steinhart)/10)==1){ digitalWrite(d1, HIGH); f1(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==1){ digitalWrite(d2, HIGH); f1(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==2){ digitalWrite(d1, HIGH); f2(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==2){ digitalWrite(d2, HIGH); f2(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==3){ digitalWrite(d1, HIGH); f3(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==3){ digitalWrite(d2, HIGH); f3(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==4){ digitalWrite(d1, HIGH); f4(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==4){ digitalWrite(d2, HIGH); f4(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==5){ digitalWrite(d1, HIGH); f5(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==5){ digitalWrite(d2, HIGH); f5(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==6){ digitalWrite(d1, HIGH); f6(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==6){ digitalWrite(d2, HIGH); f6(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==7){ digitalWrite(d1, HIGH); f7(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==7){ digitalWrite(d2, HIGH); f7(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==8){ digitalWrite(d1, HIGH); f8(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==8){ digitalWrite(d2, HIGH); f8(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==9){ digitalWrite(d1, HIGH); f9(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==9){ digitalWrite(d2, HIGH); f9(); digitalWrite(d2, LOW); } if((int(steinhart)/10)==0){ digitalWrite(d1, HIGH); f0(); digitalWrite(d1, LOW); } if((int(steinhart)%10)==0){ digitalWrite(d2, HIGH); f0(); digitalWrite(d2, LOW); } } void f1() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); delay(5); } void f2() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW); delay(5); } void f3() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); delay(5); } void f4() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void f5() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void f6() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void f7() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); delay(5); } void f8() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void f9() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void f0() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); delay(5); } void fP () { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void fT () { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); delay(5); } void fST () { f5(); digitalWrite(d1, HIGH); delay (10); digitalWrite(d1, LOW); fT(); digitalWrite(d2, HIGH); delay (10); digitalWrite(d2, LOW); }когда если не сейчас это делать когда я рядом с котлом могу находиться для которого переделываю автоматику сломавшуюся, а топить уже нужно
если б вы сразу написали, что вы переделываете автоматику для котла - я бы сразу послал вас нах и не связывался
не расскажете почему так сурово?
не расскажете почему так сурово?
потому что надо быть полный идиотом с таким уровнем программирования браться за автоматику котла.
Если вы с поясненниеми трех человек так и не поняли, как напечатать на экране двухзначное число - представляю сколько ошибок вы нагородили в самой программе управления.
b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...
b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...
имхо, не ардуино ЗЛО, а жадность и глупость.
не расскажете почему так сурово?
потому что надо быть полный идиотом с таким уровнем программирования браться за автоматику котла.
Если вы с поясненниеми трех человек так и не поняли, как напечатать на экране двухзначное число - представляю сколько ошибок вы нагородили в самой программе управления.
не поспорю что ошибок думаю много, код можно думаю сократить наверное на 60%
String vers = "1.11"; /* Версия 20 сентября работа по среднему значению что бы избавиться от вкл/выкл моторов при выходе на режим и не стабильных показаниях с сенсоров температуры*/ //______________________________________________________________________________________________________________________________ #include "OneWire.h" // Библиотека для подключения датчика DS18b20 #include <DallasTemperature.h> DeviceAddress senskot = { 0x28,0xC6,0xEE,0x79,0x97,0x09,0x03,0x72 }; //Адрес датчика температуры теплоносителя DeviceAddress sensstreet = { 0x28,0xF3,0xAD,0xDA,0x5E,0x14,0x01,0xF6 }; //Адрес датчика температуры улицы OneWire oneWire(8); // Пин подключения датчиков DS18b20 DallasTemperature sensors(&oneWire); int tkot; // Переменная для хранения значение температуры котла с датчика DS18B20 int tstreet; // Переменная для хранения значение температуры улицы с датчика DS18B20 int tnormstreet; // Переменная хранящая необходимую температуру работы котла в зависимости от уличной температуры #include <Average.h> // Библиотека для вычисления среднего значия Average<float> avesenskot(10); // Установка количиства записей показаний температуры котла (10) для вычисления среднего значения Average<float> avesensstreet(10); // Установка количиства записей показаний температуры улицы (10) для вычисления среднего значения //______________________________________________________________________________________________________________________________ #include "max6675.h" // Библиотека для подключения модуля термопары MAX6675 int thermoDO = 2; // он же SO int thermoCS = 5; // 8/12 int thermoCLK = 6; // он же SCK MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); // int tfire = 0; // Переменная для хранения значение температуры с термопары модуля MAX6675 Average<float> avetfire(10); // Установка количиства записей показаний температуры огня (10) для вычисления среднего значения //______________________________________________________________________________________________________________________________ #include <DHT.h> // Библиотека для подключения датчика DHT #define DHTTYPE DHT22 // Установка модели датчика DHT(11/22) #define DHTPIN 3 // Пин подключения датчика DHT //unsigned long last_time_sms; // Переменная для хранения времени последнего отправленного SMS float hdom = 0, tdom = 0, tdomt = 0; // Переменные для хранения информации с сенсора float tnormdom = 27; // Переменная для хранения устанавливаемой температуры в доме DHT dht(DHTPIN, DHTTYPE); // Average<float> avetdom(10); // Установка количиства записей показаний (10) для вычисления среднего значения //______________________________________________________________________________________________________________________________ //long Refresh = millis(); // Время перехода котла в режим ПОДДЕРЖАНИЕ //long RefreshPeriod = 60000; // Период через которое будет включатся продув котла если котел в ПОДДЕРЖАНИИ //long RefreshTime = millis(); // Время начала продувки котла //long RefreshTimePeriod = 10000; // Время на которое будет включаться продув long lastUpdateSensor = millis(); // Время последнего обновления информации с датчиков long updatePeriodSensor = 3000; // Период обновления информации с датчиков секунд //long lastUpdateSerial = millis(); // Время последнего обновления информации в монитор порта //long updatePeriodSerial = 5000; // Период вывода информации в монитор порта //String fullinf = "fail"; // Переменная хранящая информацию со всех датчиков int butt = 9; // Пин подключения кнопки старт/стоп int rellamp = 14; // Пин подключения реле отвечающей за идикатор состояния котла (работа/остановка) int relnasos = 15; // Пин подключения реле отвечающей за работу насоса теплого пола int relnasos_flag; int relmotor = 16; // Пин подключения реле отвечающей за работу электрокотла int relmotor_flag; //bool button_val; // Переменная для хранения значения с кнопки //bool start_flag; // Переменная флага включения контроллера bool work; // Переменная флага состояния котла (старт/стоп) bool work_flag; // Переменная флага состояния работы котла (горение/поддержание) //bool enkot; // Переменная флага состояния электро котла bool but; // Переменная хранящая значение кноки boolean motor_flag = 0; // Флаг работы мотора раздува //void(* resetFunc) (void) = 0; // Объявляем функцию void (програмный reset) #include <SPI.h> #include <Ethernet.h> //#include <SD.h> //File webFile; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 1, 20); EthernetServer server(80); void setup() { Ethernet.begin(mac, ip); server.begin(); //(!SD.begin(4)); pinMode(butt,INPUT); // Настройка пина как вход pinMode(rellamp,OUTPUT); // Настройка пина как выход pinMode(relnasos,OUTPUT); // Настройка пина как выход pinMode(relmotor,OUTPUT); // Настройка пина как выход digitalWrite(rellamp, HIGH); // Установка высокого уровня сигнала на пин реле т.к. работают в обратной полярности digitalWrite(relnasos, HIGH); // Установка высокого уровня сигнала на пин реле т.к. работают в обратной полярности digitalWrite(relmotor, HIGH); // Установка высокого уровня сигнала на пин реле т.к. работают в обратной полярности sensors.begin(); // Запуск библиотеки для DS18B20 dht.begin(); // Запуск библиотеки для DHT22 Serial.begin(9600); // Установка скорость обмена данными с компьютером Serial.println(vers); // Сообщение в монитор порта о версии программы lastUpdateSensor = millis(); // Обнуляем таймер проверки } void loop() { but = digitalRead(9); // Запись в переменную состояния пина подключенной кнопки // Обработка кнопки включения работы котла if(but == 1){ // Если кнопка включена то: work_flag = true; // Флаг работы ставим (ГОРЕНИЕ) } else{ // Если нет то: work_flag = false; // Флаг работы ставим (ПОДДЕРЖАНИЕ) } // Запись значений с сензоров в переменные и вывод их в монитор порта if (lastUpdateSensor + updatePeriodSensor < millis()){ // Если просшло 2 секнуды после последнего считывания то считываем данные sensors.requestTemperatures(); // Команда всем датчикам DS18B20 для преобразования температуры tkot = sensors.getTempC(senskot); // Определяем температуру теплоносителя в котле от датчика DS18B20 avesenskot.push(tkot); // Запись значение с датчика DS18B20 котла, для вычисления среднего значения из последних 10 показаний tstreet = (sensors.getTempC(sensstreet)); // Определяем температуру улицы от датчика DS18B20 if(tstreet == -127){ tstreet = 0; } avesensstreet.push(tstreet); // Запись значение с датчика DS18B20 улицы, для вычисления среднего значения из последних 10 показаний hdom = dht.readHumidity(); // Запись значения влажности с датчика DHT в переменную tdom = (1 + (dht.readTemperature())); // Запись значения температуры с датчика DHT в переменную if(isnan(tdom)){ // Если датчик не отвечает, то: avetdom.push(26); // Записываем для вычисления среднего значения 26, что при выходе из строя датчика оставит включеным ТП } else{ // Если нет, то: avetdom.push(tdom); // Запись значения с датчика DHT, для вычисления среднего значения из последних 10 показаний } tfire = thermocouple.readCelsius(); // Запись значения температуры с термопары max 6675k в переменную avetfire.push(tfire); lastUpdateSensor = millis(); } // Запись в переменную информиации всех состояний и значений с датчиков /*fullinf = "\r\nT dom = " + String(tdom, 1) + " C \r\nH dom = " + String(hdom, 1) + " % \r\nT kotla = " + String(tkot) + " C \r\nT street = " + String(tstreet) + " C \r\nT fire = " + String(tfire) + " C \r\nWork = " + String(work == 0 ? "OFF" : "ON") + " \r\nMotor = " +String(motor_flag == 0 ? "OFF" : "ON") + " \r\nT norm = " + String(tnormstreet) + " \r\nMotor TP = " + String(relnasos_flag == 0 ? "OFF" : "ON"); lastUpdateSensor = millis(); // Обнуляем таймер // При первом включении будет проверятся температура на тот счет если выключалось эллектричество if(start_flag == false){ // Если флаг равен false то: start_flag = true; // Меняем значение флага на true if(tfire > tkot){ // Проверяем есть ли горение в котле если да то: work = true; // Ставим флаг состояния раьботы котла (СТАРТ) } else{ // Если горения нет то: work = false; // Ставим флаг состояния раьботы котла (СТОП) } } } if (lastUpdateSerial + updatePeriodSerial < millis()){ // Если просшло 60 секнуды после последнего вывода инфы в порт, то выводим заново Serial.println(fullinf); // Вывожим инфу в монитор порта lastUpdateSerial = millis(); // Обнуляем таймер }*/ // Проверяем уличную температуру задаём нужную температуру работы котла(tnormstreet) в зависимости от уличной //tstreet = 10; if(avesensstreet.mean() >= 0 ){ // Если уличная температура равна или больше 0, то tnormstreet = 50 tnormstreet = 55; } if(avesensstreet.mean() < 0 && avesensstreet.mean() >= -10){ // Если уличная температура меньше 0 , но больше или равна -10, то tnormstreet = 60 tnormstreet = 60; } if(avesensstreet.mean() <= -11 && avesensstreet.mean() >= -24){ // Если уличная температура равна или меньше -11, но большеили равна -24 то tnormstreet = 65 tnormstreet = 65; } if(avesensstreet.mean() <= -25){ // Если уличная температура равна или меньше -25 то tnormstreet = 75 tnormstreet = 75; } if(avetfire.mean() <= avesenskot.mean() && avetfire.mean() < 30){ // Если средняя температура огня меньше или равна средней температуре котла и меньше 50 градусов то: work = false; // Выводим котел в состояние (СТОП) } else{ // Если нет то: work = true; // Выводим котел в состояние (СТАРТ) } if (work_flag == true && work == true){ // Если флаг работы котла(ГОРЕНИЕ) и флага состояния котла (СТАРТ),т.е. котел РАБОТАЕТ то: digitalWrite(rellamp, LOW); // Включаем лампу сигнализирующую РАБОТУ котла if (avesenskot.mean() >= tnormstreet){ // Если средняя температура котла больше или равна устанвленной то: relmotor_flag = false; // Выключаем РАЗДУВ motor_flag = false; // Выводим флаг работы мотора раздува в стоп } else{ // Если средняя температура котла меньше то: relmotor_flag = true; // Включаем РАЗДУВ motor_flag = true; // Выводим флаг работы мотора раздува в работа } if ((avesenskot.mean() < 40) || (avesenskot.mean() > 77)){ // Если средняя температура котла меньше 40 или больше 77 то: relnasos_flag = false; // Насос ТП выключен } else{ // Если нет то: if(avetdom.mean() < tnormdom){ // Если температура в доме меньше установленной, то: relnasos_flag = true; //Насос ТП включен } else{ // Если нет то : relnasos_flag = false; // Насос ТП выключен } } } else{ // Если нет т.е либо кнопка выключена либо котел потух, то: digitalWrite(rellamp, HIGH); // Включаем лампу сигнализирующую ОСТАНОВКУ котла relmotor_flag = false; // Выключаем раздув motor_flag = false; // Выводим флаг работы мотора раздува в стоп if(avetdom.mean() < tnormdom && (avesenskot.mean() - 5) > avetdom.mean()){ // Если средняя температура в доме меньше заданной и температура котла,минус потери 5 градусов по трубе больше температуры в доме, то: relnasos_flag = true; //Насос ТП включен } else{ // Если нет то : relnasos_flag = false; // Насос ТП выключен } } if(relmotor_flag == true){ digitalWrite(relmotor, LOW); } if(relmotor_flag == false){ digitalWrite(relmotor, HIGH); } if(relnasos_flag == false){ digitalWrite(relnasos, LOW); } if(relnasos_flag == true){ digitalWrite(relnasos, HIGH); } EthernetClient client = server.available(); if (client) { // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<meta http-equiv='refresh' content='5'/>"); client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>"); client.println("<title>Котельная</title>"); client.println("<style>.der{color:red;width:100%;font-size:3em;}</style>"); client.print("<div class='der'>"); client.print("Версия "); //client.print("<img src='/flame.png'/>Температура котла = "); client.print(vers); client.print("</div>"); client.print("</br>"); client.print("<div class='der'>"); client.print("Температура котла = "); //client.print("<img src='/flame.png'/>Температура котла = "); client.print(tkot); client.print("/"); client.print(avesenskot.mean()); client.print("</div>"); client.print("</br>"); //client.println("<br />"); client.print("<div class='der'>");//style=color:red;background:##77a0d4;width:50%;height:400px;margin-left:200px;font-size:24px; client.print("Температура огня = "); client.print(tfire); client.print("/"); client.print(avetfire.mean()); client.print("</div>"); client.print("</br>"); //client.println("<br />"); client.print("<div class='der'>");//style=color:red;background:##77a0d4;width:50%;height:400px;margin-left:200px;font-size:24px; client.print("Температура улицы = "); client.print(tstreet); client.print("/"); client.print(avesensstreet.mean()); client.print("</div>"); client.print("</br>"); //client.println("<br />"); client.print("<div class='der'>"); client.print("Заданная температура котла = "); client.print(tnormstreet); client.print("</div>"); client.print("</br>"); //client.println("<br />"); client.print("<div class='der'>"); client.print("Температура дом = "); client.print(tdom); client.print("/"); client.print(avetdom.mean()); client.print(" °C"); client.print("</div>"); //client.print("<br/>"); client.print("<div class='der'>"); client.print("Влажность дом = "); client.print(hdom); client.print(" %"); client.print("</div>"); client.print("</br>"); //client.println("</br>"); client.print("<div class='der'>"); client.print("Работа котла = "); //motor_flag == 0 ? "OFF" : "ON" client.print(work == 0 ? "Потух" : "Горит");// == 0 ? "OFF" : "ON" client.print("</div>"); client.print("</br>"); //client.println("<br />"); client.print("<div class='der'>"); client.print("Раздув = "); //motor_flag == 0 ? "OFF" : "ON" client.print(motor_flag == 0 ? "Выключен" : "Включен"); client.print("</div>"); client.print("</br>"); client.print("<div class='der'>"); client.print("Теплый пол = "); //motor_flag == 0 ? "OFF" : "ON" client.print(relnasos_flag == 0 ? "Выключен" : "Включен"); client.print("</div>"); client.print("</br>"); //client.print("<br />"); client.println("</html>"); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } }но после того как купил знакомый готовую ,я посмотрел что и как внутри и придумал алгоритм ,собрал подобную только лучше на мой взгляд на ардуине, она работает уже второй сезон начался у меня дома на моём котле, а вот заводская умерла и мало того что моя стоила в 7 раз дешевле так она еще и удобнее и имеет возможность дальше ее улучшить, правда редко появляется время это делать, а вот знакомому нужно отапливать дом, а делать в точности как у меня не удобно, т.к. привык смотреть на семисегментный а не на телефоне например, и пытаюсь сохранить вид того что было с теми же возможностями
а по поводу пожарных я может и идиот как уже считаете , но в разрыв питания всей этой лабуды стоит терморезистр и еще термореле если температура каким либо чудом выйдет за пределы допустимой и котел начнет кипеть то одна из двух защит точно сработает питание отключится и соответственно доступ кислорода пропадет а за ним и горение.
Огромное спасибо всем кто пытался обьяснить, цель на сегодняшний день достигнута температура на индикаторах есть
b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...
имхо, не ардуино ЗЛО, а жадность и глупость.
Не думаю что в жадности дело, для меня есть разница например в 1к рублей как в случае собраном на ардуинке и 8к рублей которые отдашь за те же радио детали только в аккуратном корпусе и алгоритм такой же, я же все таки создавал с примера ее
Ты тока на мешках для трупов не экономь, купи цветные, веселенькие, чтоб не стыдно было потом, когда тебя по телеку покажут.
имхо, не ардуино ЗЛО, а жадность и глупость.
Не думаю что в жадности дело, для меня есть разница например в 1к рублей как в случае собраном на ардуинке и 8к рублей которые отдашь за те же радио детали только в аккуратном корпусе и алгоритм такой же, я же все таки создавал с примера ее
В ответ на критику жадности и глупости сказал глупость и жадность.
вот вы смеетесь, а ведь все равно не понятно , про что прочесть какой метод по средствам чего куда обращается как ищет что сравнивает когда коментариев нет у кода как понять как работает то что бы можно было применять в условиях моей задачи, ну либо я максимально туп и не вижу очевидных вещей
"Все равно непонятно" - это когда автор текста явно не дружит ни с орфографией, ни с пунктуацией. И то, и другое люди придумали не для того, чтобы шпынять нерадивых школяров, а для того, чтобы читатель мог понять, что именно хотел сказать автор, а не гадать, где следует поставить очередной знак препинания.
Ну тут все одно к одному... Грамотность, неумение понять элементарных принципов программирования, отсутствие логики...
Именно поэтому наш ТС и ввязался в это дело - умный человек посчитал бы плюсы и минусы и купил готовое.