AHT10 SICAKLIK NEM

Başlatan Dtmf, 28 Ocak 2024, 20:31:58

Dtmf

iyi aksamlar değerli arkadaşlar Aht10 sensör modülü ile uğraşmaktayım.sıcaklık ve nem verilerini hesaplayamadım.birde gelen veriler bana biraz kararsız gibi ğeldi.Datashet çok eksik kalmış bu konuda yardımcı olurmusunuz.
'****************************************************************
'*  Name    : AHT10 SICAKLIK NEM SENSOR.BAS                     *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2024 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.01.2024                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device=16F877A
Xtal=20
All_Digital TRUE
TRISA=0:PORTA=0
TRISB=0:PORTB=0
TRISC=0:PORTC=0
TRISD=0:PORTD=0
TRISE=0:PORTE=0
Declare LCD_Lines 4
Declare LCD_Interface 4
Declare LCD_DTPin PORTB.0
Declare LCD_RSPin PORTB.5
Declare LCD_ENPin PORTB.6

Symbol SCL PORTC.6
Symbol SDA PORTC.7

Dim SICAK1 As Byte
Dim SICAK2 As Byte
Dim NEM1 As Byte
Dim NEM2 As Byte
Dim NEM3 As Byte
Dim DURUM As Byte

I2COut SDA,SCL,$70,[$80,$BA] ;SOFT RESET
DelayMS 20
I2COut SDA,SCL,$70,[$E1,$AC];BASLA
DelayMS 350
Cls
;=========================
BASLA:
I2COut SDA,SCL,$70,[$AC,$33,$00];OLCUM VERILERINI TETIKLE (YAZ=70)
DelayMS 70
I2CIn SDA,SCL,$71,[DURUM,NEM1,NEM2,NEM3,SICAK1,SICAK2];SICAKLIK VE NEM VERILERINI OKU 6BYTLIK VERI ALINIYOR  (OKU=71)

If DURUM.7=0 Then Print At 1,18,"." ; DURUM BITI KONTROL EDILIYOR 1=MESGUL 0=OLCUM TAMAM
Print At 1,1," AHT10 SICAK NEM "
Print At 2,1,"DR",Bin DURUM
Print At 3,1,"N1:",Dec NEM1," N2:",Dec NEM2," N3:",Dec NEM3
Print At 4,1,"S1:",Dec SICAK1," S2:",Dec SICAK2
DelayMS 200
Print At 2,1,"                    "
Print At 3,1,"                    "
Print At 4,1,"                    "

GoTo BASLA


ete

Epeyce araştırdım ama bir türlü doğru dürüst bir açıklama bulamadım.
PDF zaten son derece yetersiz. Neredeyse bilgi vermek istememişler gibi hazırlanmış.
Bu kadar eksik bilgi ile bu iş çözülmez.

Sıcaklık hesabında T=(St/1.048.576)*200-50 formülünde St değeri nasıl bulunacak hiç bir şekilde bulamadım. Normalde sensörden 16 bitlik bir sayı okunuyor 16 bitlik en büyük sayıyı bile alsan
sonuç hep eksi çıkıyor. Bu nedenle St nin bulunmasında bir şeylerin eksik olduğunu düşünüyorum.
Ete

Dtmf

Adeta gizli kapakli hazine   ;D hocam bende baya arastirdim hatta ardunio AHT10.h kutuphanesine bile baktim benim yazdiklarimla ayni .hocam ben bunuda rafa kaldirayim.bu sensorle ugrasmak isteyen varsa almasin boykot edelim  :)

dnaci

Hemen pes etmeyin libstock'ta iyi bir örnek ve dokümantasyon var.

https://libstock.mikroe.com/projects/view/4954/ds18b20-and-aht10-example

Linkteki projenin mikrobasic kodu, aht10 için hesaplamada mevcut:

' *
' * Project name:
'     Audio source and amplifier controller
' * Revision History:
'     rev.0 / 2022-02-15
' * Description:
'     Test for DS18B20
' * Test configuration:
'     MCU:             PIC16F1769
'     Oscillator:      16.0000 MHz INTOSC
' Peripheral connections
'     - LCD pins are connected as follows:
'       RS                - RA0
'       EN                - RA1
'       D4                - RA2
'       D5                - RC0
'       D6                - RC1
'       D7                - RC2
'     - DSB18B20 Data pin is connected as follows:
'       DS18B20_DQ+PIN    - RC5   T1
'       DS18B20_DQ+PIN    - RC4   T2
'     - AHT10 Data pins are connected as follows:
'       SCL               - RB4
'       SDA               - RB5
'*

program P2022_DS18B20

' Lcd module connections
dim LCD_RS as sbit at RA0_bit
    LCD_EN as sbit at RA1_bit
    LCD_D4 as sbit at RA2_bit
    LCD_D5 as sbit at RC0_bit
    LCD_D6 as sbit at RC1_bit
    LCD_D7 as sbit at RC2_bit
    LCD_RS_Direction as sbit at TRISA0_bit
    LCD_EN_Direction as sbit at TRISA1_bit
    LCD_D4_Direction as sbit at TRISA2_bit
    LCD_D5_Direction as sbit at TRISC0_bit
    LCD_D6_Direction as sbit at TRISC1_bit
    LCD_D7_Direction as sbit at TRISC2_bit
' End Lcd module connections

'  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
'  18S20: 9  (default setting can be 9,10,11,or 12)
'  18B20: 12
const TEMP_RESOLUTION as byte = 12

dim text as char[9]
    temp1, temp2                         as word
    T1_temp, T2_temp                     as float
    
    T1_txt, T2_txt                       as string[4]
    
    B_0, B_1, B_2, B_3, B_4, B_5         as byte

    RH24, T24                            as longword
    RH24_F, T24_F                        as float
    RH24_txt, T24_txt                    as string[4]
    
    
' Software I2C connections
dim Soft_I2C_Scl  as sbit at RB4_bit
    Soft_I2C_Sda  as sbit at RB5_bit
    Soft_I2C_Scl_Direction as sbit at TRISB4_bit
    Soft_I2C_Sda_Direction as sbit at TRISB5_bit
' End Software I2C connections


' Set-up the PIC
sub procedure InitMain()
' Osc fix START
    OSCCON.6 = 1                           ' INTOSC is 500kHz
    OSCCON.5 = 0
    OSCCON.4 = 1
    OSCCON.3 = 0
    Delay_ms(10)
    OSCCON.6 = 1                           ' INTOSC is 16MHz
    OSCCON.5 = 1
    OSCCON.4 = 1
    OSCCON.3 = 1
' Osc fix END

    OPTION_REG =   0x00              ' Pull-ups enabled by WPUx
    INTCON     =   0x00              ' No INT

    PORTA      =   0x00              ' Clear PORTA
    PORTB      =   0x00              ' Clear PORTB
    PORTC      =   0x00              ' Clear PORTC

    TRISA      =   0x08              ' A3 input, others outputs
    ANSELA     =   0x00              ' No AI
    WPUA       =   0x00              ' No pull-up
    
    TRISB      =   0x00              ' All outputs
    ANSELB     =   0x00              ' No AI
    WPUB       =   0x00              ' No pulll-up
    
    TRISC      =   0x30              ' All outputs but RC4-5
    ANSELC     =   0x00              ' No AI
    WPUC       =   0x00              ' No pull-up
    
    DAC1CON0   =   0x00
    DAC2CON0   =   0x00
    DAC3CON0   =   0x00
    DAC4CON0   =   0x00
    
    ZCD1CON    =   0x00

    CM1CON0    =   0x00              ' No COMP
    CM1CON1    =   0x00              ' No COMP
    CM2CON0    =   0x00              ' No COMP
    CM2CON1    =   0x00              ' No COMP
    CM3CON0    =   0x00              ' No COMP
    CM3CON1    =   0x00              ' No COMP
    CM4CON0    =   0x00              ' No COMP
    CM4CON1    =   0x00              ' No COMP
    
    CCP1CON    =   0x00
    CCP2CON    =   0x00
