Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Терморегулятор инкубатора с доп. каналом и поворотом яиц.


Терморегулятор инкубатора с доп. каналом и поворотом яиц.

Сообщений 61 страница 87 из 87

1

Делюсь разработанным терморегулятором для инкубатора. Принцип - релейный - достигла заданная температура - нагрузка щелкает раз в пол секунды вкл/выкл. Полезла температура выше - нагрузка отключилась, упала ниже заданной - нагрузка включилась. Чтобы нагрузка не щелкала достаточно закомментировать строку "If Viv_peremennaya(1) = Booton(1) And Portc.1 = 1 Then : Reset Portc.1 : Elseif Viv_peremennaya(1) = Booton(1) And Portc.1 = 0 Then : Set Portc.1 : End If  "
Отдельно сделан канал для поворота яиц. Яйца переворачиваются двигателем в течении 15 секунд (эти секунды жестко заданы в программе и кнопками не регулируются) через заданный интервал времени.
Всего 4 кнопки - две задают температуру и две интервал времени между переворотами яиц.
Индикаторы отображают десятые градуса. При отрицательных температурах появляется знак минус. При температуре ниже чем 9,9 градуса десятые не отображаются. Например -9,9 а ниже -10. Обновление температур обоих индикаторов проходит меньше чем за секунду.
Разработка не претендует на научный прорыв, но зато можно посмотреть как организовано измерение, старался избежать ошибок во время измерений, поэтому добавлена проверка CRC от DS18B20 и каждый датчик подключен к своей лапе МК. Для повышения надежности задействован сторожевой таймер.

После включения устройства оно сразу начинает работать. Необходимо кнопками задать температуру и интервал времени. Данные хранятся в EEPROM.
Первый канал отображает температуру на индикаторе и выполняет регулирование температуры. Второй канал для визуального контроля. Он просто показывает температуру.
Fuse биты не помню.

Код:
'Автор Авраменко Павел.
'e-mail p-a-h-a@yandex.ru
'youtube http://www.youtube.com/c/Happinesstoom
$regfile = "m8def.dat"                                      ' говорим компилятору что у нас микропроцессор Atmega 8
$crystal = 8000000                                          ' говорим компилятору что процессор тактируется от генератора с частотой 8, 000 000 мегагерц
Ddrb = &B00111111 : Ddrd = &B11111111 : Ddrc = &B00000011 : Portc = &B11111101
Dim W As Byte , I As Byte , Chislo(6) As Integer , Viv_peremennaya(2) As Integer , Temp_print(2) As Integer , Booton(2) As Integer , Settemp(2) As Eram Integer , Dp(2) As Byte , Секунды As Integer , Минуты As Integer , Время_задержки As Integer , Время_задержки_епром As Eram Integer
Dim Temp As Integer , Температура As Single , Готовая_температура_str As String * 10 , Ответ_датчика_ds18b20(9) As Byte At Temp Overlay , Ошибка_измерения As Bit , Номер_пина As Byte , Округление As Integer
Declare Sub Приостановить_таймер0
Config Watchdog = 2048 : Start Watchdog                     ' конфигурация сторожевого таймера
Config 1wire = Portb.6 : Config 1wire = Portb.7             'порт, куда садим ногами два датчика типа ds18b20 ПО ДВУХПРОВОДНОЙ СХЕМЕ. ЦЕНТРАЛЬНЫЙ СЮДА С ПОДТЯЖКОЙ 1 КОМ НА +, А ДВА КРАЙНИХ СОЕДИНИТЬ ВМЕСТЕ И НА МИНУС
Config Timer0 = Timer , Prescale = 64 : On Timer0 Pulse :   ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer2 = Timer , Prescale = 1024 : On Timer2 Bootons :       ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Timer , Prescale = 256 : On Timer1 Отсчет_времени
Enable Timer0 : Enable Timer1 : Enable Timer2 : Enable Interrupts
Chislo(6) = 0 : Chislo(5) = 16 : Chislo(4) = 16 : Chislo(3) = 12 : Chislo(2) = 15 : Chislo(1) = 10       ' приветствие HELLO
If Settemp(1) < 1000 Or Settemp(1) > 0 Then : Booton(1) = Settemp(1) : Else : Settemp(1) = 375 : Booton(1) = Settemp(1) : End If       ' проверка данных eeprom
If Время_задержки_епром < 1000 Or Время_задержки_епром > 0 Then : Время_задержки = Время_задержки_епром : Booton(2) = Время_задержки : Else : Время_задержки = 180 : Время_задержки_епром = 180 : Booton(2) = Время_задержки : End If       ' проверка данных eeprom
'======================основной цикл программы==================================
 Do
  Reset Watchdog
  For Номер_пина = 6 To 7
    Gosub Запуск_измерения
    Reset Watchdog
  Next
  Waitms 750                                                ' И ждём, пока померяется
  For Номер_пина = 6 To 7
    Gosub Опрос_ds18b20
    If Ошибка_измерения = 0 Then : Viv_peremennaya(номер_пина - 5) = Температура : Set Dp(1) : Set Dp(2) : Gosub Vicisleniya : End If : Ошибка_измерения = 0       ' Если измерение без ошибок то идем на подпрограмму разбития температуры на сегменты
    Reset Watchdog                                          ' сброс сторожевого таймера
    If Viv_peremennaya(1) > Booton(1) Then Reset Portc.1 : If Viv_peremennaya(1) < Booton(1) Then Set Portc.1
    If Viv_peremennaya(1) = Booton(1) And Portc.1 = 1 Then : Reset Portc.1 : Elseif Viv_peremennaya(1) = Booton(1) And Portc.1 = 0 Then : Set Portc.1 : End If
    If Минуты >= Время_задержки Then : Reset Portc.0 : Секунды = 0 : Минуты = 0 : End If : If Секунды >= 15 Then Set Portc.0       ' управление поворотом яиц
  Next
 Loop
