Семисегментный двухразрядный индикатор

nazzik
Offline
Зарегистрирован: 05.08.2013

Всем привет! Мозгов не хватает чтобы решить проблему!

Вот схема

Вот код

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.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Все просто

data1=t/10;//десятки
data2=t%10;//единицы

 

maksim
Offline
Зарегистрирован: 12.02.2012
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);
}

 

nazzik
Offline
Зарегистрирован: 05.08.2013

Большое спасибо! Работает!

msng
Offline
Зарегистрирован: 07.06.2012

чоткий вопрос

все по существу и ответы что надо....

вот был бы такой форум))))

nazzik
Offline
Зарегистрирован: 05.08.2013

NeiroN пишет:

Все просто

data1=t/10;//десятки
data2=t%10;//единицы

 

Еще вопрос! Как быть с запятой? Мне надо обе запятых включать независимо и даже моргать ними. Через PD7 не получается.

maksim
Offline
Зарегистрирован: 12.02.2012

nazzik пишет:

Через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);
}

 

nazzik
Offline
Зарегистрирован: 05.08.2013

Здравствуйте, maksim! 

Я сделал как советовал NeiroN 

data1=t/10;//десятки
data2=t%10;//единицы

Получается что весь порт D занят работой индикаторов. И digitalWrite(7,HIGH) ничего не включает, тоесть невозможно достучаться до PD7.

maksim
Offline
Зарегистрирован: 12.02.2012

nazzik пишет:

Я сделал как советовал NeiroN 

А я по вашему как сделал? В коде #6 все ясно и прозрачно 50 и 56 строки, и к управлению точками переменные data1 и data2 не имеют никакого отношения.

nazzik
Offline
Зарегистрирован: 05.08.2013

Я свой код не менял, прото добавил...

Попробую по вашему. Спасибо!

sp34
Offline
Зарегистрирован: 05.03.2013

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 гр на дисплее вместо цифр - бурказябры скачут !

ВЕЗЕТ МНЕ НА ОТВЕТЫ - выше код который решает эту проблему !

shamsing
Offline
Зарегистрирован: 17.06.2014

да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины

b707
Offline
Зарегистрирован: 26.05.2017

shamsing пишет:

да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины

пины на сегменты считайте что никак, для управления сегментами используется полный порт, а в ардуине полный порт только один - порт D. Можно, конечно, переписать без прямой записи в порт - но это весь скетч ломать.

Пины на аноды поменять легко - строчки 22 и 23 кода

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

shamsing пишет:

да что ж везде один и тот же пример то , да как пины то подключения сменить , нет возможности занять именно эти пины

пины на сегменты считайте что никак, для управления сегментами используется полный порт, а в ардуине полный порт только один - порт 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);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

так ваш код хоть что показывает или нет

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

так ваш код хоть что показывает или нет

показывает ровно то что указано в лупе

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 мили сек и пошло заново , я не соображу как отобразить переменную в которую пиштся с сенсора показания 

b707
Offline
Зарегистрирован: 26.05.2017

shamsing пишет:

т.е. цифру 50 я вижу потому как на первом сегменте вклюючаю цифру 5, жду 10 мили секунд , выключаю первый сегмент и показываю на втором сегменте цыфру 0 жду так же 10 мили сек и пошло заново , я не соображу как отобразить переменную в которую пиштся с сенсора показания 

тогда все верно, переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц. И так быстро-быстро по кругу, иначе будет мерцать.

Лучше это делать на таймерах, иначе МК ничего другого делать не сможет

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:
тогда все верно, переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.

Пока у него скилл такой, что он для каждого значения 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;
}

 

shamsing
Offline
Зарегистрирован: 17.06.2014

DetSimen пишет:

b707 пишет:
тогда все верно, переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.

Пока у него скилл такой, что он для каждого значения 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;
}

 

вот вы смеетесь, а ведь все равно не понятно , про что прочесть какой метод по средствам чего куда обращается как ищет что сравнивает когда коментариев нет у кода как понять как работает то что бы можно было применять в условиях моей задачи, ну либо я максимально туп и не вижу очевидных вещей

Green
Offline
Зарегистрирован: 01.10.2015

"Да что тут думать!")

// 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);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

shamsing

Вы же уже научились показывать число 50?  так что сложного то?

или вот что непонятного в этой фразе?

b707 пишет:

переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.

спрашивайте - поясню

 

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

shamsing

Вы же уже научились показывать число 50?  так что сложного то?

или вот что непонятного в этой фразе?

b707 пишет:

переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.

спрашивайте - поясню

 

я к сожалению могу работать с контроллером либо по ночам в командировке , либо как сейчас когда дома и болен, по удивлениям из коментариев я видимо не понимаю очевидную вещ

у автора есть массив в котором записано в двоичном коде на какой пин включить какой выключить для получения нужного символа на индикаторе, в какой то из строк вот мне не понятной идёт ображение что при 3 нужно обратиться к ячейке массива тоже номер 3 а где такие строки как ы моем коде , что бы потугить первую цыфру и зажеч вторую и наоборот для достижения двух значного числа если не выключать по почередности то получится дублирование на обоих сегментах

    PORTD = number[t%10]; // тут в порт пишется символ первой цыфры двухзначного числа т.е. соответствующая ячейка из массива
    if (point_1) PORTD &= ~(1<<7); // а вот это не понятная строка 
    PORTB |= (1<<1); // и эта тоже

 

shamsing
Offline
Зарегистрирован: 17.06.2014

Green пишет:

"Да что тут думать!")

// 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% рабочий код, но не фига не понятный

b707
Offline
Зарегистрирован: 26.05.2017

shamsing. вы видно настолько не понимаете, что даже спросить толком не можете. Не понял, в чем у вас затык.

Давайте по порядку

Возьмем число 35

- как получить из него первую цифру "3" и вторую"5" - знаете?
- как вывести в первый сегмент "3" - есть проблемы?
- потом выключам первый сегмент, включаем второй - все понятно?
- выводим во второй сегмент "5" - даже не спрашиваю - точно так же как в первый цифру три!

ЭТО ВСЕ!!

 

Код в первом сообщении к вашей задаче отношения не имеет. Если хотите - потом сидите и разбирайтесь, ищите в учебнике незнакомые слова. Но сейчас себе голову забивать не стоит.

v258
Offline
Зарегистрирован: 25.05.2020

У вас есть двузначное десятичное число, например 52. Вам нужно вывести его на индикатор. Как выводить цифры по отдельности вы уже знаете. Осталось понять, как получить отдельно первую и вторую цифры для вывода. Это просто.

52 / 10 = 5 - это первая цифра, получается делением числа на 10

52 % 10 = 2 - это вторая цифра, остаток числа после деления на 10

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

 

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

shamsing. вы видно настолько не понимаете, что даже спросить толком не можете. Не понял, в чем у вас затык.

Давайте по порядку

Возьмем число 35

- как получить из него первую цифру "3" и вторую"5" - знаете?
- как вывести в первый сегмент "3" - есть проблемы?
- потом выключам первый сегмент, включаем второй - все понятно?
- выводим во второй сегмент "5" - даже не спрашиваю - точно так же как в первый цифру три!

ЭТО ВСЕ!!

 

Код в первом сообщении к вашей задаче отношения не имеет. Если хотите - потом сидите и разбирайтесь, ищите в учебнике незнакомые слова. Но сейчас себе голову забивать не стоит.

верно я не мог догадаться как выразить вопрос, зболел короной и вообще все тяжко но когда если не сейчас это делать когда я рядом с котлом могу находиться для которого переделываю автоматику сломавшуюся, а топить уже нужно 
"- как получить из него первую цифру "3" и вторую"5" - знаете?" 

с помощью оператора % (modulo)  (35%10) получаю вторую цифру "5"

с помощью оператора / (division) (35/10) получу первую цифру "3"

а вот что у меня не вяжется так как вызвать функцию под названием f3(); а затем когда цифра изменится например на 4 должна вызваться f4();

затык что с чем сравнивать 

Komandir
Offline
Зарегистрирован: 18.08.2018

...пла'чу ...

v258
Offline
Зарегистрирован: 25.05.2020

shamsing пишет:

а вот что у меня не вяжется так как вызвать функцию под названием f3(); а затем когда цифра изменится например на 4 должна вызваться f4();

затык что с чем сравнивать 

http://arduino.ru/Reference/SwitchCase

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

мои прогнозы сбываюцца.

b707
Offline
Зарегистрирован: 26.05.2017

