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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Сканирование пультов ДУ


Сканирование пультов ДУ

Сообщений 1 страница 5 из 5

1

Добрый день всем.

Не нашел, куда разместить свое сообщение, поэтому написал в главную ветку. Просьба к админам, переместить сообщение в необходимое место.

Теперь к вопросу, который хотел осветить. Началось все с просьбы начальника реализовать удаленное управление кондиционером DAIKIN. Принял указания к действию и начал поиски. Все вроде просто казалось - обычный ИК пульт ДУ, собрал макетку с приемником TL1838 38КГц, взял готовую программку для RC-5 и ....ничего не получилось. Начал поиски. Нашел https://led-displays.ru/ir/daikin_irremote.html и https://www.sites.google.com/a/cdmt.vn/ … -protocol. Изумился сложности протокола, но делать нечего - начал программить. В итоге получилось прочитать коды с пульта. Решил поделиться, может кому пригодится.

Пульт такой - ARC466A9
Впереди теперь создание передатчика  - имитатора этого пульта

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000                                         ' used crystal frequency
$baud = 115200                                              ' use baud rate

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Ddrd.2 = 0
Portd.2 = 1
Ddrb.0 = 1
Portb.0 = 0

Config Timer1 = Timer , Prescale = 256
Stop Timer1
Timer1 = 0

Config Int0 = Falling
On Int0 _rx_kod Nosave
Enable Int0

Enable Interrupts

Dim Firstt As Byte
Dim Startc As Byte
Dim Newc As Byte
Dim I As Byte
Dim A As Byte
Dim Paket1(8) As Byte                                       'Double
Dim Paket2(8) As Byte
Dim Paket3(19) As Byte
Dim Paket_id As Byte
Dim Priznak As Byte
Dim _temp As Byte

Print "Waiting for RC5..."

Do                                                          'основной цикл
If Priznak = 1 Then                                         'вывод сообщения в порт
    Priznak = 0
         For A = 8 To 1 Step -1
          Print Hex(paket1(a));
         Next A
         Print " ";
         For A = 8 To 1 Step -1
          Print Hex(paket2(a));
         Next A
         Print " ";
         For A = 19 To 1 Step -1
          Print Hex(paket3(a));
         Next A
         Print
End If

Loop

$asm
_rx_kod:
$end Asm
  If Startc = 0 Then                                        'первое прерывание
     Newc = 0                                               'флаг новой команды
     Startc = 1
     Firstt = 0                                             'начали принимать
     Start Timer1                                           'старт Т1
  Else                                                      '
     If Tcnt1 > 1595 And Tcnt1 < 1615 Then                  'ищем начало пакета
         Tcnt1 = 0                                          'если нашли
         For A = 1 To 8                                     'обнуляем массивы для сообщений
          Paket1(a) = 0
         Next A
         For A = 1 To 8
          Paket2(a) = 0
         Next A
         For A = 1 To 19
          Paket3(a) = 0
         Next A
         Paket_id = 1                                       'устанавливаем номер сообщения в !
         Newc = 1
     End If

     If Tcnt1 > 2215 And Tcnt1 < 2235 Then                  'ищем паузу между сообщениями
         Tcnt1 = 0
         Paket_id = Paket_id + 1                            'если нашли, то увеличиваем номер сообщения
     End If

     If Tcnt1 > 320 And Tcnt1 < 330 Then                    'ищем паузу перед каждым сообщением
         If Newc = 1 Then
         Tcnt1 = 0
         I = 8                                              'устанавливаем счетчик байт в сообщении 1 и 2
         A = 0                                              'устанавливаем счетчик бит в каждом байте
         If Paket_id = 3 Then I = 19                        'устанавливаем счетчик байт в сообщении 3
         Config Int0 = Rising
         End If
      End If

      If Tcnt1 > 103 And Tcnt1 < 114 Then                   'ищем "единицу" в потоке бит
         If I > 0 Then
         Tcnt1 = 0
         Set _temp.a                                        'пишем в байт
         A = A + 1
         If A > 7 Then
          Select Case Paket_id
            Case 1 : Paket1(i) = _temp                      'пишем байт в требуемое сообщение
            Case 2 : Paket2(i) = _temp
            Case 3 : Paket3(i) = _temp
          End Select
          _temp = 0
          I = I - 1
          A = 0
         End If
         If I = 0 Then
            Config Int0 = Falling
            If Paket_id = 3 Then Firstt = 1
         End If
         End If
      End If

      If Tcnt1 > 50 And Tcnt1 < 60 Then       'ищем "единицу" в потоке бит
         If I > 0 Then
         Tcnt1 = 0
         Reset _temp.a      'пишем в байт
         A = A + 1
         If A > 7 Then
          Select Case Paket_id                    'пишем байт в требуемое сообщение
            Case 1 : Paket1(i) = _temp
            Case 2 : Paket2(i) = _temp
            Case 3 : Paket3(i) = _temp
          End Select
          _temp = 0
          I = I - 1
          A = 0
         End If
         If I = 0 Then
            Config Int0 = Falling
            If Paket_id = 3 Then Firstt = 1
         End If
         End If
      End If

      If Firstt = 1 Then                                    'если приняли все биты всех сообщений в пакете
         Stop Timer1
         Priznak = 1
         Waitms 300
         Eimsk.int0 = 1
         'Toggle Portb.0
         Paket_id = 0
         Startc = 0
      End If
  Tcnt1 = 0
  End If