End
'===============================================================================
Запуск_измерения:
 Stop Timer0 : Reset Portb.w
    1wreset Pinb , Номер_пина : Приостановить_таймер0       ' Занимаем шину 1Ware
    1wwrite &HCC , 1 , Pinb , Номер_пина : Приостановить_таймер0       ' Обращение ко всем датчикам
    1wwrite &H44 , 1 , Pinb , Номер_пина                    ' Запуск измерения всех датчиков
Set Portb.w : Start Timer0
Return
'===============================================================================
Опрос_ds18b20:
Stop Timer0 : Reset Portb.w
    1wreset Pinb , Номер_пина : Приостановить_таймер0       ' Занимаем шину 1Ware
    1wwrite &HCC , 1 , Pinb , Номер_пина : Приостановить_таймер0       ' Адресное обращение к Ds18b20
    1wwrite &HBE , 1 , Pinb , Номер_пина : Приостановить_таймер0       ' Команда чтения ОЗУ датчика
    Ответ_датчика_ds18b20(1) = 1wread(9 , Pinb , Номер_пина)       ' Принимаем 8 байт данных + 1 байт контрольной суммы которые кладутся в переменную Temp
Set Portb.w : Start Timer0
    If Err = 0 Then                                         ' Если получили ответ датчика
         If Ответ_датчика_ds18b20(9) = Crc8(ответ_датчика_ds18b20(1) , 8) Then : Температура = Temp : Shift Температура , Right , 4 : Температура = Температура * 10 : Else : Set Ошибка_измерения : End If       ' Проверяем контрольную сумму полученных данных ' Получаем сырые данные с Ds18b20 ' Получаем готовое значение температуры с знаком
    Else : Set Ошибка_измерения : End If                    ' если датчик не откликнулся ставим метку ошибки
