Saturday, 28 March 2020
     
 
Main Menu
Home Home
Shop Shop
News News
BASCOM-AVR BASCOM-AVR
BASCOM-8051 BASCOM-8051
Products Products
Application Notes Application Notes
Publications Publications
Links Links
Support Center Support Center
Downloads Downloads
Forum Forum
Resellers Resellers
Contact Us Contact Us
Updates Updates
MCS Wiki MCS Wiki
Online Help
BASCOM-AVR Help BASCOM-AVR Help
BASCOM-8051 Help BASCOM-8051 Help
Contents in Cart
Show Cart
Your Cart is currently empty.
Search the Shop

Products Search

User Login
Username

Password

If you have problem after log in with disappeared login data, please press F5 in your browser

RSS News
 
     
 

 
   
     
 
AN #194 - Using SHT21 for cellar climate control Print
2nd place in 2011 competition bascom.at.ua


Much were written about this amazing " cubes ", has here is solved too to use given miraculously. Idea was such, support micro-climate  in cellar.

For conclusion of information is used MELT 2х line 16 class, keys of management with old motherboard 15N03H on 30 volts and ATMEGA 8 - 16PU.

Long hung around with code, on indicator were removed numerals, well even close not reminded true importance. What turned out to be, reasons 2, converter with 5 on 3,3 volts and recalculation itself got data.

With first dared simply, there is worker of the decision from DECODERа
http://we.easyelectronics.ru/part/datchik-temperatury-i-vlazhnosti-sht21.html :


With code it happened to to ask the help beside community, trivial errors from ignorance Bascom's, all we teach!

That was got.



The First cut-in, call at in menu and choose the button upwards, downwards adjustment hours or limits of the functioning(working) the ventilator and heating. After striking IN- entering, all installed parameters are saved in memories MC. This 8 first cells to memories.

At achievement upper придела to moisture is included ventilator, but at reduction of the temperature - a heating.

The Ventilators use from BP computer, heater this Car heater sittings of the car. CHtob was a best return of the heat, glue her(it) on metallic the base 300*300 mm. If occurs change the ambiance, data and time, are sent on computer through RS-485.

The Disappearings of the feeding, in the same way оповещается through port RS-485. (if adapt autonomous feeding from telephone or simply battery on 4,5 volts.) Eats the block from 20 volts.

Certainly this not masterpiece, but works as it is necessary.



Source code:


'*******************************************************************************
'*    Description : SHT21_POD                                                  *
'*    Revision    : 1.0                                                        *
'*    Controller  : ATMEGA8                                                    *
'*    Compiler    : BASCOM-AVR  1.11.9.8 DEMO                                  *
'*    Author      : 'AV_ , 2011                                                *
'*    Web         : HTTP://WWW                                       *
'*******************************************************************************
'
'************************** Ňčď_ěčęđęňđĺđŕ *******************************
$regfile = "m8def.dat" 'Ä˙ POD ěĺăŕ8
$crystal = 4000000                                          'ęŕđö 4 ĚĺĂÖ
$baud = 19200
'$lib "lcd4.lbx"                                             'čńďüĺě 4-čňĺ ďäęţĺčĺ äčńďĺ˙ ń ďěůüţ ŕüňĺđŕňč ččňĺęč
$lib "mcsbyte.lbx"
$lib "ds1307clock.lib" 'ďäęţŕĺě ččňĺę ds1307
$lib "modbus.lbx" 'ďäęţŕĺě ččňĺę modbus

$hwstack = 40
$swstack = 16
$framesize = 32
$eeprom
'$sim

