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

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

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

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


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


Am2321 Датчик влажности и температуры

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

1

Здраствуйте представляю мой доработанный плагиат.
Наткнулся у китаезов на датчик влажности и температуры Am2321, дешево и сердито, запустился с пол тычка, описание от производителя великолепное.
О датчики стоимость от 150 до 180 рубликов.
Датчик может как заявлено работать в 1 из 2-х режимов обмена, I2C и 1-wire.
Он маленького размера в пол раза меньше SHT , минус -будьте осторожны с ножками ломаются на раз(единственный минус)
Теперь по поводу исходников;
    i2c - прямое подключение индикатора 1602
    i2c - подключение через платку I2c интерфейса 1602

Особенности, при программировании заметил что от команд CLS и INITLCD - экран начинает блымать (неприятно очень) их отрубаешь и все ОК. С платкой интерфейся i2c намучился, но заработала, Интерфейс
датчика 1-WIRE не пробовал еще мож потом чуть погодя, и так бошка кипит целый день намучился.
Кто будет тестить прошу отписаться.

Исходник прямое подключение

' ЧИТАЙ В ИХОДНИКЕ I2C коментарии
$regfile = "m328def.dat"
$crystal = 12000000
   '
$hwstack = 64
$swstack = 10
$framesize = 24
$prog &HFF , &HFF , &HDA , &HF8

'$sim                                                        '
'*************************************************************************************************

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cls
Cursor Off

'***Am2321*************************************************************************************
   Dim Temperature As Word
   Dim Humidity As Word
   Dim I2cbuff(10) As Byte
   Dim Temp1 As Byte
   Dim Tempw1 As Word
   Dim Tempstr As String * 20

   '*************************************************************************************************
   Config Scl = Portc.5
   Config Sda = Portc.4
'*************************************************************************************************   '
Main:
      Gosub Am2321measure
      Gosub Lcddisp
   Goto Main

'*************************************************************************************************
Am2321measure:

   I2cstart
   I2cwbyte &HB8
   Waitms 500
   I2cstop
'***********************
   I2cstart
   I2cwbyte &HB8
   I2cwbyte &H03
   I2cwbyte &H00
   I2cwbyte &H04
   I2cstop
   Waitms 500
'***********************
   I2cstart
   I2cwbyte &HB9
   Waitms 500
   For Temp1 = 1 To 7
   I2crbyte I2cbuff(temp1) , Ack
   Next Temp1
   I2crbyte I2cbuff(8) , Nack
   I2cstop
'***********************
   Humidity = Makeint(i2cbuff(4) , I2cbuff(3))
   Temperature = Makeint(i2cbuff(6) , I2cbuff(5))
   Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8))
return
'**************************************************   '

Lcddisp:
   Locate 1 , 1
   Lcd Hex(i2cbuff(1)) ; Hex(i2cbuff(2)) ; " ";
   Lcd Hex(i2cbuff(3)) ; Hex(i2cbuff(4)) ; " ";
   Lcd Hex(i2cbuff(5)) ; Hex(i2cbuff(6))
     Locate 2 , 9
   If Temperature.15 = 0 Then
      Tempstr = Str(temperature)
      Lcd "+" ; Format(tempstr , "0.0") ; Chr(223) ; "C";
   Else
      Tempw1 = Temperature
      Reset Tempw1.15
      Tempstr = Str(tempw1)
      Lcd "-" ; Format(tempstr , "0.0") ; Chr(223) ; "C";
   End If
   '
   Locate 2 , 2
   Tempstr = Str(humidity)
   Lcd Format(tempstr , "0.0") ; "%"

   Return

   End

******************************************

i2c интерфейс индикатора

$regfile = "m328def.dat"                                   ' поменять на тот проц который есть у вас, 5% программа занимает место
$crystal = 12000000                                         ' кварц от балды какой под руку попался
   '