Return
'===============================================================================
Vicisleniya:                                                ' разбиваем трехзначную температуру на два числа
 For I = 1 To 2
 Temp_print(i) = Abs(viv_peremennaya(i))                    ' берем модуль температуры для отображения положительного значения. Минус подставим позже
 If Viv_peremennaya(i) < 0 And Temp_print(i) >= 100 Then : Округление = Temp_print(i) Mod 10 : Temp_print(i) = Temp_print(i) / 10 : If Округление > 4 Then Incr Temp_print(i) : Reset Dp(i) : End If       'Округление при минус 10 и выше и убирание последнего разряда
 Next
 Stop Timer0 : Reset Portb.w
 For I = 3 To 1 Step -1
  Chislo(i + 3) = Temp_print(2) Mod 10                      ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
     Temp_print(2) = Temp_print(2) / 10                     ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
  Chislo(i) = Temp_print(1) Mod 10                          ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
     Temp_print(1) = Temp_print(1) / 10                     ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
 Next
 If Viv_peremennaya(1) = 1000 Then : For I = 1 To 3 : Chislo(i) = 10 : Next : Elseif Viv_peremennaya(2) = 1001 Then : For I = 4 To 6 : Chislo(i) = 10 : Next : End If       ' гасим три символа в случае когда переменная равна метке 1000 или 1001
 If Chislo(1) = 0 Then Chislo(1) = 10 : If Chislo(4) = 0 Then Chislo(4) = 10       ' УБИРАЕМ НОЛИ ПЕРЕД ЧИСЛОМ ЧТОБ БЫЛО НЕ 02,1 А 2,1
 If Viv_peremennaya(1) < 0 Then Chislo(1) = 11 : If Viv_peremennaya(2) < 0 Then Chislo(4) = 11       ' СТАВИМ МИНУС В НАЧАЛЕ, ЕСЛИ ТЕМПЕРАТУРА ОТРИДЦАТЕЛЬНАЯ
 Set Portb.w : Start Timer0
Return
'===============================================================================
Sub Приостановить_таймер0:
Set Portb.w : Start Timer0 : Waitms 50 : Stop Timer0        ' гасим семисегментник, останавливаем таймер и через 50 мсек все включаем
End Sub
'===============================================================================
Pulse:                                                      ' подпрограмма прерываний таймера0 для работы с семисегментником
   Reset Portb.w                                            ' трогаем порты только с 0 по 5
   Incr W : If W > 5 Then W = 0                             ' При каждом срабатывании таймера выбираем какой сегмент будем показывать от 0,1,2,3
   Portd = Lookup(chislo(w + 1) , Chisla)                   'таблица DTA начинает считатся с первой ячейки. А поскольку значение времени может быть 0 то прибавляем единицу. Х сейчас равен 1 поэтому берем масив Х+1 т.е cifri(2). Выше мы считали что Cifri(2) = _min / 10 и это = 5 а поскольку тут мы прибавили 1 то берем шестой элемент таблицы DTA который выведет на семисегментник цифру 5. (когда дойдем до часов и нужно будет отобразить 0 (Cifri(4) = _hour / 10) то выберется элемент таблицы с порядковым номером 0+1=1 т.е первый элемент &HEF.
   Set Portb.w                                              'поскольку индикатор у меня подключен с общим минусом то выше мы его погасили подав на все общие провода плюс ( логическую единицу в строкеPortb = &HFF) теперь мы зажигаем сегмент с порядковым номером Х который сейчас равен 1
   If W = 1 And Dp(1) = 1 Then Reset Portd.2
   If W = 4 And Dp(2) = 1 Then Reset Portd.2
Return
'===============================================================================
Chisla:
 '     0     1     2     3    4    5    6    7    8    9   10""  11-   12E  13r  14o   15H  16L
 Data 20 , 215 , 140 , 133 , 71 , 37 , 36 , 151 , 4 , 5 , 255 , 239 , 44 , 238 , 228 , 70 , 124