'*********************** ęčăđŕöč˙ ďđň ***********************************
Config Lcd = 16 * 2                                         ' ęđŕ 16*2 (ţ ń ęňđĺđě HD44780)
Config Lcdpin = Pin , Rs = Portb., E = Portb., Db4 = Portb., Db5 = Portb., Db6 = Portb., Db7 = Portb.5
Config Scl = Portc.5                                        'ďäęţŕĺě i2c SCL
Config Sda = Portc.4                                        'ďäęţŕĺě i2c SDA
Const Ds1307w = &HD0                                        'Ęńňŕňű ä˙ đŕňű ń ds1307 ŕďčńü
Const Ds1307r = &HD1                                        'Ęńňŕňű ä˙ đŕňű ń ds1307 ňĺčĺ
Config Portc.= Input 'ăŕ "Power_pin"
Config Portc.= Output 'ăŕ ęäŕ ďäęţĺ ęţŕňĺü Q1
Config Portc.= Output 'ăŕ ęäŕ ďäęţĺ ęţŕňĺü Q2
Config Portd.= Output 'ăŕ ä˙ ďĺđĺęţĺč˙ RS485 ďĺđĺäŕŕ ďđčĺě
Config Print = Portd., Mode = Reset 'ď đĺńĺň
Config Serialin = Buffered , Size = 250                     'ĺđ RS485 ăäĺ ńĺ äĺđćčě
Cursor Off 'űęţŕĺě ęđńđ
Cls 'čńňęŕ ęđŕŕ


'*** ŕńňđčě ďđň ä˙ ďäęţĺč˙ ęďę č äđ. ńňđńň (Q1,Q2,Drying ăđĺ)

Set Portd.: Ok Alias Pind.7                               'ńňŕęŕ"Set" ňđĺč đĺčńěňđ ŕ +  ä
Set Portd.: Esc Alias Pind.6                              'ńňŕęŕ"Set" ňđĺč đĺčńěňđ ŕ +  ěĺţ
Set Portd.: Up Alias Pind.4                               'ńňŕęŕ"Set" ňđĺč đĺčńěňđ ŕ +  ĺđő
Set Portd.: Down Alias Pind.5                             'ńňŕęŕ"Set" ňđĺč đĺčńěňđ ŕ +  č
Set Portd.: Fen Alias Pind.3                              'ńňŕęŕ"Set" ňđĺč đĺčńěňđ ŕ +  Drying
Power_pin Alias Pinc.3                                      'Power_pin ĺň!
Q1 Alias Portc.0                                            'ŕńňđęŕ ďäęţĺč˙ Q1
Q2 Alias Portc.2                                            'ŕńňđęŕ ďäęţĺč˙ Q2

Q1 = 0
Q2 = 0

'*********************** Ďĺđĺěĺűĺ SHT-21 *************************************
Dim Data1 As Byte
Dim Data2 As Byte
Dim Crc As Byte
Dim Datat As Word
Dim Datah As Word
Dim T As Single
Dim H As Single
Dim T0 As Single 'Őđŕčě ä˙ ńđŕĺč˙
Dim H0 As Single 'Őđŕčě ä˙ ńđŕĺč˙
'***
Dim X1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ X1(đĺěĺűĺ äŕ.)
Dim Ay As Byte '˙čňü ŕňţ ďĺđĺěĺţ Ay(öčęŕ)
Dim J1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ J1(ăä)
Dim M1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ M1(ěĺń˙ö)
Dim D1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ D1(äĺü)
Dim H1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ H1(ŕń)
Dim Min1 As Byte '˙čňü ŕňţ ďĺđĺěĺţ Min1(ěčňŕ)

'************************* ńňŕűĺ ****************************************
Dim A As Integer '˙čňü öĺţ ďĺđĺěĺţ A
Dim B As Integer '˙čňü öĺţ ďĺđĺěĺţ B
Dim Tem1 As Single '˙čňü öĺţ ďĺđĺěĺţ Tem1
Dim Tem2 As Single '˙čňü öĺţ ďĺđĺěĺţ Tem2
Dim C As Integer '˙čňü öĺţ ďĺđĺěĺţ C
Dim D As Integer '˙čňü öĺţ ďĺđĺěĺţ D
Dim Vla1 As Single '˙čňü öĺţ ďĺđĺěĺţ Vla1
Dim Vla2 As Single '˙čňü öĺţ ďĺđĺěĺţ Vla2


'***************** Ďĺđĺěĺűĺ Eeprom ĚĘ ďđöŕ   ********************************
Dim Ae As Eram Integer '˙čňü öĺţ ďĺđĺěĺţ  EEPROM Ae
Dim Be As Eram Integer '˙čňü öĺţ ďĺđĺěĺţ  EEPROM Be
Dim Ce As Eram Integer '˙čňü öĺţ ďĺđĺěĺţ  EEPROM Ce
Dim De As Eram Integer '˙čňü öĺţ ďĺđĺěĺţ  EEPROM De
= Ae
= Be
= Ce
= De