$asm
reti
$end Asm

End

Отредактировано kara1126 (2021-11-13 15:31:01)

0

2

я несколько раз выкладывал код. Использую его в своих протоколах связи и приёме сигналов как ИК, так и радио.
Я не заморачивался над протоколом, главное принять и отличить одну кнопку от другой.
вот нашел код конвертера (т.е., приёмник и передатчик)

Код:
$regfile = "attiny13a.dat"
$crystal = 9600000                                          ' для Димки
' Принимаем команды ИК пульта DRE, преобразуем и выдаём как OPENBOX-S1

$hwstack = 8
$swstack = 8
$framesize = 16


Ir_receiver Alias Pinb.1                                    ' Подключение ИК-приёмника   #6
' По включению ноги МК = Входы

Ir_out Alias Portb.0                                        ' Выход  #5

Dim Temp As Byte , Tiki As Byte , Temp2 As Byte , Temp3 As Byte
Dim Data_1 As Byte , Data_2 As Byte , Data_3 As Byte , Data_4 As Byte


Start_prg:

   Config Ir_out = Input                                    ' Схема с ОК

   Waitms 100

   Bitwait Ir_receiver , Set                                ' Ждём сигнал = 1...
   Bitwait Ir_receiver , Reset                              ' Ждём сигнал = 0...

Aa:
   Temp = 245                                               ' Ждём _длинную_ паузу в сигнале >7500 us!
Ab:
   If Ir_receiver = 1 Then Goto Aa

   Gosub Waitus_30                                          ' Пауза

   Decr Temp : If Temp > 1 Then Goto Ab

Bb:
   Temp = 100                                               ' Ждём _длинный  сигнал
Bc:
   If Ir_receiver = 0 Then Goto Bb

   Gosub Waitus_30                                          ' Пауза
   Decr Temp : If Temp > 1 Then Goto Bc

   Bitwait Ir_receiver , Reset                              ' Ждем завершения сигнала


   Gosub Rx_ir : Data_1 = Data_4
   Gosub Rx_ir : Data_2 = Data_4
   Gosub Rx_ir : Data_3 = Data_4
   Gosub Rx_ir                                              ' Data_4


   If Data_1 = 0 Then                                       ' Если это пульт DRE
      Temp = 255 - Data_4

      If Temp = Data_3 Then                                 ' Если CRC сошлась, то:

       '-  КОНВЕРТЕР DRE >> Openbox-S1
         Data_1 = 16 : Data_2 = 111                         ' маркер пульта Openbox-S1

         Select Case Data_3
            Case 136 : Data_3 = 172                         ' Ch +
            Case 168 : Data_3 = 156                         ' Ch -
            Case 8 : Data_3 = 52                            ' Ch +2
            Case 240 : Data_3 = 244                         ' Ch -2

            Case 40 : Data_3 = 28                           ' Vol +
            Case 72 : Data_3 = 108                          ' Vol -
            Case 248 : Data_3 = 116                         ' Vol +2
            Case 2 : Data_3 = 12                            ' Vol -2

            Case 200 : Data_3 = 236                         ' OK
            Case 104 : Data_3 = 188                         ' Exit
            Case 0 : Data_3 = 132                           '  On\Off
            Case 24 : Data_3 = 68                           '  MUTE

            Case 192 : Data_3 = 196                         ' 1
            Case 32 : Data_3 = 36                           ' 2
            Case 160 : Data_3 = 164                         ' 3
            Case 96 : Data_3 = 100                          ' 4
            Case 224 : Data_3 = 228                         ' 5
            Case 16 : Data_3 = 20                           ' 6
            Case 144 : Data_3 = 148                         ' 7
            Case 80 : Data_3 = 84                           ' 8
            Case 208 : Data_3 = 212                         ' 9
            Case 48 : Data_3 = 180                          ' 0

            Case 130 : Data_3 = 220                         '  Back
            Case 176 : Data_3 = 4                           '  TV\Radio
   '      Case 216 : Data_3 = 124   '  EPG
   '      Case 56 : Data_3 = 60     '  i
         End Select

         Data_4 = 255 - Data_3                              ' CRC
      End If
   End If

 '= Передаем преамбулу ==========
   Config Ir_out = Output                                   ' Чтобы смочь управлять схемой ОК
   Ir_out = 0
   Waitus 8500
   Ir_out = 1                                               ' ____/----\____
   Waitus 4250
   Ir_out = 0
   Gosub Waitus_560


   Gosub Send_byte                                          ' data_1
   Data_1 = Data_2 : Gosub Send_byte                        ' data_2
   Data_1 = Data_3 : Gosub Send_byte                        ' data_3
   Data_1 = Data_4 : Gosub Send_byte                        ' data_4

   Goto Start_prg



'===========================================================
' ===============    ПРИЕМ КОМАНД ИК-ПУЛЬТА   ===================
Rx_ir:

   For Temp3 = 7 To 0 Step -1
      Tiki = 0
      Shift Data_4 , Left , 1

      Bitwait Ir_receiver , Set                             ' Ждём сигнал = 1...
      Waitus 300                                            ' пауза на часть импульса

      While Ir_receiver = 1
         Incr Tiki : Gosub Waitus_30
      Wend

      If Tiki > 30 Then Data_4 = Data_4 Or 1                'длинный -> бит =1

      Bitwait Ir_receiver , Reset                           ' Ждем завершения сигнала
   Next Temp3
Return


' ''===============    ПЕРЕДАЧА КОМАНД   ===================
Send_byte:

   For Temp2 = 7 To 0 Step -1
      Ir_out = 1
      Gosub Waitus_560

      If Data_1.temp2 = 1 Then Waitus 1080

      Ir_out = 0
      Gosub Waitus_560
   Next

Return



Waitus_560:
   Waitus 520
Return


Waitus_30:
   Waitus 30
Return

0

3

Александр Д. написал(а):

я несколько раз выкладывал код. Использую его в своих протоколах связи и приёме сигналов как ИК, так и радио.
Я не заморачивался над протоколом, главное принять и отличить одну кнопку от другой.
вот нашел код конвертера (т.е., приёмник и передатчик)
Код:

Код:
$regfile = "attiny13a.dat"
$crystal = 9600000                                          ' для Димки
' Принимаем команды ИК пульта DRE, преобразуем и выдаём как OPENBOX-S1

$hwstack = 8
$swstack = 8
$framesize = 16


Ir_receiver Alias Pinb.1                                    ' Подключение ИК-приёмника   #6
' По включению ноги МК = Входы

Ir_out Alias Portb.0                                        ' Выход  #5

Dim Temp As Byte , Tiki As Byte , Temp2 As Byte , Temp3 As Byte
Dim Data_1 As Byte , Data_2 As Byte , Data_3 As Byte , Data_4 As Byte


Start_prg:

   Config Ir_out = Input                                    ' Схема с ОК

   Waitms 100

   Bitwait Ir_receiver , Set                                ' Ждём сигнал = 1...
   Bitwait Ir_receiver , Reset                              ' Ждём сигнал = 0...

Aa:
   Temp = 245                                               ' Ждём _длинную_ паузу в сигнале >7500 us!
Ab:
   If Ir_receiver = 1 Then Goto Aa

   Gosub Waitus_30                                          ' Пауза

   Decr Temp : If Temp > 1 Then Goto Ab

Bb:
   Temp = 100                                               ' Ждём _длинный  сигнал
Bc:
   If Ir_receiver = 0 Then Goto Bb

   Gosub Waitus_30                                          ' Пауза
   Decr Temp : If Temp > 1 Then Goto Bc

   Bitwait Ir_receiver , Reset                              ' Ждем завершения сигнала


   Gosub Rx_ir : Data_1 = Data_4
   Gosub Rx_ir : Data_2 = Data_4
   Gosub Rx_ir : Data_3 = Data_4
   Gosub Rx_ir                                              ' Data_4


   If Data_1 = 0 Then                                       ' Если это пульт DRE
      Temp = 255 - Data_4

      If Temp = Data_3 Then                                 ' Если CRC сошлась, то:

       '-  КОНВЕРТЕР DRE >> Openbox-S1
         Data_1 = 16 : Data_2 = 111                         ' маркер пульта Openbox-S1

         Select Case Data_3
            Case 136 : Data_3 = 172                         ' Ch +
            Case 168 : Data_3 = 156                         ' Ch -
            Case 8 : Data_3 = 52                            ' Ch +2
            Case 240 : Data_3 = 244                         ' Ch -2

            Case 40 : Data_3 = 28                           ' Vol +
            Case 72 : Data_3 = 108                          ' Vol -
            Case 248 : Data_3 = 116                         ' Vol +2
            Case 2 : Data_3 = 12                            ' Vol -2

            Case 200 : Data_3 = 236                         ' OK
            Case 104 : Data_3 = 188                         ' Exit
            Case 0 : Data_3 = 132                           '  On\Off
            Case 24 : Data_3 = 68                           '  MUTE

            Case 192 : Data_3 = 196                         ' 1
            Case 32 : Data_3 = 36                           ' 2
            Case 160 : Data_3 = 164                         ' 3
            Case 96 : Data_3 = 100                          ' 4
            Case 224 : Data_3 = 228                         ' 5
            Case 16 : Data_3 = 20                           ' 6
            Case 144 : Data_3 = 148                         ' 7
            Case 80 : Data_3 = 84                           ' 8
            Case 208 : Data_3 = 212                         ' 9
            Case 48 : Data_3 = 180                          ' 0

            Case 130 : Data_3 = 220                         '  Back
            Case 176 : Data_3 = 4                           '  TV\Radio
   '      Case 216 : Data_3 = 124   '  EPG
   '      Case 56 : Data_3 = 60     '  i
         End Select

         Data_4 = 255 - Data_3                              ' CRC
      End If
   End If

 '= Передаем преамбулу ==========
   Config Ir_out = Output                                   ' Чтобы смочь управлять схемой ОК
   Ir_out = 0
   Waitus 8500
   Ir_out = 1                                               ' ____/----\____
   Waitus 4250
   Ir_out = 0
   Gosub Waitus_560


   Gosub Send_byte                                          ' data_1
   Data_1 = Data_2 : Gosub Send_byte                        ' data_2
   Data_1 = Data_3 : Gosub Send_byte                        ' data_3
   Data_1 = Data_4 : Gosub Send_byte                        ' data_4

   Goto Start_prg