end sub

main:
  InitMain()
  
  Soft_I2C_Init()           ' Initialize Soft I2C communication

  Lcd_Init()                                               ' Initialize Lcd
  Lcd_Cmd(_LCD_CLEAR)                                      ' Clear Lcd
  Lcd_Cmd(_LCD_CURSOR_OFF)                                 ' Turn cursor off

  Lcd_Out(1, 1, "T1")
  Lcd_Chr(1, 8,223)                                        ' Print degree character, "C" for Centigrades
  Lcd_Chr(1, 9,"C")                                        ' If you see greek alpha letter try typing 178 instead of 223

  Lcd_Out(2, 1, "T2")
  Lcd_Chr(2, 8,223)                                        ' Print degree character, "C" for Centigrades
  Lcd_Chr(2, 9,"C")                                        ' If you see greek alpha letter try typing 178 instead of 223

  Lcd_Chr(1,16,"%")
  
  Lcd_Chr(2,15,223)                                        ' Print degree character, "C" for Centigrades
  Lcd_Chr(2,16,"C")

  '--- Main loop
  while (TRUE)
  
  Delay_ms(10)
    '--- Perform temperature reading T1
    Ow_Reset(PORTC, 5)                                     ' Onewire reset signal
    Ow_Write(PORTC, 5, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTC, 5, 0x44)                               ' Issue command CONVERT_T
    Delay_us(120)

    Ow_Reset(PORTC, 5)
    Ow_Write(PORTC, 5, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTC, 5, 0xBE)                               ' Issue command READ_SCRATCHPAD

    temp1 =  Ow_Read(PORTC, 5)
    temp1 = (Ow_Read(PORTC, 5) << 8) + temp1

    ' Check if temperature is negative or positive
    if temp1 > 2000 then
       Lcd_Chr(1,3,"-")
       T1_temp = (65536 - temp1) / 16  ' negative range
       FloatToStr_FixLen(T1_temp, T1_txt, 4)
       Lcd_Out(1, 4, T1_txt)
    else
       Lcd_Chr(1,3,"+")
       T1_temp = temp1 * 625 / 10000   ' positive range
       FloatToStr_FixLen(T1_temp, T1_txt, 4)
       Lcd_Out(1, 4, T1_txt)
    end if

    Delay_ms(1000)

'--- Perform temperature reading T2
    Ow_Reset(PORTC, 4)                                     ' Onewire reset signal
    Ow_Write(PORTC, 4, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTC, 4, 0x44)                               ' Issue command CONVERT_T
    Delay_us(120)

    Ow_Reset(PORTC, 4)
    Ow_Write(PORTC, 4, 0xCC)                               ' Issue command SKIP_ROM
    Ow_Write(PORTC, 4, 0xBE)                               ' Issue command READ_SCRATCHPAD

    temp2 =  Ow_Read(PORTC, 4)
    temp2 = (Ow_Read(PORTC, 4) << 8) + temp2

    ' Check if temperature is negative or positive
    if temp2 > 2000 then
       Lcd_Chr(2,3,"-")
       T2_temp = (65536 - temp2) / 16  ' negative range
       FloatToStr_FixLen(T2_temp, T2_txt, 4)
       Lcd_Out(2, 4, T2_txt)
    else
       Lcd_Chr(2,3,"+")
       T2_temp = temp2 * 625 / 10000   ' positive range
       FloatToStr_FixLen(T2_temp, T2_txt, 4)
       Lcd_Out(2, 4, T2_txt)
    end if

' AHT10 T+RH sensor
' Reset
    Soft_I2C_Start()       ' issue I2C start signal
    Soft_I2C_Write(0x70)   ' send byte via I2C (device address 0x38 + W)
    Soft_I2C_Write(0xBA)   ' send byte (reset)
    Soft_I2C_Stop()        ' issue I2C stop signal

    Delay_ms(10)

' Init
    Soft_I2C_Start()       ' issue I2C start signal
    Soft_I2C_Write(0x70)   ' send byte via I2C (device address 0x38 + W)
    Soft_I2C_Write(0xE1)   ' send byte (init register)
    Soft_I2C_Write(0x08)   ' send byte (calib register?)
    Soft_I2C_Write(0x00)   ' send data (???)
    Soft_I2C_Stop()        ' issue I2C stop signal
    
    Delay_ms(10)

' Trigger measurement
    Soft_I2C_Start()       ' issue I2C start signal
    Soft_I2C_Write(0x70)   ' send byte via I2C (device address 0x38 + W)
    Soft_I2C_Write(0xAC)   ' send byte (trigger measurement)
    Soft_I2C_Write(0x33)   ' send byte (???)
    Soft_I2C_Write(0x00)   ' send data (???)
    Soft_I2C_Stop()        ' issue I2C stop signal
    
    Delay_ms(100)

' Read data
    Soft_I2C_Start()       ' issue I2C start signal
    Soft_I2C_Write(0x71)   ' send byte via I2C (read status byte register)
' 6 bytes
    B_0 = Soft_I2C_Read(1)
    B_1 = Soft_I2C_Read(1)
    B_2 = Soft_I2C_Read(1)
    B_3 = Soft_I2C_Read(1)
    B_4 = Soft_I2C_Read(1)
    B_5 = Soft_I2C_Read(0)
    
    Soft_I2C_Stop()        ' issue I2C stop signal
    
    Delay_ms(100)

' RH value
    RH24 = B_1
    RH24 = (RH24 << 8 ) or B_2
    RH24 = (RH24 << 8 ) or B_3
    RH24 = RH24 >> 4
    
    RH24_F = RH24/1048576*100
    
    FloatToStr_FixLen(RH24_F, RH24_txt, 4)
    Lcd_Out(1, 11, RH24_txt)

' T value
    T24 = B_3
    T24 = T24 and 0x0000000F
    T24 = (T24 << 8 ) or B_4
    T24 = (T24 << 8 ) or B_5
    
    T24_F = (T24/1048576)*200-50

    FloatToStr_FixLen(T24_F, T24_txt, 4)
    Lcd_Out(2, 11, T24_txt)

    Delay_ms(1000)
    
  wend
end.

dnaci

Proton Basic için aht20 koduda varmış, adres değişikliği ile kullanılabilir:

https://protoncompiler.com/index.php/topic,187.0.html

Dtmf

Yardiminiz icin tesekkur ederim.kodlari deneyecegim.calistirdigimda buradan paylasirim bilginize emeginize saglik hocam

dnaci

#6
@Dtmf önceki mesajlarda paylaştığım verilerle proton aht20 kodunu, aht10 sensörü için dönüştürdüm. Ancak sensör elimde olmadığı için deneme imkanım yok. Kodu ekledim deneyebilirsin.

Aht20 kodunun yazarı sensörü doğrudan okumuş, reset ve init prosedürlerini kullanmamış. İnit için birşeyler eklemiş ama kodda kullanılmıyor, belirtmiş zaten. Verdiğim mikrobasic örneğinde reset, init ve measurement prosedürleri sırasıyla çalıştırılmış.

Verdiğim kodda reset ve init prosedürleri aht10 etiketi altında kapalı. Sonuç alamazsan 10ms gecikmelerle beraber açıp deneyebilirsin. Ancak 0x39 değeri olan satırı açmadan denemeni öneririm. Eğer yine çalışmazsa 0x39 olan satırıda açıp deneyebilirsin. Bu değerler pullup ve pulldown direnç bağlantısı ile alakalı.

'AHT10 ISI NEM SENSÖRÜ TEST KODU
'proton basic versiyon 3.7.3.6
Device = 16F877A
Config FOSC_HS, WDTE_OFF, PWRTE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, WRT_OFF, DEBUG_OFF, CP_OFF
Declare Xtal = 20
Declare All_Digital TRUE
TRISA=0
TRISB=0
TRISC=0
TRISD=0
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
Declare LCD_Lines 4
Declare LCD_Interface 4
Declare LCD_DTPin PORTB.0
Declare LCD_RSPin PORTB.5
Declare LCD_ENPin PORTB.6 
'I2C port declarations
Symbol SCL = PORTC.6                    'Clock pin (Yellow)
Symbol SDA = PORTC.7                    'Data pin  (Blue)
   