'*** Ďĺđĺěĺűĺ ŕń ***
Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Dat As Byte
Dim Month As Byte
Dim Year As Byte

'***
'************************************Ďđöĺäđű**********************************
Declare Sub Sht21th                                         '˙čňü ďđöĺäđ Ňĺđěäŕňčęŕ
Declare Sub Up_Down() '˙čňü ďđöĺäđ Up_Down
Declare Sub Drying                                             '˙čňü ďđöĺäđ Drying
Declare Sub Heating                                          '˙čňü ďđöĺäđ Heating
'***


Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3               ' ăđŕäń
Deflcdchar 1 , 32 , 4 , 4 , 14 , 14 , 31 , 31 , 14          ' ŕę ŕćńňč
Deflcdchar 2 , 4 , 10 , 17 , 31 , 17 , 17 , 17 , 31         ' ŕę ďäŕŕ
Deflcdchar 3 , 32 , 4 , 4 , 14 , 14 , 31 , 31 , 32          ' ŕę ĺđő
Deflcdchar 4 , 32 , 31 , 31 , 14 , 14 , 4 , 4 , 32          ' ŕę č

'ŕäđĺń ěčęđńőĺěű-äŕňčęŕ SHT21  H80- ŕďčńü, H81- ňĺčĺ
'Ęěŕä ä˙ ďđŕĺč˙ SHT21 ńĺă 7:

'0xE3 - Čěĺđčňü ňĺěďĺđŕňđ. Ďđč ňě ŕ đĺě˙ čěĺđĺč˙ čč˙ SCL äĺň ďđčćŕňŕ ę ĺěĺ.
'0xE5 - Čěĺđčňü ŕćńňü. čč˙ SCL ňŕę-ćĺ ďđčćčěŕĺňń˙ ę ĺěĺ ŕ đĺě˙ čěĺđĺč˙.
'0xF3 - Čěĺđčňü ňĺěďĺđŕňđ. ŕ ňň đŕ äŕňčę ĺ ďđčćčěŕĺň ččţ SCL ŕ đĺě˙ ŕěĺđŕ.
'0xF5 - Čěĺđčňü ŕćńňü. čč˙ SCL ĺ ďđčćčěŕĺňń˙.
'0xE6 - ŕďčńŕňü äŕűĺ  ďüŕňĺüńęč đĺăčńňđ.
'0xE7 - Ďđčňŕňü äŕűĺ č ďüŕňĺüńęă đĺăčńňđŕ.
'0xFE - Ďĺđĺŕăđčňü äŕňčę.

'******** Ďđöĺäđŕ *********
Begin:
Cls
Lcd "*** SHT-21 *** "

Do


Gosub Clock                                                 'ŕĺě đĺě˙
 Gosub Sht21th                                             'ŕĺě ňĺěďĺđŕňđ č ŕćńňü
Waitms 900                                                  'ňđěčě
 Gosub Xx
Call Heating                                                 'űŕňü ďäďđăđŕěě(ďđöĺäđ) "Heating"
Call Drying                                                    'űŕňü ďäďđăđŕěě(ďđöĺäđ) "Drying"

Cls 'űäčě đĺě˙ č ńĺ ńňŕüĺ
 Lcd Chr(2) ; Fusing(, "#.#") ; Chr(0) ; " " ; Chr(1) ; Fusing(, "#.#") ; "%"
 Locate 2 , 1
 Lcd " " ; Hour ; ":" ; Mine ; " " ; Dat ; "/" ; Month ; "/" ; Day
 If Esc = 0 Then Goto Meni                              'ęďęč ěĺţ

 Loop
 End

'*** SHT-21T ňĺěďĺđŕňđŕ ***
Sub Sht21th:

I2cstart
I2cwbyte &H80                                               'ŕäđĺń ěčęđńőĺěű-äŕňčęŕ SHT21
I2cwbyte &HE3                                               'űđ čěĺđĺč˙ ňĺěďĺđŕňđű  đěŕüě đĺćčěĺ
 Waitms 100                                                 'čěĺđĺčĺ