'===========================================================
' ===============    ПРИЕМ КОМАНД ИК-ПУЛЬТА   ===================
Rx_ir:

   For Temp3 = 7 To 0 Step -1
      Tiki = 0
      Shift Data_4 , Left , 1

      Bitwait Ir_receiver , Set                             ' Ждём сигнал = 1...
      Waitus 300                                            ' пауза на часть импульса

      While Ir_receiver = 1
         Incr Tiki : Gosub Waitus_30
      Wend

      If Tiki > 30 Then Data_4 = Data_4 Or 1                'длинный -> бит =1

      Bitwait Ir_receiver , Reset                           ' Ждем завершения сигнала
   Next Temp3
Return


' ''===============    ПЕРЕДАЧА КОМАНД   ===================
Send_byte:

   For Temp2 = 7 To 0 Step -1
      Ir_out = 1
      Gosub Waitus_560

      If Data_1.temp2 = 1 Then Waitus 1080

      Ir_out = 0
      Gosub Waitus_560
   Next

Return



Waitus_560:
   Waitus 520
Return


Waitus_30:
   Waitus 30
Return

Подпись автора

    У нас законы сродни астрологическим прогнозам: постоянно печатаются, но не работают, а вера в них считается признаком крайней наивности.

Ваш код для стандартного RC-5? Или можно любой код сканировать?

Все дело в том, что код DAIKIN далек по своей структуре от стандартного RC-5

Отредактировано kara1126 (2021-11-13 16:23:32)

0

4

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

вот на его основе радиотермометр считывается:

Код:
$regfile = "m8adef.dat"
$crystal = 4000000
$hwstack = 64                                               '
$swstack = 64                                               '
$framesize = 64

Open "comd.7:19200,8,n,1" For Output As #1                  '


Dim Temp , Temp_2 , Mode_work As Byte
Dim T_dat_w As Word
Dim Temper$ , Str_temp$ As String * 5
Temp = Mcusr : Mcusr = 0                                    ' Считаем регистр, чтобы узнать причину RESET


Dim Rx_radio , Tiki , F_rx , Komanda As Byte
Dim Data_1 , Data_2 , Data_3 , Data_4 , Data_4 , Data_5 As Byte       ' Принятые данные
Dim Rcu_d1 , Rcu_d2 , Rcu_d4 As Byte                        ' Адрес радио-пульта

In_radio Alias Pinc.5 : Config Portc.5 = Input
Speaker Alias Portd.6 : Config Speaker = Output

'Config Watchdog = 2048 : Start Watchdog

Print #1 , "Start!"
'Print Version(3) ; ", " ; Version(1)


'********************************************************
Do
'  Reset Watchdog
  Waitus 50

  If In_radio = 0 Then
    Temp = 0
   ' Примем стартовый импульс (0)
    While In_radio = 0                                      ' спад (1900-2050uS)
      Incr Temp : Waitus 20
    Wend
    If Temp >= 70 And Temp < 99 Then
'      Print #1 , Temp
      Gosub Opros_radio                                     ' Опрос радио пульта
      If Data_1 <> 0 Or Data_2 <> 0 Or Data_4 <> 0 Then
      '  Print #1 , Data_1 ; " " ; Data_2 ; " " ; Data_3 ; " " ; Data_4 ; " " ; Data_5
      '  Print #1 , "b: " ; Bin(data_1) ; " " ; Bin(data_2) ; " " ; Bin(data_3) ; " " ; Bin(data_4) ; " " ; Bin(data_5)
        Print #1 , "Adr: " ; Data_1 ; ", " ; Data_2 ; ", " ; Data_3
        T_dat_w = Makeint(data_4 , Data_5)
        T_dat_w = T_dat_w - 400
        Temper$ = Str(t_dat_w)
        Str_temp$ = Right(temper$ , 1)
        Temp = Len(temper$)
        Temp = Temp - 1
        Temper$ = Left(temper$ , Temp)
        Temper$ = Temper$ + "." + Str_temp$
        'Print #1 , "T=" ; T_dat_w ;
        Print #1 , "t=" ; Temper$ ; "'C"
      End If
    End If
  End If