'A Alias Portd.6 : B Alias Portd.5 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.7 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
'Dig1 Alias Portb.5 : Dig2 Alias Portb.4 : Dig3 Alias Portb.3 : Dig4 Alias Portb.2 : Dig5 Alias Portb.1 : Dig6 Alias Portb.0       ' тут вписываем порты к которым подключены общие провода каждой цифры
'===============================================================================
Отсчет_времени:
Timer1 = 34797                                              ' корекция для того чтоб таймер работал раз в секунду или 34285
Incr Секунды : If Секунды = 60 Then : Incr Минуты : Секунды = 0 : End If
Return
'===============================================================================
Bootons:
Enable Interrupts
Stop Timer1
Debounce Pinc.2 , 0 , Temperatura1 , Sub
Debounce Pinc.3 , 0 , Temperatura2 , Sub
Debounce Pinc.4 , 0 , Время1 , Sub
Debounce Pinc.5 , 0 , Время2 , Sub
Start Timer1
Return
'===============================================================================
Temperatura1:
Do
Set Dp(1) : Reset Dp(2)
If Booton(1) < 1 Then Booton(1) = 1
Decr Booton(1)
Viv_peremennaya(1) = Booton(1)
Viv_peremennaya(2) = 1001
Gosub Vicisleniya
Waitms 100
Reset Watchdog
Loop Until Pinc.2 = 1
Start Timer1
Wait 1
Reset Watchdog
Settemp(1) = Booton(1)
Settemp(2) = Booton(2)
Return
'===============================================================================
Temperatura2:
Do
Set Dp(1) : Reset Dp(2)
Incr Booton(1) : If Booton(1) > 999 Then Booton(1) = 999
Viv_peremennaya(1) = Booton(1)
Viv_peremennaya(2) = 1001
Gosub Vicisleniya
Waitms 100
Reset Watchdog
Loop Until Pinc.3 = 1
Start Timer1
Wait 1
Reset Watchdog
Settemp(1) = Booton(1)
Return
'===============================================================================
Время1:
Do
Reset Dp(2) : Reset Dp(1)
If Booton(2) < 1 Then Booton(2) = 1
Decr Booton(2)
Viv_peremennaya(1) = 1000
Viv_peremennaya(2) = Booton(2)
Gosub Vicisleniya
Waitms 100
Reset Watchdog
Loop Until Pinc.4 = 1
Start Timer1
Wait 1
Reset Watchdog
Время_задержки = Booton(2)
Время_задержки_епром = Время_задержки
Return
'===============================================================================
Время2:
Reset Dp(2) : Reset Dp(1)
Do
Incr Booton(2) : If Booton(2) > 999 Then Booton(2) = 999
Viv_peremennaya(1) = 1000
Viv_peremennaya(2) = Booton(2)
Gosub Vicisleniya
Waitms 100
Reset Watchdog
Loop Until Pinc.5 = 1
Start Timer1
Wait 1
Reset Watchdog
Время_задержки = Booton(2)
Время_задержки_епром = Время_задержки
Return
'===============================================================================

http://s6.uploads.ru/t/d1Tzp.jpg

Отредактировано Pasha (2016-11-22 01:13:44)

+1

61

-NMi-
Павлиний хвост не мешает?

0

62

Сергей999 написал(а):

Павлиний хвост не мешает?

А тебе галстук пионера-попрошайки не "жмёт"  :crazyfun:     :D     :rofl:

0

63

Сергей999, Вы не туда код вставили. Переход к подпрограмме

Povorot_lotka_na_sebya

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

Opros_knopok

.

0

64

Вот это

-NMi- написал(а):

Мой "курятник" коммерческий и даже если я скину .hex файл   ---- ничего хорошего не будет, ибо.......
1 - бутлоадер с криптой
2 - привязка к "серийнику" процессора (да, да, не смейтесь, есть там "типАсерийник" в AVR )
3 - серийник в EEPROM
4 - если и прошьёте - через час работы вывалит ошибку серийного номера и отключит ВСЁ!

и вот это

-NMi- написал(а):

Здесь где-то был мой "курятник" и с поворотом и с увлажнялкой и даже с графиком по дням и температурам.

что-то между собой не согласуютя. Так зачем давали ссылку на ваш "курятник" если он такой суперсекретный и в hex?
Если хотите "толкать" свой товар , то тут есть раздел продам/куплю - там и пишите. А тут вопросы касающие открытого исходника... Поэтому если можете помочь-помогите, если нет-не морочьте людям голову своими супер-мупер секретами

Отредактировано Niya (2018-12-22 23:27:39)

0

65

Andrusha

Все правильно , в основное время, час,  код работает, он не работает именно во время поворота лотков,
Может попробовать вставить и в поворот лотков от себя.

0

66

Сергей999 написал(а):

Может попробовать вставить и в поворот лотков от себя.

А вы туда не ставили?

0

67

Niya

Да он так и работает 60 сек вкл/выкл постоянно, автор написал что этого достаточно.
Как есть;
когда идет цикл, имитируем отсутствие воды, код работает, ТЭН не греет, пищит и горит светодиод.
Когда начинается поворот лотка ТЭН включается/откл если совпало его время, поворот завершился, код работает дальше, не греет , пищит, светится с/д.

Только в кусок поворота на себя, может по этому раз сработает, другой нет.
Попробую напишу.

Отредактировано Сергей999 (2018-12-23 00:56:21)