I2cstart
I2cwbyte &H81                                               'ňĺčĺ đĺüňŕňŕ čěĺđĺč˙
I2crbyte Data1 , Ack 'ďđčĺě ńňŕđřĺă ŕňŕ, ćäĺě ńäţůč ŕň
I2crbyte Data2 , Ack 'ďđčĺě ěŕäřĺă ŕňŕ
I2crbyte Crc , Nack 'ďđčĺě ŕňŕ ęňđü ńěěű (ěć ŕ ĺă ŕčňü)
I2cstop 'ęĺö ůĺč˙

'***Ńčňŕĺě***
Datat = Data1
Shift Datat , Left , 8                                      'ńäčă ŕ 8 čň
Datat = Datat + Data2
= Datat * 175.72
= T / 65536
= T - 46.85

'***ńĺ***

'*** SHT-21H ŕćńňü ***
'Sht21h:

I2cstart
I2cwbyte &H80                                               'ŕäđĺń ěčęđńőĺěű-äŕňčęŕ SHT21
I2cwbyte &HE5                                               'űđ čěĺđĺč˙ ŕćńňč  đěŕüě đĺćčěĺ
 Waitms 100                                                 'čěĺđĺčĺ

I2cstart
I2cwbyte &H81                                               'ňĺčĺ đĺüňŕňŕ čěĺđĺč˙
I2crbyte Data1 , Ack 'ďđčĺě ńňŕđřĺă ŕňŕ, ćäĺě ńäţůč ŕň
I2crbyte Data2 , Ack 'ďđčĺě ěŕäřĺă ŕňŕ
I2crbyte Crc , Nack 'ďđčĺě ŕňŕ ęňđü ńěěű (ěć ŕ ĺă ŕčňü)
I2cstop 'ęĺö ůĺč˙

'***Ńĺň***
Datah = Data1
Shift Datah , Left , 8                                      'ńäčă ŕ 8 čň
Datah = Datah + Data2
= Datah * 125
= H / 65536
= H - 6

'***ńĺ***
End Sub


'*** Ńđŕčŕĺě äŕűĺ ***
Xx:

If T <> T0 Then
 T0 = T : Print Fusing(, "#.#") ; "C " ; Hour ; ":" ; Mine ; " " ; Dat ; "/" ; Month ; "/" ; Dat

 If H <> H0 Then
    H0 = H : Print Fusing(, "#.#") ; "% " ; Hour ; ":" ; Mine ; " " ; Dat ; "/" ; Month ; "/" ; Dat

 If Power_pin < 1 Then
 Print "*ĹŇ ĎČŇŔČß* NO voltages  " ; Hour ; ":" ; Mine ; " " ; Dat ; "/" ; Month ; "/" ; Dat

 End If
 End If
 End If
 Return


'*** ďđĺäĺ˙ĺě ňĺęůĺĺ đĺě˙

Clock: 'ńňŕäŕđňŕ˙ đŕňŕ ń RTC ds1307 ď čĺĺčţ äŕűő


I2cstart
I2cwbyte Ds1307w
I2cwbyte &H00
I2cstart
I2cwbyte Ds1307r
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Ack
I2crbyte Day , Ack
I2crbyte Dat , Ack
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop
 Seco = Makedec(seco) : Mine = Makedec(mine) : Hour = Makedec(hour)
 Day = Makedec(day) : Dat = Makedec(dat) : Month = Makedec(month) : Year = Makedec(year)


Return


'*** Ěĺţ
Meni:
Cls
Rem ńň. đĺěĺč
Lcd "cż. łpeĽe˝ " ; Chr(3)
Locate 2 , 1
Rem ńň. äŕňčęŕ
Lcd "cż. ăażŔşa " ; Chr(4)

Do
If Up = 0 Then Goto Ust_v
If Down = 0 Then Goto Ust_d
If Ok = 0 Then Goto Begin

 Loop
'***

Ust_v:

