Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $regfile = "m8def.dat" 'Мега8
- $crystal = 10000000 '10МГц
- 'конфігурація підключення дисплею до портів мікроконтроллера
- Config Lcd = 16 * 2
- Config Lcdpin = Pin , Rs = Portd.6 , E = Portd.5 , Db4 = Portb.1 , Db5 = Portb.0 , Db6 = Portb.2 , Db7 = Portd.7
- Cursor Off
- Cls
- 'малюємо нестандартний символ
- Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32 'знак градуса
- 'Конфігурація датчику вологості
- 'об*явлення підпрограми
- Declare Sub Get_th(t As Byte , H As Byte)
- Config Serialin = Buffered , Size = 128
- Config Serialout = Buffered , Size = 128
- 'підключення датчика до PortC.2
- Dht_put Alias Portc.2
- Dht_get Alias Pinc.2
- Dht_io_set Alias Ddrc.2
- Dim T As Byte 'поточна температура
- Dim H As Byte 'поточна вологість
- Dim Crc As Byte 'зімнна для зберігання байту парності
- Dim Mybyte As Byte
- Dim Sensor_data As String * 40 'сюди будуть записуватись дані що відправляються датчиком
- Dim Tmp_str8 As String * 8
- Dim Count As Byte 'зімнна для підрахунку прийнтяих біт
- Set Dht_io_set
- Set Dht_put
- '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- 'кінець налаштування датчика
- ' настройка інших периферійних приладів
- Config Portc.4 = Output 'вихід релє вентилятора
- Rele1 Alias Portc.4 'підключення релє вентилятора
- Config Portc.3 = Output 'світлодіод робочого стану
- Led Alias Portc.3
- Config Portd.0 = Output 'світлодіод помилки та іншої індикації
- Ledred Alias Portd.0
- Config Portd.1 = Output 'підсвітка дисплею
- Backlight Alias Portd.1
- Config Timer1 = Timer , Prescale = 1024
- On Timer1 Overflow:
- Stop Timer1
- 'налаштування зовнішніх переивань
- Config Int0 = Falling
- Config Int1 = Falling
- Config Portd.4 = Input 'підключення другого виходу енкодеру
- On Int0 Button 'переривання від кнопки енкодера
- On Int1 Encod 'переривання від повроту енкодера
- 'переменная для организации меню
- Dim A As Byte
- 'переменные для зберігання значений волгості і температури
- Dim Hum_eeprom As Eram Byte 'значення межі волгості в еепром
- Dim Temp_eeprom As Eram Byte 'значення межі температури в еепром
- Dim Temp As Byte 'межа температури в оперативній пам*яті
- Dim Hum As Byte 'межа волгості в оперативній пам*яті
- Dim Tdispl As Byte 'температура на екрані налаштувань
- Dim Hdispl As Byte 'вологість на екрані налаштувань
- Dim Tsave As Byte 'температура для запису в еепром
- Dim Hsave As Byte 'вологість для записи в еепром
- Dim Error As Byte 'флаг помилки зчитування з датчика
- Hum = Hum_eeprom 'отримання вологості з пам*яті
- Temp = Temp_eeprom 'отримання температури з пам*яті
- Dim Flag1 As Bit 'флаг стану першого релє
- Dim Ttemp As Byte 'тимчасова змінна для зберігання температури
- Dim Htemp As Byte 'тимчасова змінна для зберігання волгості
- Cls
- Backlight = 1 'вмикаємо підсвітку дисплею
- ' тест всіх світлодідів
- Led = 1
- Ledred = 1
- Waitms 20
- Led = 0
- Ledred = 0
- Waitms 60
- Led = 1
- Ledred = 1
- Waitms 20
- Led = 0
- Ledred = 0
- 'тестування та вивід інформації під час запуску
- '#####################################################################################
- Rem ТЕСТ ВЕНТИЛЯЦИИ
- Lcd "TECT BEHTҐ§±бҐҐ"
- Rele1 = 1
- Wait 2
- Rele1 = 0
- Waitms 200
- Cls
- Cls
- Rem Установленная
- Rem температура:
- Lcd "©cїaЅoі»eЅЅaЗ"
- Lowerline
- Lcd "їeјѕepaїypa:"
- Locate 2 , 14
- Lcd Temp ; Chr(0) ; "C"
- Wait 2
- Cls
- Rem Установленная
- Rem вологість:
- Lcd "©cїaЅoі»eЅЅaЗ"
- Lowerline
- Lcd "і»a¶ЅocїД:"
- Locate 2 , 12
- Lcd Hum ; "%"
- Wait 2
- Cls
- '#####################################################################################
- 'кінець тестової інформації
- ' моргання світлодіолів
- Led = 1
- Ledred = 1
- Waitms 20
- Led = 0
- Ledred = 0
- Waitms 60
- Led = 1
- Ledred = 1
- Waitms 20
- Led = 0
- Ledred = 0
- 'дозволяємо переивання
- Enable Interrupts
- Enable Int0
- Enable Int1
- Enable Timer1
- 'Головний цикл
- '================================================================================================
- Backlight = 0 'вимикаємо підсвітку
- Do
- Disable Interrupts
- Call Get_th(t , H) 'отримуємо дані про температуру і вологість
- Gosub Compare 'порівнюємо з заданими межами та вмикаємо навантаження
- Enable Interrupts
- If A = 0 Then 'виводимо на дисплей інформацію
- Cls
- If H = 111 Then 'перевірка показів датчику, якщо вони не вірні то виводимо помилку
- Ledred = 1
- Lcd "Sensor"
- Lowerline
- Lcd "not respond"
- Elseif H = 222 Then
- Ledred = 1
- Lcd "Sensor"
- Lowerline
- Lcd "is incorrect"
- Elseif H = 123 Then
- Ledred = 1
- Lcd "CRC error"
- Lowerline
- Lcd "sensor is broken"
- Else
- Ledred = 0
- Lcd "Temp: " ; T ; "C"
- Lowerline
- Lcd "Hmdt: " ; H ; "%"
- Led = 1
- Waitms 10
- Led = 0
- Wait 3
- End If
- Wait 1
- End If
- If A = 1 Then
- Timer1 = 0
- Do
- Cls
- 'межа Т
- Lcd "Ёopoґ T"
- Lowerline
- Lcd Tdispl ; Chr(0) ; "C"
- Waitms 400
- Loop Until A <> 1
- End If
- If A = 2 Then
- Timer1 = 0
- Do
- Cls
- 'межа H
- Lcd "Ёopoґ H"
- Lowerline
- Lcd Hdispl ; "%"
- Waitms 400
- Loop Until A <> 2
- End If
- Loop
- 'робота з датчиком DHT11 / 22
- '**************************************************************************************************
- Sub Get_th(t As Byte , H As Byte)
- Count = 0
- Sensor_data = ""
- Set Dht_io_set 'встановлюємо PD.6 в якості виходу
- Reset Dht_put 'притискаємо шину до землі
- Waitms 25 'очікування не менше 18мс
- Set Dht_put 'відпускаємо шину
- Waitus 40
- Reset Dht_io_set 'встановлюємо PD.6 в якості виходу
- Waitus 40 'чекаємоо 40 мкс
- If Dht_get = 1 Then 'якщо на порті досі 1
- Error = 1 'означає, зо датчик не відповів
- H = 111
- Exit Sub 'виходимо з підпрограми
- End If
- 'якщо датчик відповів і прижав шину до землі продовжуємо роботу
- Waitus 80 'чекаємо еще 80 мкс
- If Dht_get = 0 Then 'якщо на линии по прежнему 0
- Error = 2 'значит датчик сошел з ума
- H = 222
- Exit Sub 'выходим из підпрограми
- End If
- 'якщо все нормально і датчик відповів правильно, тогда продовжуємо
- While Dht_get = 1 : Wend 'чекаємо поки на шині з*явиться 1
- Do 'починаємо приймати 40 біт даних
- While Dht_get = 0 : Wend 'чекаємо появи на шині 0
- Waitus 30 'після появи 0 чекаємо 30мкс
- If Dht_get = 1 Then 'якщо на шині 1
- Sensor_data = Sensor_data + "1" 'записуємо в змінну цю одиницю
- While Dht_get = 1 : Wend 'і чекаємо поки датчик відправить наступний біт
- Else 'інакше, якщо там був 0
- Sensor_data = Sensor_data + "0" 'записуємо цей 0 в змінну
- End If
- Incr Count 'збільшуємо лічильник на 1
- Loop Until Count = 40 'повторємо поки лічильник не досягне 40
- Set Dht_io_set
- Set Dht_put
- 'починаємо сортувати отримані дані
- Tmp_str8 = Left(sensor_data , 8) 'беремо 8 символів зміної
- H = Binval(tmp_str8) 'це ціла частина волгості
- Tmp_str8 = Mid(sensor_data , 17 , 8) 'беремо 8 символів з середини
- T = Binval(tmp_str8) 'це ціла частина температури
- Tmp_str8 = Right(sensor_data , 8) 'праві 8 символів
- Crc = Binval(tmp_str8) 'перевірочні дані
- 'перевірка контрольної суми
- Mybyte = T + H 'складаємо значення температури і волгості
- If Mybyte <> Crc Then 'якщо контрольна сума не зійшлась
- Error = 3 'значит отримані дані не вірні
- H = 123
- End If
- End Sub 'повертаємось в головний цикл програми
- 'переривання по переповненню таймера
- '**************************************************************************************************
- Overflow:
- Stop Timer1 'зупиняємо і скидаємо таймер
- Timer1 = 0
- A = 0 'обнуляемо змінну
- Backlight = 0 'вимикаємо підсвітку
- Return
- 'ввімкнення/вимкнення навантаження
- '**************************************************************************************************
- Compare: 'порівнюємо значення і вмик./вимикаємо навантаження
- If H = 111 Or H = 222 Or H = 123 Then 'якщо покази некоректні вимикаємо навантаження і виходимо з підпрограми
- Rele1 = 0
- Goto Extcompare
- End If
- If Flag1 = 0 Then 'якщо реле не включено
- If T >= Temp Then 'якщо температура підвищилась вище встановленої
- Rele1 = 1 'вмикаємо вентиляцію
- Flag1 = 1 'ставимо флаг
- End If
- End If
- If Flag1 = 1 Then 'якщо релє включене
- Ttemp = Temp + 1 'гістерезис температури 1 градус
- If T < Ttemp Then 'знизилась
- Rele1 = 0 'вимикаємо навантаження
- Flag1 = 0 'і скидаємо флаг
- End If
- End If
- 'то же самое для волгості
- If Flag1 = 0 Then
- If H > Hum Then 'якщо вологість перевишила встановлене значення
- Rele1 = 1 'вмикаємо вентиляцію
- Flag1 = 1
- End If
- End If
- If Flag1 = 1 Then
- Htemp = Hum - 1
- If H =< Htemp Then
- Rele1 = 0
- Flag1 = 0
- End If
- End If
- Extcompare:
- Return
- 'обробка переривань енкодера
- '**************************************************************************************************
- Encod:
- Backlight = 1 'вмикаємо підсвітку дисплея
- Stop Timer1
- Timer1 = 0
- Start Timer1
- If A > 0 Then
- Waitms 2 'чекаємо поки затихне дрижджання контактів
- If Pind.3 = 0 Then
- If Pind.4 = 0 Then 'якщо на ніжці 1 (немає імпульсу)
- If A = 1 Then
- Incr Tdispl
- If Tdispl > 100 Then
- Tdispl = 100
- End If
- End If
- If A = 2 Then
- Incr Hdispl
- If Hdispl > 100 Then
- Hdispl = 100
- End If
- End If
- Else
- If A = 1 Then
- Decr Tdispl
- If Tdispl > 200 Then
- Tdispl = 0
- End If
- End If
- If A = 2 Then
- Decr Hdispl
- If Hdispl > 200 Then
- Hdispl = 0
- End If
- End If
- End If
- End If
- Gifr = 128 'скидаємо регістр зберігання переривання INT1
- End If
- Return
- Button: 'натискання кнопки
- Timer1 = 0 'скидання таймеру
- Start Timer1 'запуск таймеру
- Backlight = 1 'увімкнули підсвітку дисплею
- 'magic, no comments
- If A = 2 Then
- A = 0
- 'тут організована перевірка зміни даних та їх запис в EPROM
- If Tdispl <> Temp Then
- Temp = Tdispl
- Temp_eeprom = Temp
- Cls
- 'Темп записана
- Lcd "Teјѕ. ·aѕёcaЅa"
- Ledred = 1
- Waitms 50
- Ledred = 0
- Wait 1
- End If
- If Hdispl <> Hum Then
- Hum = Hdispl
- Hum_eeprom = Hum
- Cls
- 'Влаж записана
- Lcd "B»a¶. ·aѕёcaЅa"
- Ledred = 1
- Waitms 50
- Ledred = 0
- Wait 1
- End If
- Waitms 30
- Gifr = 64
- Sound , Portb.3 , 600 , 500
- Goto Argh 'переходимо в кінець підпрограми, щоб пропустити всі інші умови
- End If
- Sound , Portb.3 , 200 , 500
- If A = 1 Then
- A = 2
- Hdispl = Hum
- End If
- If A = 0 Then
- A = 1
- Tdispl = Temp
- End If
- Argh:
- Ledred = 1
- Waitms 30
- Ledred = 0
- Waitms 50 'очікування затихання дрижджання
- Gifr = 64 'скидання флага наступного переривання
- Return
- End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement