Klokje met temperatuur

Bavelt

Golden Member

Dit keer geen vraag, maar weer iets om te delen.
(Ik weet nog niet goed waar ik dit soort dingen nu moet plaatsen. Ik heb al wel veel oude discussies gezien over 'show your projects', maar die zijn vaak al van 2008 en eerder.

Dus daarom maar even hier. Met name ook omdat er niet zo heel veel van MikroBasic is / wordt gepubliceerd.

Het projectje is een digitale klok (ja, alweer, het bekende klokkenvirus...:)).

Dit keer met een 8-digit 7 segment in kleine vorm, voorzien van een MAX7219. De aansturing verloopt via SPI.
Daarbij een tijd moduuljte (DS1307) waar op het printje ook een temperatuursensor DB18B20 kan worden gemonteerd. Dat maakt het tot een compact geheel.
De DS1307 werkt met I2C en de DB18B20 met 'One Wire'.
Alle drie dus tegelijk met 1 Pic-je... :)

De uren en minuten worden getoond en de temperatuur met 1 decimaal achter de komma.
Als processor wordt hier de PIC16F1827 gebruikt.

Wellicht heeft iemand hier wat aan. :)

Fouten zijn het bewijs dat je het probeert..
marcob

Golden Member

Tof dat je je eigne software deelt, maar toch een kritische noot :-) Hoe stel je de juiste tijd in? En voor de na bouwers, een eenvoudig aansluitschema is ook altijd handig.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

En hoe ziet dat eruit? heb je daar een foto en schema van?

LDmicro user.
rob040

Golden Member

Er is nog steeds een show your projects draadje wat actueel is.

Bavelt

Golden Member

Hoe stel je de juiste tijd in?

Dat heb ik als volgt opgelost: In het programma kan je de startwaarde opgeven van de tijd waarmee je wilt beginnen.
Door het 'uncommenten' van het statement schrijft hij die tijd weg.
Daarna weer een vinkje ervoor en opnieuw compileren (amders schrijft hij de ingestelde tijd opnieuw weg bij herstarten).
Daarna blijft de tijd goed; het moduultje heeft een knoopcel als backup batterij aan boord.

De code:

pic basic code:

'Write_DS1307()                         'Set initial Time by uncomment this statement 

en in het programma:

pic basic code:

Const          StartTime As Byte [7] = (                              'Set initial Date & Time
 0x10,    'Seconds
 0x00,    'Minutes
 0x13,    'Hour
 0x04,    'Daynr
 0x16,    'Day
 0x05,    'Month
 0x20     'Year   

'====================================================================================================
 Sub procedure Write_DS1307()            'Write Date in RTC registers
'====================================================================================================
  I2C1_Start()
  I2C1_Wr(0xD0)
  I2C1_Wr(0x00)
  I2C1_Wr(StartTime [00])                'Seconds
  I2C1_Wr(StartTime [01])                'Minutes
  I2C1_Wr(StartTime [02])                'Hour
  I2C1_Wr(StartTime [03])                'Daynr
  I2C1_Wr(StartTime [04])                'Day
  I2C1_Wr(StartTime [05])                'Month
  I2C1_Wr(StartTime [06])                'Year
  I2C1_Stop()
 End Sub

Een andere oplossing is - heb ik al eerder toepgepast - vergt wat meer code.

Die zet de tijd automatisch goed ten tijde van compileren (een mooi moment). Dan hoef je helemaal niets te doen.
Ik heb die code ook wel ter beschikking indien daar belangstelling voor is.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

een eenvoudig aansluitschema is ook altijd handig.

Dat zou ik kunnen en ook willen doen. Ik heb alleen nog niet een makkelijk programma gezien waarmee dat snel en eenvoudig kan. Ik heb sPlan maar is niet eenvoudig vind ik zelf (of je moet daar heel veel tijd insteken).

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het geheel zit nu even op een breadboardje...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het tijdmoduultje (DS1307) met rechtsonder de DB18B20...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

De aansluitingen staan in het programma:

pic basic code:

' Project name: KlokTemp_1827
' MCU:          PIC16F1827
' Oscillator:   Internal 8 MHz
' Display:      7_segment 8 Digits
' Temp Sensor   DB18B20
' SDO2:         LAT A.0                   Pin 17
' SCK2:         PORT B.5                  Pin 11
' SDA1:         PORT B.1                  Pin 7
' SCL1:         PORT B.4                  Pin 10
' D/C:          LAT B.0                   Pin 6
' CS:           LAT A.4                   Pin 3
Fouten zijn het bewijs dat je het probeert..
marcob

Golden Member

Op 16 mei 2020 21:54:38 schreef Bavelt:
[...]
Daarna blijft de tijd goed; het moduultje heeft een knoopcel als backup batterij aan boord.

Met uitzondering in de wintertijd, dan loopt je een uur voor (of achter) :-)

Mijn opmerkingen zijn om je uit te dagen, niet om af te kraken. Ik heb je andere topic's ook gevolgd. Zie dat je geïnteresseerd bent om alles uit te zoeken.
Zelf in het verleden veel geprogrammeerd in PicBasic, maar ben ook zo begonnen als jij. Met iets kleins begonnen en steeds verder uit te breiden.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Arco

Special Member

Of 't zomer of wintertijd is kun je softwarematig makkelijk vaststellen.
Deze routine kan van een Europese of USA datum/tijd afleiden of het zomertijd (DST) is of niet...

Als het zomertijd is, is bit 0 van het resultaat '1'
Als er een zomer <-> wintertijd omschakeling is geweest sinds laatste aanroep, dan is bit 1 geset.

Als pZone=1 dan Europees, als pZone=2 dan USA tijd.

pic basic code:


Dim DSTState     As Byte
    OldDSTState  As Byte

Const DSTParm As Byte[16] = (31,5,31,2,3,10,2,3,14,2,7,2,3,11,2,2)

'==============================================================================
Sub Function Is_DST(Dim pZone As Byte) As Byte               'Tests if it's DST
'==============================================================================
  Dim lBegin, lEnd, lZone As Byte
  '----------------------------------------------------------------------------
  If pZone Then
    lZone = (pZone - 1) << 3
    Result = 0
    lBegin = (((5 * tYear) div 4) - (tYear div 100) + (tYear div 400)) Mod 7
    lEnd   = DstParm[lZone+2] - (lBegin+DstParm[lZone+3]) Mod 7
    lBegin = DstParm[lZone+0] - (lBegin+DstParm[lZone+1]) Mod 7
    '--------------------------------------------------------------------------
    If (tMonth <= DstParm[lZone+4]) Or (tMonth >= DstParm[lZone+5]) Then
      If ((tMonth = DstParm[lZone+4]) And (tMonthDay < lBegin)) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay > lEnd)) Or
         ((tMonth = DstParm[lZone+4]) And (tMonthDay = lBegin) And (tHour < DstParm[lZone+6])) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay = lEnd) And (tHour >= DstParm[lZone+7])) Then
        DSTState = 1
      End If
    End If
    If (tMonth >= DstParm[lZone+4]) Or (tMonth <= DstParm[lZone+5]) Then
      If ((tMonth = DstParm[lZone+4]) And (tMonthDay > lBegin)) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay < lEnd)) Or
         ((tMonth = DstParm[lZone+4]) And (tMonthDay = lBegin) And (tHour >= DstParm[lZone+6])) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay = lEnd) And (tHour < DstParm[lZone+7]-1)) Then
        DSTState = 2
      End If
    End If
    If DSTState = 0 Then
      If tMonth = DstParm[lZone+4] Then DSTState = 2 Else DSTState = 1 End If
    End If
    If DstState = 2 Then Result.0 = 1 End If
    If DstState = 1 Then Result.0 = 0 End If

    If OldDSTState <>  DSTState Then
      Result.1 = 1
      OldDSTState = DSTState
    Else
      Result.1 = 0
    End If
  End If
End Sub
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
mel

Golden Member

En nu uitbreiden met een DCF ontvanger.. ;)

u=ir betekent niet :U bent ingenieur..
Vonkenpromotor

Golden Member

Ik zou ipv de DS1307 een DS3231 gebruiken, is veel nauwkeurigen en hoef je bijna nooit bij te stellen. De DS1307 houdt nogal slecht tijd. Voor de rest is het 1 op 1 vwb codering.

buckfast_beekeeper

Golden Member

Denk eens na over een BME280. Heb je voor 5€ een sensor voor temperatuur, rel vochtigheid en luchtdruk.

Van Lambiek wordt goede geuze gemaakt.
Arco

Special Member

https://www.circuitsonline.net/forum/view/message/2156057#2156057

Die BME280 is een vreselijk gecompliceerd geval met (veel te) veel instellingen.
(zoals sampling, oversampling, overcompensatie, trimming...)
Daarbij hebben de instellingen van een de drie sensors ook nog onderling invloed op de andere sensors...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
buckfast_beekeeper

Golden Member

En toch is het blijkbaar best te doen. De fijnstofsensor werkt er perfect mee.

De broncode staat ook gewoon on-line.

Van Lambiek wordt goede geuze gemaakt.
Bavelt

Golden Member

Met uitzondering in de wintertijd, dan loopt je een uur voor (of achter) :-)

Ik had hier in het programma al een oplossing voor ingebracht:

pic basic code:

'====================================================================================================
 Sub Procedure SummerTime()
'====================================================================================================
 'Summertime
  If (Time[05] = 03) AND (Time[04] = 29) and
     (Time[02] = 02) and (Time[01]= 0) and (Time[0] = 0)  then
     I2C1_Start()
     I2C1_Wr(0xD0)
     I2C1_Wr(0x00)
     I2C1_Wr(0x00)   'Seconds
     I2C1_Wr(0x00)   'Minutes
     I2C1_Wr(0x03)   'Hour
     I2C1_Wr(0x01)   'Daynr
     I2C1_Wr(0x29)   'Day
     I2C1_Wr(0x03)   'Month
     I2C1_Wr(0x20)   'Year
     I2C1_Stop()
     Summer = 1
  End If

 'Wintertime
  If Summer = 1 then
     If (Time[05]= 10) and (Time[04] = 25) and
        (Time[02] = 03) and (Time[01] = 0) and (Time[0] = 0)  then
        I2C1_Start()
        I2C1_Wr(0xD0)
        I2C1_Wr(0x00)
        I2C1_Wr(0x00)   'Seconds
        I2C1_Wr(0x00)   'Minutes
        I2C1_Wr(0x02)   'Hour
        I2C1_Wr(0x01)   'Daynr
        I2C1_Wr(0x25)   'Day
        I2C1_Wr(0x10)   'Month
        I2C1_Wr(0x20)   'Year
        I2C1_Stop()
        Delay_ms(5)
        Summer = 0
     End if
  End If
 End sub 

Dit geldt voor nu alleen in dit jaar; ik zou dat natuurlijk wat kunnen uitbreiden met een jaren tabel.
Of wat chiquer is: de zomertijd gaat in de laatste weekend van maart, de wintertijd het laatste weekend van oktober. (in Europa dan).
Dan zou je dan natuulijk ook kunen toepassen ipv 'literals' in te brengen.

Ik zie overigens dat Arco ook al een oplossing had, rekening houdend met tijdzones.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Mijn opmerkingen zijn om je uit te dagen, niet om af te kraken. Ik heb je andere topic's ook gevolgd. Zie dat je geïnteresseerd bent om alles uit te zoeken.
Zelf in het verleden veel geprogrammeerd in PicBasic, maar ben ook zo begonnen als jij. Met iets kleins begonnen en steeds verder uit te breiden.

Zo vat ik het ook op. Ieder commentaar, postitief of negatief is een gratis advies... ;)
Ik ben inderdaad veel aan het uitzoeken en proberen. Zo ongeveer een dagbestediging geworden...
En dit forum is daar een prachtig leerinstrument bij. Ik vraag ook veel (soms te snel), en voel ik me af en toe wel wat schuldig. Vandaar dat ik - daar waar kan - ook wil geven. ;)

Ik ben na de aarzelende start met MikroBasic verder gegaan. Dit sloot ook het meeste aan op mijn ervaring met Visual Basic.NET.
Van MikroBasic vind je niet zo heel veel. Maar wel PicBasic en Proton basic, allemaal varianten die vaak wel te herleiden zijn.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zou ipv de DS1307 een DS3231 gebruiken, is veel nauwkeurigen en hoef je bijna nooit bij te stellen. De DS1307 houdt nogal slecht tijd. Voor de rest is het 1 op 1 vwb codering.

Ik heb al geëxperimenteerd met de DS3231, DS1307, TCN75, MCP9801 en BME280.

Met die dingen, die geen 'drol' kosten (met name die uit China), moet je denk ik wat geluk hebben.
Ik heb zelfs een schakeling gemaakt met meerdere tegelijk (leuke oefening).

Tot nu toe valt de DS1307 me mee qua nauwkeurigheid.
Voor de temperatuur is het een ander verhaal, daar zijn de verschillen redelijk groot. Een graad verschil heb je zó te pakken.
Punt is dat je ook een goede ijktemperatuur moet heen: wie geeft de juiste aan?

De BME280 vond ik een lastig ding om te doorgronden, tamelijk complex met compensaties, etc.
Ik kreeg hem overigens wel aan de praat.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

En nu uitbreiden met een DCF ontvanger.

Heb ik ook al een keer aan lopen denken...

Fouten zijn het bewijs dat je het probeert..