'*******************************************************************************

 'űđ č ďńĺäţůĺĺ ńőđŕĺčĺ  ďŕě˙ňü(ĺđăŕčńčěţ) ds1307, ăäŕ

 Cls
   Ay = 0
   X1 = Year
 Do
 If X1 > 99 Then X1 = 9
 If X1 < 9 Then X1 = 99
 Locate 1 , 1
 Lcd "*>ŕaża<*"
 Locate 2 , 1
 Lcd "ˇoă: " ; X1 ; "  "
   Up_Down
   J1 = X1
 Loop Until Ay = 1

'*******************************************************************************

 'űđ č ďńĺäţůĺĺ ńőđŕĺčĺ  ďŕě˙ňü(ĺđăŕčńčěţ) ds1307, ěĺń˙öŕ

 Cls
   Ay = 0
   X1 = Month
 Do
 If X1 > 12 Then X1 = 1
 If X1 < 1 Then X1 = 12
 Locate 1 , 1
 Lcd "*>ŕaża<*"
 Locate 2 , 1
 Lcd "Mecĺ: " ; X1 ; "  "
   Up_Down
   M1 = X1
 Loop Until Ay = 1

'*******************************************************************************

 'űđ č ďńĺäţůĺĺ ńőđŕĺčĺ  ďŕě˙ňü(ĺđăŕčńčěţ) ds1307, ä˙

 Cls
   Ay = 0
   X1 = Day
 Do
 If X1 > 31 Then X1 = 1
 If X1 < 1 Then X1 = 31
 Locate 1 , 1
 Lcd "*>ŕaża<*"
 Locate 2 , 1
 Lcd "ŕe˝Ä: " ; X1 ; "  "
   Up_Down
   D1 = X1
 Loop Until Ay = 1
   Year = J1
   Month = M1
   Day = D1
 Gosub Set_date

'*******************************************************************************

 'űđ č ďńĺäţůĺĺ ńőđŕĺčĺ  ďŕě˙ňü(ĺđăŕčńčěţ) ds1307, ŕń

 Cls
   Ay = 0
   X1 = Hour
 Do
 If X1 > 23 Then X1 = 0
 If X1 < 0 Then X1 = 23
 Locate 1 , 1
 Lcd "*>BpeĽ<*"
 Locate 2 , 1
 Lcd "acĂ: " ; X1 ; "  "
   Up_Down
   H1 = X1
 Loop Until Ay = 1

'*******************************************************************************

 'űđ č ďńĺäţůĺĺ ńőđŕĺčĺ  ďŕě˙ňü(ĺđăŕčńčěţ) ds1307, ěčň

 Cls
   Ay = 0
   X1 = Mine
 Do
 If X1 > 59 Then X1 = 0
 If X1 < 1 Then X1 = 59
 Locate 1 , 1
 Lcd "*>BpeĽ<*"
 Locate 2 , 1
 Lcd "M˝yżĂ: " ; X1 ; " "
   Up_Down
   Min1 = X1
 Loop Until Ay = 1

   Hour = H1
   Mine = Min1
   Seco = 0
 Gosub Set_time

 Goto Begin
'***
Set_date:
  Day = Makebcd(day) : Month = Makebcd(month) : Year = Makebcd(year)
 I2cstart ' Generate start code
 I2cwbyte Ds1307w                                          ' send address
 I2cwbyte 4                                                ' starting address in 1307
 I2cwbyte Day                                              ' Send Day
 I2cwbyte Month                                            ' Mon
 I2cwbyte Year                                             ' ăä
 I2cstop
Return

Set_time:
  Seco = Makebcd(seco) : Mine = Makebcd(mine) : Hour = Makebcd(hour)
 I2cstart ' Generate start code
 I2cwbyte Ds1307w                                          ' send address
 I2cwbyte 0                                                ' starting address in 1307
 I2cwbyte Seco                                             ' Send Data to SECONDS
 I2cwbyte Mine                                             ' min
 I2cwbyte Hour                                             ' Hours
 I2cstop
Return

'*******************************************************************************

Ust_d:

'***
'ńňŕęŕ č ńőđŕĺčĺ  eeprom ěę, űęţĺč˙ Q2

 Cls
   Ay = 0
   X1 = A
 Do
 If X1 > 10 Then X1 = 7
 If X1 < 7 Then X1 = 10
 Locate 1 , 1
 Lcd "[ Bòop żeĽľ. ]"
 Locate 2 , 1
 Lcd "TeĽľ. łş.: " ; X1 ; "  "
   Up_Down
   Tem1 = X1
 Loop Until Ay = 1
    A = Tem1

'*******************************************************************************
'ńňŕęŕ č ńőđŕĺčĺ  eeprom ěę, ęţĺč˙ Q2

 Cls
   Ay = 0
   X1 = B
 Do
 If X1 > 10 Then X1 = 4
 If X1 < 4 Then X1 = 10
 Locate 1 , 1
 Lcd "[ Bòop żeĽľ. ]"
 Locate 2 , 1
 Lcd "TeĽľ. łĂş.: " ; X1 ; "  "
   Up_Down
   Tem2 = X1
 Loop Until Ay = 1
    B = Tem2

'***
'ńňŕęŕ č ńőđŕĺčĺ  eeprom ěę, ęţĺč˙ Q1

 Cls
   Ay = 0
   X1 = C
 Do
 If X1 > 80 Then X1 = 50
 If X1 < 50 Then X1 = 80
 Locate 1 , 1
 Lcd "[ cż.ła˝ocż]"
 Locate 2 , 1
 Lcd "Ba. łş.: " ; X1 ; "  "
   Up_Down
   Vla1 = X1
 Loop Until Ay = 1
    C = Vla1

'*******************************************************************************
'ńňŕęŕ č ńőđŕĺčĺ  eeprom ěę, űęţĺč˙ Q1

 Cls
   Ay = 0
   X1 = D
 Do
 If X1 > 80 Then X1 = 49
 If X1 < 49 Then X1 = 80
 Locate 1 , 1
 Lcd "[ cż.ła˝ocż]"
 Locate 2 , 1
 Lcd "Ba. łĂş.: " ; X1 ; "  "
   Up_Down
   Vla2 = X1
 Loop Until Ay = 1
    D = Vla2
 Gosub Epp_store

'***

Epp_store:
 Writeeeprom A , Varptr(ae) ' ńőđŕ˙ĺě ďĺđĺěĺţ A  ĺđăĺŕčńčěţ ďŕě˙ňü ěę
 Writeeeprom B , Varptr(be) ' ńőđŕ˙ĺě ďĺđĺěĺţ B  ĺđăĺŕčńčěţ ďŕě˙ňü ěę
 Writeeeprom C , Varptr(ce) ' ńőđŕ˙ĺě ďĺđĺěĺţ C  ĺđăĺŕčńčěţ ďŕě˙ňü ěę
 Writeeeprom D , Varptr(de) ' ńőđŕ˙ĺě ďĺđĺěĺţ D  ĺđăĺŕčńčěţ ďŕě˙ňü ěę

Return

'***

'*******************************************************************************
'Ďđöĺäđŕ ňĺŕţůŕ˙ ŕ ä äŕűő, ĺčĺčĺ č ěĺüřĺčĺ ŕĺč˙

Sub Up_Down()
 Waitms 300
 If Up = 0 Then Incr X1
 If Down = 0 Then Decr X1
 If Ok = 0 Then : Ay = 1 : Else : : Ay = 0 : End If
End Sub

'***

'*******************************************************************************
'Ďđöĺäđŕ ňĺŕţůŕ˙ ŕ ę. č űę. Ňđ. ďđč ŕäŕ  ŕńňđęęŕő, ňĺěďĺđŕňđĺ

Sub Heating

  Tem1 = A
  Tem2 = B

 If T => Tem2 Then : Q2 = 0 : End If

 If T <= Tem1 Then : Q2 = 1 : End If

End Sub
'*******************************************************************************
'Ďđöĺäđŕ ňĺŕţůŕ˙ ŕ ę. č űę. Ňđ. ďđč ŕäŕ  ŕńňđęęŕő, ŕćńňč

Sub Drying

  Vla1 = C
  Vla2 = D

 If H => Vla1 Then : Q1 = 1 : End If

 If H <= Vla2 Then : Q1 = 0 : End If

End Sub