Symbol AHT_ADDR_READ = 0x71             'AHT default address & read
Symbol AHT_ADDR_WRITE = 0x70            'AHT default address & write
Symbol AHT_CMD_INIT = 0xE1              'Trigger reading command     
Symbol AHT_CMD_TRIGGER = 0xAC           'Trigger reading command
Symbol AHT_CMD_SOFT_RESET = 0xBA        'Trigger soft reset

Dim Temperature_Temp As Dword
Dim Temperature_Temp_B0 As Temperature_Temp.Byte0 'Alias unsigned Part1 to the low byte
Dim Temperature_Temp_B1 As Temperature_Temp.Byte1 'Alias unsigned Part2 to the 2nd byte
Dim Temperature_Temp_B2 As Temperature_Temp.Byte2 'Alias unsigned Part3 to the 3rd byte
Dim Temperature_Temp_B3 As Temperature_Temp.Byte3 'Alias unsigned Part3 to the high (4th) byte   
Dim Temperature As Float
   
Dim Humidity_Temp As Dword
Dim Humidity_Temp_B0 As Humidity_Temp.Byte0       'Alias unsigned Part1 to the low byte
Dim Humidity_Temp_B1 As Humidity_Temp.Byte1       'Alias unsigned Part2 to the 2nd byte
Dim Humidity_Temp_B2 As Humidity_Temp.Byte2       'Alias unsigned Part3 to the 3rd byte
Dim Humidity_Temp_B3 As Humidity_Temp.Byte3       'Alias unsigned Part3 to the high (4th) byte   
Dim Humidity As Float 

'Dim AHT_Status As Byte                           'Same as Data_0
Dim AHT_Data_0  As Byte                           '0 - Status
Dim AHT_Data_1  As Byte                           '1 - Humidity
Dim AHT_Data_2  As Byte                           '2 - Humidity
Dim AHT_Data_3  As Byte                           '3 - Humidity / Temperature
Dim AHT_Data_4  As Byte                           '4 - Temperature
Dim AHT_Data_5  As Byte                           '5 - Temperature
Dim AHT_Data_6  As Byte                           '6 - CRC (Not used)
Dim AHT_CALL As Byte 'Counter so AHT10 is not called every cycle

DelayMS 40 'AHT only requires 20ms but dont read for 40ms.
                                           
'Main Program Starts Here
Do
If AHT_CALL >= 2 Then  'Only call the AHT10 sensor every 2 seconds
    GoSub AHT10 'Call the sensor read subroutine 
    Print At 1,1," AHT10 SENSOR DEMO "
    Print At 2,1,"   PROTON BASIC    "
	Print At 3,1,"NEM:", Dec2 Humidity
	Print At 4,1,"ISI:", Dec2 Temperature
	DelayMS 500
EndIf

DelayMS 1000 'Create a delay between reads, also show a time status on the display.    
Inc AHT_CALL             
Loop   

AHT10:   
'DelayMS 10
'I2COut SDA, SCL, AHT_ADDR_WRITE, [AHT_CMD_SOFT_RESET,0x70,0xBA] 'AHT RESET
DelayMS 10
I2COut SDA, SCL, AHT_ADDR_WRITE, [AHT_CMD_TRIGGER,0x39,0x00] '39 I2C pin pullup, 38 pulldown  
DelayMS 10
I2COut SDA, SCL, AHT_ADDR_WRITE, [AHT_CMD_INIT,0x08,0x00] 'AHT INIT
DelayMS 10
I2COut SDA, SCL, AHT_ADDR_WRITE, [AHT_CMD_TRIGGER,0x33,0x00]'Trigger the measurement
DelayMS 80 'Wait for the measurement to complete   
'Read the raw data       
I2CIn SDA, SCL, AHT_ADDR_READ, [AHT_Data_0, AHT_Data_1, AHT_Data_2,AHT_Data_3, AHT_Data_4, AHT_Data_5, AHT_Data_6]