0

68

Сергей999 написал(а):

этому раз сработает, другой нет.

если это кода там нет , то конечно он и не будет там работать ) ...я то подумал, что вы к поворотам "от себя" и "к себе " вставили кусочек кода...допишите должен заработать

0

69

Сергей999, Вы хотите, чтобы уровень воды контролировался постоянно, или только во время поворота лотков? Лотки поворачиваются 18 дней, а потом нет. Значит и контроля уровня не будет.

0

70

Andrusha написал(а):

поворачиваются 18 дней, а потом нет.

Так часть кода , который контролирует уровень воды есть в теле программы и в поворотах лотков (если Сергей999 добавил )- значит уровень будет контролироваться все время

0

71

Если есть в теле программы, зачем добавлять в п/п поворота лотков?

0

72

Andrusha написал(а):

Если есть в теле программы, зачем добавлять в п/п поворота лотков?

Потому, что код написан так. При поворотах уходит на эти подпрограммы и крутится там около 3 минут. Если более 3 , то идентифицииуется как ошибка и происходит выход из подпрограммы .

0

73

Добавил код в оба поворота, все сработало, теперь тэн увлажнения почти под контролем, огромная благодарность за помощь.
Почему почти, код со строки 233-237 все равно не подвластен, на секунду срабатывает и затем тухнет, ну это не критично и не вредит работе.
Знак % что в этих строках работает исправно, там флаг тэна он срабатывает, а затем наш код тушит тэн, я так понял работу .

0

74

Добрый день всем!!!
Благодарю всех за отзывчивость, надвигаются праздники , грузит вас не буду , перехожу к печатке , и тестированию в большем объеме, неприятные моменты есть , пока не знаю какие еще проявятся, все после тестирования в разных ситуациях, наверное в исправном состоянии всех исполнительных эта система работает хорошо, но вот одно вылезло опять, при поломке поворота лотков выскакивает ПРОБЛЕМА Н2 и она стоит 30 минут, и в это время нет возможности вмешаться и запустить систему в рабочий режим,  затем программа опять запускается, но в эти пол часа, ни одно исполнительное не работает, кроме пищалки, согласен можно выключить все,  но поддержание температуры нельзя отключать, температура должна поддерживаться при любых авариях, за исключение конечно датчика температуры, тут никуда не денешься, надо выключать все. Пока не все протестировал.
Всех с надвигающимися, приятно встретить и провести.   :whistle:

Отредактировано Сергей999 (2018-12-24 14:24:29)

0

75

Сергей999 написал(а):

выскакивает ПРОБЛЕМА Н2 и она стоит 30 минут, и в это время нет возможности вмешаться и запустить систему в рабочий режим

Это время прописано в коде

Код:
Error_datchik:
   Incr Time_error_w
   If Time_error_w > 1800 Then
      Time_error_w = 0
      Goto Start_prg               ' ожидание реакции персонала 30 минут
   End If

А как Вы хотите вмешаться?

0

76

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

Отредактировано Сергей999 (2018-12-24 17:27:29)

0

77

Вот здесь

Код:
Error_datchik:
   Incr Time_error_w
   If Time_error_w > 1800 Then
      Time_error_w = 0
      Goto Start_prg               ' ожидание реакции персонала 30 минут
   End If

   Gosub Init_cls

   If Problema = 1 Or Problema = 2 Then Lcd Chr(2) ; "OTOK C" ; Chr(2) ; "OMAH"       ' Лоток сломан
   If Problema = 3 Or Problema = 4 Then Lcd "HET TEPMOMETPA!"
   If Problema = 6 Then Lcd "TEM" ; Chr(6) ; ". < 35C"       ' Темп. < 35c
   If Problema = 38 Then Lcd "TEM" ; Chr(6) ; ". > 38.5c "       ' Темп. > 38c

   Lowerline
   Lcd Chr(6) ; "PO" ; Chr(1) ; Chr(2) ; "EMA H" ; Problema       ' Проблемa #

   Ventilator = 0
   Nagrevatel = 0
   Napravlenie_povorota = 0
   Pitanie_motor_povorota = 0
   Ten_uvlazhnitel = 0

   Sound Sounder , 750 , 110
   Reset Watchdog : Waitms 500
   Sound Sounder , 600 , 150
   Reset Watchdog : Waitms 200