$hwstack = 64
$swstack = 10
$framesize = 24
$prog &HFF , &HFF , &HDA , &HF8                             ' чтобы фьюзы не шить, сражу прошиваются (только для 328. думаю к 168 и 8 подойдут, фьюзы установлены для работы с внешним кварцем
$lib "lcd_pcf8574_9.lib"
'$sim                                                        '
'*************************************************************************************************
Config Lcd = 16 * 2                                         'обязательно указывать индикатор, а то I2C платка работать не будет
'***Am2321*************************************************************************************

   Dim Temperature As Word
   Dim Humidity As Word
   Dim I2cbuff(10) As Byte
   Dim Temp1 As Byte
   Dim Tempw1 As Word
   Dim Tempstr As String * 20
   Dim _lcd_e As Byte
   Dim _backlight As Byte

'LCD I2C *********************************************************************************************

   Config Scl = Portc.5
   Config Sda = Portc.4
   I2cinit
   Waitms 500
  Const Pcf8574_lcd = &H4E                                 ' PCF8574 address
   ' Конфа пинов: смотреть какая платка i2c, лучше частично прозвонить,завелась с адреса 4Е, контакты адреса свободные -значит 1
    Const Pcf_rs = 0
    Const Pcf_bl = 1
    Const Pcf_e1 = 2
    Const Pcf_e2 = 3
    Const Pcf_d4 = 4
    Const Pcf_d5 = 5
    Const Pcf_d6 = 6
    Const Pcf_d7 = 7

    _lcd_e = 128                                            ' 64=E2 (3 & 4 stering) 128=E1 (1 & 2 string-для индикатора 2-х строчного) 192=E1+E2 (all 4 strings-для индикатора 4-х строчного)
    _backlight = 0
    'Config I2cdelay = 2




'*************************************************************************************************   '
Main:
     Gosub Am2321measure
     Gosub Lcddisp

   Goto Main

'*************************************************************************************************
Am2321measure:

   I2cstart
   I2cwbyte &HB8
   Waitms 500
   I2cstop
'***********************
   I2cstart
   I2cwbyte &HB8
   I2cwbyte &H03
   I2cwbyte &H00
   I2cwbyte &H04
   I2cstop
   Waitms 500
'***********************
   I2cstart
   I2cwbyte &HB9
   Waitms 500
   For Temp1 = 1 To 7
   I2crbyte I2cbuff(temp1) , Ack
   Next Temp1
   I2crbyte I2cbuff(8) , Nack
   I2cstop
'***********************
   Humidity = Makeint(i2cbuff(4) , I2cbuff(3))
   Temperature = Makeint(i2cbuff(6) , I2cbuff(5))
   Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8))
return
'**************************************************   '

Lcddisp:
   'Cls       ' не ставить -моргать будет
   'Initlcd    'не ставить -моргать будет
   Cursor Off
    Locate 1 , 1
   Lcd Hex(i2cbuff(1)) ; Hex(i2cbuff(2)) ; " ";
   Lcd Hex(i2cbuff(3)) ; Hex(i2cbuff(4)) ; " ";
   Lcd Hex(i2cbuff(5)) ; Hex(i2cbuff(6)) ; " ";
     Locate 2 , 9
   If Temperature.15 = 0 Then
      Tempstr = Str(temperature)
      Lcd "+" ; Format(tempstr , "0.0") ; Chr(223) ; "C";
   Else
      Tempw1 = Temperature
      Reset Tempw1.15
      Tempstr = Str(tempw1)
      Lcd "-" ; Format(tempstr , "0.0") ; Chr(223) ; "C";
   End If
   '
   Locate 2 , 2
   Tempstr = Str(humidity)
   Lcd Format(tempstr , "0.0") ; "%";
  Return

i2c применял платку которая щас у китаезов в распространении по форуму вариант 2

Отредактировано dmitry7020 (2015-07-29 10:19:01)

+2

2

А разве датчик не толерантен к уровням 5 вольт?

0

3

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