Loop





'=====================================================================
Opros_radio:                                                ' Опрос радио
  Data_1 = 0 : Data_2 = 0 : Data_4 = 0 : Data_5 = 0

  Gosub Rx_r_data : Data_1 = Rx_radio                       ' примем 8 бит
  Gosub Rx_r_data : Data_2 = Rx_radio                       ' примем 8 бит
  Gosub Rx_r_data : Data_3 = Rx_radio                       ' примем 8 бит
  Gosub Rx_r_data : Data_4 = Rx_radio                       ' примем 8 бит
  Gosub Rx_r_data : Data_5 = Rx_radio                       ' примем 8 бит

' If Data_1 <> 0 Then
' Print " D: " ; Data_1 ; " " ; Data_2 ; " " ; Data_3 ; " " ; Data_4 ; " " ; Data_5
'  Print #1 , "b: " ; Bin(data_1) ; " " ; Bin(data_2) ; " " ; Bin(data_3) ; " " ; Bin(data_4) ; " " ; Bin(data_5)
' End If

Return                                                      ' 0 0101_1111 0011_1100 0100_1000 1110_1010 1100_000 0

 '================= П Р И Ё М   Д А Н Н Ы Х ==================
Rx_r_data:
  'Reset Watchdog
  Rx_radio = 0

  For Temp = 0 To 7
'  For Temp = 7 To 0 Step -1
    Tiki = 0
    While In_radio = 1 : Wend                               ' Ждём спад  \_
    ' начало сигнала _/
    While In_radio = 0                                      '  и измерим длительность нуля
      Incr Tiki : Waitus 20
      If Tiki = 255 Then Exit While
    Wend
    If Tiki >= 140 And Tiki < 195 Then Rx_radio.temp = 1    ' > 3500 uS = "1"
  Next
Return

а вот мой радиотермометр: опрос ds18b20 и выдача в эфир:

Код:
$regfile = "ATtiny13a.DAT"                                  '
$crystal = 1200000
'$crystal = 600000
$hwstack = 8
$swstack = 8
$framesize = 8

$noramclear

Dim Begunok , Gradusy , Znak_minus , 1wire_dat(9) , Tx , Povtor , Temp As Byte

Const T_minus = 1 : Const T_plus = 0
Const Vkl = 1 : Const Otkl = 0

Stop Ac : Disable Adc : Disable Timer0 : Disable Watchdog

Led Alias Portb.2 : Config Led = Output
Knopka Alias Pinb.1 : Config Portb.1 = Input : Portb.1 = 1  ' кнопка
Tx_out Alias Portb.3 : Config Tx_out = Output
'Pitanie_ds18b20 Alias Portb.3 : Config Pitanie_ds18b20 = Output

Samo_pitanie Alias Portb.0 : Config Samo_pitanie = Output

Config 1wire = Portb.4                                      ' на эту ножку подключим DS18B20


'If Knopka = 0 Then
'  Begunok = 0
  Led = 1
  Waitms 50
  Led = 0
'End If


Start_prg:

'  While Knopka = 0
'    Begunok = 0
'    Led = Vkl
'    Waitms 250
'    Led = Otkl
'    Waitms 100
'  Wend



  If Begunok = 0 Then
    'Pitanie_ds18b20 = Vkl

    Led = Vkl
    ' Инициализация датчика ds18b20
    1wreset                                                 ' Инициализация шины 1Wire
    1wwrite &HCC                                            ' Выдаем команду чтения ПЗУ
    1wwrite &H4E                                            ' Установим разрядность термодатчика
    1wwrite 0
    1wwrite 0
    1wwrite &H1F                                            ' Configuration Register 9-BIT Mode 0.5°           94 mS

     ' Запуск измерения температуры
    1wreset                                                 ' Инициализация шины 1Wire
    1wwrite &HCC                                            ' Выдаем команду чтения ПЗУ
    1wwrite &H44                                            ' Запуск измерения

    Led = Otkl
    Begunok = 1

    Config Watchdog = 128
    Goto Spim                                               ' Время 128mS, а надо бы 94mS на процедуру измерения Т, но...
  End If

  If Begunok = 1 Then
    'Pitanie_ds18b20 = Vkl
    ' Чтение температуры. Так как у нас включен watchdog, то через 128mS
    1wreset                                                 ' Инициализация шины 1Wire
    1wwrite &HCC
    1wwrite &HBE                                            ' Команда чтения ОЗУ датчика
    1wire_dat(1) = 1wread(9)                                ' Принимаем данные
    'Pitanie_ds18b20 = Otkl
    Config Portb.4 = Input : Portb.4 = 0

  ' Обработка принятых данных
    Znak_minus = T_plus
    If 1wire_dat(2) >= 248 Then                             ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
      1wire_dat(1) = &HFF - 1wire_dat(1)
      1wire_dat(2) = &HFF - 1wire_dat(2)                    ' Если температура отрицательная – вычитаем из &HFF
      Znak_minus = T_minus                                  ' признак "температура отрицательная"
    End If

    Shift 1wire_dat(1) , Right , 4
    Gradusy = 1wire_dat(1)                                  ' Сдвигаем нулевой байт вправо на 4 бита
    Shift 1wire_dat(2) , Left , 4
    Temp = 1wire_dat(2)                                     ' Сдвигаем первый байт влево на 4 бита
    Gradusy = Gradusy + Temp                                ' Формируем результат

    If Znak_minus = T_minus Then
      Gradusy.7 = 1                                         ' признак "температура отрицательная"
    End If

    'Open "comb.2:1200,8,n,1" For Output As #1
    'Print #1 , Gradusy

    For Povtor = 0 To 2
      'Led = 1
      Tx_out = 1 : Waitus 450 : Tx_out = 0 : Waitus 1150    ' Стартовый бит

      Tx = 84 : Gosub Tx_data                               ' T
      Tx = 117 : Gosub Tx_data                              ' u
      Tx = Gradusy : Gosub Tx_data                          ' прямой, Температура
      Tx = 255 - Gradusy : Gosub Tx_data                    ' и инверсный
      'Led = 0
      Waitms 13
    Next

  End If

  Incr Begunok
  If Begunok >= 8 Then
    Begunok = 0                                             ' Примерно раз в минуту
    Goto Start_prg
  End If

  'Pitanie_ds18b20 = Otkl
  Config Watchdog = 8192

Spim:
  Start Watchdog
'  Config Int0 = Falling
'  Enable Int0
  Enable Interrupts
  Config Powermode = Powerdown                              ' Засыпаем для экономии батарейки
  End


' =========== П Е Р Е Д А Ч А    Д А Н Н Ы Х ============
Tx_data:

  For Temp = 7 To 0 Step -1
    Tx_out = 1
    If Tx.temp = 1 Then
      Waitus 1200
      Tx_out = 0 : Waitus 400
    Else
      Waitus 450
      Tx_out = 0 : Waitus 1150
    End If
  Next

Return

Отредактировано Александр Д. (2021-11-13 19:09:16)

0

5

Александр Д. написал(а):

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

Отредактировано Александр Д. (Сегодня 00:09:16)

Подпись автора

    У нас законы сродни астрологическим прогнозам: постоянно печатаются, но не работают, а вера в них считается признаком крайней наивности.

Попробую Ваши коды доработать для DAIKIN.

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Сканирование пультов ДУ