'Do the humidity calculation       
Clear Humidity_Temp
Humidity_Temp_B2 = AHT_Data_1
Humidity_Temp_B1 = AHT_Data_2
Humidity_Temp_B0 = AHT_Data_3
Humidity_Temp = Humidity_Temp >> 4
 
Humidity = Humidity_Temp / 0x100000
Humidity = Humidity * 100       

'Do the temperature calculation       
Clear Temperature_Temp
Temperature_Temp_B2 = AHT_Data_3 & 0x0F
Temperature_Temp_B1 = AHT_Data_4 
Temperature_Temp_B0 = AHT_Data_5 
         
Temperature = Temperature_Temp / 0x100000   
Temperature = Temperature * 200   
Temperature = Temperature - 50
Return

Dtmf

dnacı tesekkür ederim yardımın için zaten ete hocamıza bu platform için minnettarız  :).hocam kod çalışıyor gayet güzelde ölcüm yapıyor emeğinize saglık selametle kalın

Dtmf

Benim datashetten program gidişatı da dogruymus fakat hesaplamalar hatalı birde kritik nokta şurası  AHT_Data_3 & 0x0F,su ifade  & 0x0F pek anlamadım ama bi deneyim dedim bunu silince çok sey degişiyor.

Dtmf

#9
Dim Temperature_Temp As Dword
Dim Temperature_Temp_B0 As Temperature_Temp.Byte0 'Alias unsigned Part1 to the low byte
Dim Temperature_Temp_B1 As Temperature_Temp.Byte1 'Alias unsigned Part2 to the 2nd byte
Dim Temperature_Temp_B2 As Temperature_Temp.Byte2 'Alias unsigned Part3 to the 3rd byte
Dim Temperature_Temp_B3 As Temperature_Temp.Byte3 'Alias unsigned Part3 to the high (4th) byte 

yukarıdaki işlemin muadili  Humidity_Temp=(AHT_Data_1<<16) +  (AHT_Data_2 <<8)+ (AHT_Data_3) form'a yeni katılanlar ve yeni ögrenmeye çalışanlar için

yanlış yorumlamıyorsam,Temperature_Temp As Dword 4 byte, bilgiyi kaydırmak yerine byte.0 ,byte.1.. dıye gelen 4 byte lık bilgiyi yerlestirmiş dogrumu hocam

dnaci

@Dtmf çalıştığına sevindim. Doğrudur, Temperature_Temp word değişkeninden ilk 4 biti b0-b1-b2-b3 değişkenlerine atıyor. Aynı işlemi nem ölçümünde de yapıyor.

AHT_Data_3 & 0x0F konusunda gelirsek. Sanırım burada ısı ölçümü yapmasını sağlıyor.
 
Dim AHT_Data_3  As Byte   '3 - Humidity / Temperature. Bu değişken tanımlamasında nem veya sıcaklık olarak ayırmış. Eğer 0f ilave ederse sıcaklığı hesaplıyor sanırım.

Doğru düzgün bir datasheet olmayınca sonuca varmamız örnek kodlarla oldu.

Verdiğim koddaki kapalı kodların hiçbirini açmadınız, yukarıdaki kodu olduğu gibi derlediniz sanırım.

Dtmf

#11
Kapali olan kisimlari actiginda oldu denedim soft reseti bile denedim soft reset atinca sicaklik min. olcmesi gereken deger sanirim -43.73c olarak ekranda gozukuyor sonra olmasi gereken degeri gosteriyor örnek 23.05c°.

dnaci

Kodu proton forumuna ve bloğuma da ekledim iyi bir çalışma oldu.

Dtmf

Sagolun hocam güzel bi örnek konu oldu. :) selametle kalın

Powered by EzPortal