shamsing пишет:

 когда если не сейчас это делать когда я рядом с котлом могу находиться для которого переделываю автоматику сломавшуюся, а топить уже нужно

если б вы сразу написали, что вы переделываете автоматику для котла - я бы сразу послал вас нах и не связывался

shamsing
Offline
Зарегистрирован: 17.06.2014

DetSimen пишет:

b707 пишет:
тогда все верно, переменную показываете точно так же - сначала 10мсек цифру десятков, потом переключаетесь и 10мсек цифру единиц.

Пока у него скилл такой, что он для каждого значения 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);
}

 

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

shamsing пишет:

 когда если не сейчас это делать когда я рядом с котлом могу находиться для которого переделываю автоматику сломавшуюся, а топить уже нужно

если б вы сразу написали, что вы переделываете автоматику для котла - я бы сразу послал вас нах и не связывался

не расскажете почему так сурово?

b707
Offline
Зарегистрирован: 26.05.2017

shamsing пишет:

не расскажете почему так сурово?

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

Если вы с поясненниеми трех человек так и не поняли, как напечатать на экране двухзначное число - представляю сколько ошибок вы нагородили в самой программе управления.

 

Komandir
Offline
Зарегистрирован: 18.08.2018

b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...

имхо, не ардуино ЗЛО, а жадность и глупость.

 

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

shamsing пишет:

не расскажете почему так сурово?

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

Если вы с поясненниеми трех человек так и не поняли, как напечатать на экране двухзначное число - представляю сколько ошибок вы нагородили в самой программе управления.

 

не поспорю что ошибок думаю много, код можно думаю сократить  наверное на 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 раз дешевле так она еще и удобнее и имеет возможность дальше ее улучшить, правда редко появляется время это делать, а вот знакомому нужно отапливать дом, а делать в точности как у меня не удобно, т.к. привык смотреть на семисегментный а не на телефоне например, и пытаюсь сохранить вид того что было с теми же возможностями
а по поводу пожарных я может и идиот как уже считаете , но в разрыв питания всей этой лабуды стоит терморезистр и еще термореле если температура каким либо чудом выйдет за пределы допустимой и котел начнет кипеть то одна из двух защит точно сработает питание отключится и соответственно доступ кислорода пропадет а за ним и горение.

Огромное спасибо всем кто пытался обьяснить, цель на сегодняшний день достигнута температура на индикаторах есть

shamsing
Offline
Зарегистрирован: 17.06.2014

b707 пишет:

Komandir пишет:

b707 Arduino ЗЛО - пожарные без работы не останутся тьфу тьфу тьфу ...

имхо, не ардуино ЗЛО, а жадность и глупость.

 

Не думаю что в жадности дело, для меня есть разница например в 1к рублей как в случае собраном на ардуинке и 8к рублей которые отдашь за те же радио детали только в аккуратном корпусе и алгоритм такой же, я же все таки создавал с примера ее

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ты тока на мешках для трупов не экономь, купи цветные, веселенькие, чтоб не стыдно было потом, когда тебя по телеку покажут. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

shamsing пишет:

b707 пишет:

имхо, не ардуино ЗЛО, а жадность и глупость.

Не думаю что в жадности дело, для меня есть разница например в 1к рублей как в случае собраном на ардуинке и 8к рублей которые отдашь за те же радио детали только в аккуратном корпусе и алгоритм такой же, я же все таки создавал с примера ее

В ответ на критику жадности и глупости сказал глупость и жадность.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

shamsing пишет:

вот вы смеетесь, а ведь все равно не понятно , про что прочесть какой метод по средствам чего куда обращается как ищет что сравнивает когда коментариев нет у кода как понять как работает то что бы можно было применять в условиях моей задачи, ну либо я максимально туп и не вижу очевидных вещей

"Все равно непонятно" - это когда автор текста явно не дружит ни с орфографией, ни с пунктуацией. И то, и другое люди придумали не для того, чтобы шпынять нерадивых школяров, а для того, чтобы читатель мог понять, что именно хотел сказать автор, а не гадать, где следует поставить очередной знак препинания.

b707
Offline
Зарегистрирован: 26.05.2017

Ну тут все одно к одному... Грамотность, неумение понять элементарных принципов программирования, отсутствие логики...
Именно поэтому наш ТС и ввязался в это дело - умный человек посчитал бы плюсы и минусы и купил готовое.