Если строки     Ventilator = 0
                         Nagrevatel = 0
                         Ten_uvlazhnitel = 0

закоментировать, их регулировка останется работоспособной?

0

78

Сергей999 написал(а):

там ниже по коду  отключение всех устройств при проблеме.

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

0

79

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

0

80

Сергей999 написал(а):

Если строки     Ventilator = 0
                         Nagrevatel = 0
                         Ten_uvlazhnitel = 0

закоментировать, их регулировка останется работоспособной?

По идее да, но нужно смотреть код. Если, к примеру, был включен нагреватель  Nagrevatel = 1, произошла поломка, стала выполняться подпрограмма Error_datchik. А переменная Nagrevatel так и осталась = 1. Значит нагрев продолжится. А в этой подпрограмме мы крутимся 30 минут.

0

81

Andrusha написал(а):

Значит нагрев продолжится. А в этой подпрограмме мы крутимся 30 минут.

Да уж...    :crazyfun:

0

82

Можно ввести переменную  Vrema_ozhidainiya_personala и выставить ее в зависимости от кода ошибки. Сделать Time_error_w > Vrema_ozhidainiya_personala. Получится, что при поломках лотков программа будет ожидать не 30 минут , а выставленное вами время.  При остальных ошибках – некуда , поломки серьзные.
В начале ввести новые переменные:

Код:
Dim Flag_error_datchik As Boolean
Dim Vrema_ozhidainiya_personala As Word 


и в подпрограмме ошибок датчиков:

Код:
Error_datchik:
   If Flag_error_datchik = 0 Then                           'Если входим в эту подпрог. 1-ый раз
      If Problema = 1 Or Problema = 2 Then                  'Если проблема в лотках
         Vrema_ozhidainiya_personala = 120                  'выставим t ожидания 2 минуты(или выбрать сколько надо)
      Else
         Vrema_ozhidainiya_personala = 1800                 'иначе t ожидания 30 минут
      End If
      Flag_error_datchik = 1                                'чтобы больше не заходить в эту часть кода(иначе каждый раз 
     End If                                                          '  врем будет сбрасываться в исходное значение)


   Incr Time_error_w
   If Time_error_w > Vrema_ozhidainiya_personala Then       ' ожидание реакции перс. в зависомости от № ошибки
      Time_error_w = 0
      Flag_error_datchik = 0                                'чтобы заново выставить время  в зависимости от № ошибки
      Goto Start_prg
   End If
Код:
If Problema = 1 Or Problema = 2    Then           'если проблема в лотках 
      Ventilator = 1                                             
      Nagrevatel = 1
      Napravlenie_povorota = 0                          'выключаем только моторы поворотров     
      Pitanie_motor_povorota = 0
      Ten_uvlazhnitel = 1
   Else                                                             ' иначе выключаем все
      Ventilator = 0
      Nagrevatel = 0
      Napravlenie_povorota = 0
      Pitanie_motor_povorota = 0
      Ten_uvlazhnitel = 0
   End If

Соответственно температура в инкубаторе  будет контролироваться каждые Vrema_ozhidainiya_personala(при поломке лотков) .Вам придется учесть градиент температуры, чтобы не сварить яйца ). Можно вообще  ждать по минимуму: вывел сообщение,  попищал и пошел дальше выполнять..

Отредактировано Niya (2018-12-26 09:53:09)

+1

83

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

0

84

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

Код:
   If Time_error_w > 1800 OR Knopka = 0 Then
      Time_error_w = 0
      Goto Start_prg    ' ожидание реакции персонала 30 минут
      End If

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

0

85

Niya
Благодарю , опять выручили.
Вот так это работает , белые - нагрев и увлажнитель,
                                     красные - поворот и реверс,
                                     синий -  вентилятор,
                                     желтый -  пищалка,
                                     зеленый -  авария уровня воды.
авария лотков

0

86

Если все работает, то все отлично :cool:  :flag:

0

87

Andrusha написал(а):

Goto Start_prg ' ожидание реакции персонала 30 минут
End If

Уж очень "очковАстое" решение. Возможны "глюки" не сразу, а через некоторое время. Так шо...  :flag:

0


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Терморегулятор инкубатора с доп. каналом и поворотом яиц.