А разве датчик не толерантен к уровням 5 вольт?

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

    Профессионалы построили "Титаник",
    а любитель - Ковчег.


датчик работает от 3 до 5 Универсал

0

4

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

Humidity = Makeint(i2cbuff(4) , I2cbuff(3))
    Temperature = Makeint(i2cbuff(6) , I2cbuff(5))
    Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8))
returnэ************внести этот оператор


Уважаемые прошу прощения мне подсказали что я забыл вставить команду возврата Return, в исходнике исправил.
Хотя и без нее все арбойтен, но должно быть все как положено. Спасибо sasha_1973 за подсказку. к критике отношусь только положительно, век учись и все равно дураком будешь. Все знать невозможно.

0

5

Вот выкладываю доработанный вариант  снятия информации в формате single, для дальнейшего удобства расчетов, усреднений и пересчетов

Доработанный вариант

'============================================================
'=============================================================
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 4800

'''''$prog &HFF , &HFF , &HD9 , &H00                             ' fuse 8/A/L generated. Take care that the chip supports all fuse bytes.

$prog &HFF , &HFF , &HDA , &HF8                             'fuse 328/p внешний кварц generated. Take care that the chip supports all fuse bytes.

'$sim

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2

Cursor Off
Cls

'***********************************
Config Sda = Portc.4                                       
Config Scl = Portc.5
Config I2cdelay = 1 ' скорость протокола
I2cinit                                                     ''''''''''''''
Waitms 80 ' не менее 80 по доке на инициализацию протокола и2ц

Deflcdchar 2 , 32 , 4 , 14 , 14 , 29 , 29 , 31 , 14         'капелька
'-------------------------------------------------------------------------------

'******************AM2321*******************************************************
Dim I2cbuff(10) As Byte
Dim Temper As Single
Dim Humi As Single
Dim Dataw1 As Word
Dim Temp11 As Byte
Dim Tempstr1 As String * 4
'*************************************************************************************************
Do
   Gosub Am2321measure
      Cls

   Gosub Lsdisp
Loop
End

'--------------------------------------------------------------------------------------
'*************************************************************************************************
Am2321measure:

   I2cstart
   I2cwbyte &HB8
   Waitms 300
   I2cstop
'***********************
   I2cstart
   I2cwbyte &HB8
   I2cwbyte &H03
   I2cwbyte &H00
   I2cwbyte &H04
   I2cstop
   Waitms 300
'***********************
   I2cstart
   I2cwbyte &HB9
   Waitms 300
   For Temp11 = 1 To 7
   I2crbyte I2cbuff(temp11) , Ack
   Next Temp11
   I2crbyte I2cbuff(8) , Nack
   I2cstop
'*********************** исправления на будущее, чтобы можно было производить сравнения и усреднение данных
   Tempstr1 = Hex(i2cbuff(3)) + Hex(i2cbuff(4))
   Dataw1 = Hexval(tempstr1)                                ' влажность single
   Humi = Dataw1 / 10

   Tempstr1 = Hex(i2cbuff(5)) + Hex(i2cbuff(6))
   Dataw1 = Hexval(tempstr1)
   Temper = Dataw1 / 10                                     ' температура single
'**************************************************
   'Humidity = Makeint(i2cbuff(4) , I2cbuff(3))      ' старый расчет
   'Temperature = Makeint(i2cbuff(6) , I2cbuff(5))  ' старый расчет
   'Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8))            ' старый расчет
'**************************************************
Return
'**************************************************
'-------------------------------------------------------------------------------

Lsdisp:

Locate 1 , 1
   Lcd Chr(2) ; Fusing(humi , "#.#") ; "%" ;

'***********************
Locate 2 , 1

   Lcd "t=" ; Fusing(temper , "##.#" ) ; Chr(223) ; "C";
Return

Отредактировано dmitry7020 (2015-08-25 01:20:33)

+1

6

Молодчина, так держать!

0


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