Seite 2 von 4

Verfasst: 07.03.2006 12:57
von Sylvia
Taster? Einfacher gehts kaum noch...

Pin1 mittels Taster an Pin4 verbinden

Schaltplan:
Bild

Code: Alles auswählen

; MVCom vorher in UserLibraries kopieren

ID=ComOpen("Com1:38400,n,8,1",1,1024,1024)

Repeat
	If ComGetDCD(ID)
		Beep_(1000,100); Kaffee machen...
	EndIf

	Delay(200)
ForEver
Nur mal um zu zeigen, dass es einfach ist Kontakt mit der Aussenwelt
aufzunehmen. Die meisten haben computertechnisch noch nie den
virtuellen Raum verlassen.

Die Ausgänge der RS-232 Schnittstelle sind normalerweise
kurzschlussfest und bis 10mA belastbar. Aber trotzdem: Alles was du
machst geschieht auf deine eigene Verantwortung. Ich will damit nichts zu
tun haben. Führe solche Versuche lieber an einem alten Rechner durch
und nicht gleich an deinem Hyperultra-5GHz-QuadPumped-HardCore-Laptop.
Wenn du dir unsicher bist was du tust, dann tu es lieber nicht.

Verfasst: 07.03.2006 14:23
von Lebostein
Hi,

also für eine Heizungssteuerung (sollte klein und ressourcenschonend sein) würde ich auf 3D-Sprites verzichten, da man dafür eine 3D-Grafikkarte und DirectX voraussetzen muss. Warum nimmst du nicht das Beispiel aus dem Codearchiv? Lässt sich noch ne Menge überflüssiger Code rausschmeißen. Ich habs mal für PB4.0 umgeschrieben:

Code: Alles auswählen

; www.purearea.net (Sourcecode collection by cnesm)
; Author: oppi
; Date: 22. November 2003
; OS: Windows
; Demo: No


; Variablen und Konstanten initialisieren

#version="(c) oppi 2003, V1.61"
#appname="ANACLOX"
#ininame="anaclox.ini"

Global width, height, winx, winy
Global box.l,s, PI2.f, PI.f, xm, ym, radius
Global tickcol.l, seccol.l, mincol.l, hcol.l, backcol.l, boxcol.l, jewcol.l, txtcol.l 
Global tid.l, info$, font.l,s.l,os.l
Global flagShowDay.l, flagShowInfo.l, flagOnTop.l

info$="ANACLOX V1.5"

PI2=ATan(1)*8
PI=ATan(1)*4

Structure xy
  xa.l
  ya.l
  xe.l
  ye.l
  xb.l
  yb.l
  xc.l
  yc.l
  xf.l
  yf.l
EndStructure

Global Dim ticks.xy(60)
Global Dim secs.xy(60)
Global Dim mins.xy(60)
Global Dim hrs.xy(60)

;- GUI Konstanten

#win=0
#clock=0

#set=0
#OnTop=0
#ShowDay=1
#ShowInfo=2
#setInfo=3
#default=8
#ver=9

#seccol=11
#mincol=12
#hrscol=13
#jewcol=14
#txtcol=15
#backcol=16
#boxcol=17
#tickcol=18


Procedure LoadPrefs(ininame.s)
  OpenPreferences(ininame)
  info$  =ReadPreferenceString("info",#version)
  width  =ReadPreferenceLong("width",300)  
  height =ReadPreferenceLong("height",300+30)  
  winx   =ReadPreferenceLong("winx",GetSystemMetrics_(#SM_CXSCREEN)/2-width/2) 
  winy   =ReadPreferenceLong("winy",GetSystemMetrics_(#SM_CYSCREEN)/2-height/2)
  boxcol =ReadPreferenceLong("boxcol",$ffffff)
  backcol=ReadPreferenceLong("backcol",$ffffff)
  tickcol=ReadPreferenceLong("tickcol",$aaaaaa)
  jewcol =ReadPreferenceLong("jewcol",$00ffff)
  seccol =ReadPreferenceLong("seccol",$0000ff)
  mincol =ReadPreferenceLong("mincol",$00ff00)
  hcol   =ReadPreferenceLong("hcol",$ff0000)
  txtcol =ReadPreferenceLong("txtcol",$111111)
  flagOnTop=ReadPreferenceLong("ontop",1)
  flagShowDay=ReadPreferenceLong("showday",1)
  flagShowInfo=ReadPreferenceLong("showinfo",1)
  ClosePreferences()
EndProcedure

Procedure savePrefs(ininame.s)
  CreatePreferences(ininame)
  WritePreferenceString("info",info$)
  WritePreferenceLong("width",WindowWidth(#win))  
  WritePreferenceLong("height",WindowHeight(#win))  
  WritePreferenceLong("winx",WindowX(#win)) 
  WritePreferenceLong("winy",WindowY(#win))
  WritePreferenceLong("boxcol",boxcol)
  WritePreferenceLong("backcol",backcol)
  WritePreferenceLong("tickcol",tickcol)
  WritePreferenceLong("jewcol",jewcol)
  WritePreferenceLong("seccol",seccol)
  WritePreferenceLong("mincol",mincol)
  WritePreferenceLong("hcol",hcol)
  WritePreferenceLong("txtcol",txtcol)
  WritePreferenceLong("ontop",flagOnTop)
  WritePreferenceLong("showday",flagShowDay)
  WritePreferenceLong("showinfo",flagShowInfo)
  ClosePreferences()
EndProcedure

Procedure resetPrefs(ininame.s)
  CreatePreferences(ininame)
  ClosePreferences()
  loadPrefs(ininame)  
EndProcedure

Procedure DrawClock()
  xm=WindowWidth(#win)/2 : ym=WindowHeight(#win)/2
  If ym<xm : radius=ym*0.98 : Else : radius=xm*0.98 : EndIf 
  font = LoadFont(0, "comic sans ms", radius*0.06) 
  ;- Koordinaten berechnen
  a.f=PI2 : t=0
  While a >= 0
   ticks(t)\xa=Sin(a+PI)*(radius*0.91)+xm
   ticks(t)\ya=Cos(a+PI)*(radius*0.91)+ym
   ticks(t)\xb=Sin(a+PI+PI/40)*(radius*0.89)+xm
   ticks(t)\yb=Cos(a+PI+PI/40)*(radius*0.89)+ym
   ticks(t)\xc=Sin(a+PI-PI/40)*(radius*0.89)+xm
   ticks(t)\yc=Cos(a+PI-PI/40)*(radius*0.89)+ym
   ticks(t)\xf=Sin(a+PI)*(radius*0.89)+xm
   ticks(t)\yf=Cos(a+PI)*(radius*0.89)+ym
   ticks(t)\xe=Sin(a+PI)*(radius*0.87)+xm
   ticks(t)\ye=Cos(a+PI)*(radius*0.87)+ym

   secs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   secs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   secs(t)\xe=Sin(a+PI)*(radius*0.84)+xm
   secs(t)\ye=Cos(a+PI)*(radius*0.84)+ym
   secs(t)\xf=Sin(a+PI)*(radius*0.75)+xm
   secs(t)\yf=Cos(a+PI)*(radius*0.75)+ym

   mins(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   mins(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   mins(t)\xb=Sin(a+PI+PI/40)*(radius*0.60)+xm
   mins(t)\yb=Cos(a+PI+PI/40)*(radius*0.60)+ym
   mins(t)\xc=Sin(a+PI-PI/40)*(radius*0.60)+xm
   mins(t)\yc=Cos(a+PI-PI/40)*(radius*0.60)+ym
   mins(t)\xf=Sin(a+PI)*(radius*0.60)+xm
   mins(t)\yf=Cos(a+PI)*(radius*0.60)+ym
   mins(t)\xe=Sin(a+PI)*(radius*0.80)+xm
   mins(t)\ye=Cos(a+PI)*(radius*0.80)+ym

   hrs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
   hrs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
   hrs(t)\xb=Sin(a+PI+PI/20)*(radius*0.50)+xm
   hrs(t)\yb=Cos(a+PI+PI/20)*(radius*0.50)+ym
   hrs(t)\xc=Sin(a+PI-PI/20)*(radius*0.50)+xm
   hrs(t)\yc=Cos(a+PI-PI/20)*(radius*0.50)+ym
   hrs(t)\xf=Sin(a+PI)*(radius*0.50)+xm
   hrs(t)\yf=Cos(a+PI)*(radius*0.50)+ym
   hrs(t)\xe=Sin(a+PI)*(radius*0.70)+xm
   hrs(t)\ye=Cos(a+PI)*(radius*0.70)+ym

   a-PI2/60
   t+1
  Wend

  ;- Ziffernblatt
  box = CreateImage(0, 2*xm,2*ym) 
  StartDrawing(ImageOutput(0)) 
  Box(0, 0,2*xm, 2*ym,boxcol) 
  Circle(xm,ym,radius,tickcol)
  Circle(xm,ym,radius*0.95,backcol)
  Circle(xm,ym,radius*0.09,tickcol)
  For t=0 To 59
    If t=0 Or t=15 Or t=30 Or t=45
      LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xb,ticks(t)\yb,tickcol)
      LineXY(ticks(t)\xb,ticks(t)\yb,ticks(t)\xe,ticks(t)\ye,tickcol)
      LineXY(ticks(t)\xe,ticks(t)\ye,ticks(t)\xc,ticks(t)\yc,tickcol)
      LineXY(ticks(t)\xc,ticks(t)\yc,ticks(t)\xa,ticks(t)\ya,tickcol)
      FillArea(ticks(t)\xf,ticks(t)\yf,tickcol,jewcol) 
    ElseIf t=5 Or t=10 Or t=20 Or t=25 Or t=35 Or t=40 Or t=50 Or t=55
      Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,jewcol)
      DrawingMode(4)
      Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,tickcol)
      DrawingMode(0)
    Else
     LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xe,ticks(t)\ye,tickcol)
    EndIf 
  Next
  StopDrawing()
EndProcedure

Procedure tick(value.l)
  Repeat
    s=Second(Date())
    If s<>os
      m=Minute(Date())
      h=Hour(Date())
      d$=Str(Day(Date()))
      If h > 12 : h=h-12 : EndIf
      h=h*5+m/12
      If h > 60 : h=h-60 : EndIf
     Debug h
      StartDrawing(ImageOutput(0)) 
      DrawingMode(0)

      Circle(xm,ym,radius*0.85,backcol)
      Circle(xm,ym,radius*0.09,tickcol)
      
      If flagShowInfo=#True
      FrontColor(txtcol)
      BackColor(backcol)
      DrawingFont(font)
      l=TextWidth(info$)
      DrawText(xm-l/2,ym+radius*0.40, info$)
      EndIf


      If flagShowDay=#True
      DrawingFont(font)
      l=TextWidth(d$)
      Box(xm-l/2*1.5,ym-radius*0.62,l*1.5,l*1.5,jewcol)
      DrawingMode(4)
      Box(xm-l/2*1.5,ym-radius*0.62,l*1.5,l*1.5,tickcol)

      DrawingMode(0)
      FrontColor(txtcol)
      BackColor(jewcol)
      DrawText(xm-l/2,ym-radius*0.60, d$)
      EndIf


      
;       ;- neue Zeiger malen
      LineXY(mins(m)\xa,mins(m)\ya,mins(m)\xb,mins(m)\yb,mincol)
      LineXY(mins(m)\xb,mins(m)\yb,mins(m)\xe,mins(m)\ye,mincol)
      LineXY(mins(m)\xe,mins(m)\ye,mins(m)\xc,mins(m)\yc,mincol)
      LineXY(mins(m)\xc,mins(m)\yc,mins(m)\xa,mins(m)\ya,mincol)
      FillArea(mins(m)\xf,mins(m)\yf,mincol,mincol) 

      LineXY(hrs(h)\xa,hrs(h)\ya,hrs(h)\xb,hrs(h)\yb,hcol)
      LineXY(hrs(h)\xb,hrs(h)\yb,hrs(h)\xe,hrs(h)\ye,hcol)
      LineXY(hrs(h)\xe,hrs(h)\ye,hrs(h)\xc,hrs(h)\yc,hcol)
      LineXY(hrs(h)\xc,hrs(h)\yc,hrs(h)\xa,hrs(h)\ya,hcol)
      FillArea(hrs(h)\xf,hrs(h)\yf,hcol,hcol) 

      LineXY(secs(s)\xa,secs(s)\ya,secs(s)\xe,secs(s)\ye,seccol)
      Circle(secs(s)\xf,secs(s)\yf,radius*0.03,seccol)

 
      StopDrawing()
      SetGadgetState(0,box)
      os=s
 ;     Delay(800); ein bischen warten, damit repeat until nicht soviel loopt
    EndIf
    Delay(1)  
  ForEver
EndProcedure

Procedure ToggleOnTop()
          If GetMenuItemState(#set,#onTop) = 1
            SetWindowPos_(WindowID(#win),#HWND_TOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE) 
            flagOnTop=1
          Else
            SetWindowPos_(WindowID(#win),#HWND_NOTOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE) 
            flagOnTop=0
          EndIf  
EndProcedure

;-main
LoadPrefs(#ininame)
box = CreateImage(0, width,height) 

;-create window
OpenWindow(#win,winx,winy,width,height,#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar,#appname)
CreateGadgetList(WindowID(0))
ImageGadget(#clock,0,0,width,height,box)
CreatePopupMenu(#set)
 MenuTitle(#appname+" settings")
 MenuItem(#OnTop,"always on top")
  SetMenuItemState(#set,#onTop,flagOnTop) 
  ToggleOnTop()
 MenuItem(#ShowDay,"show day")
  SetMenuItemState(#set,#Showday,flagShowDay)
 MenuItem(#ShowInfo,"show info")
  SetMenuItemState(#set,#ShowInfo,flagShowInfo)
 OpenSubMenu("change colors")
  MenuItem(#seccol,"seconds")
  MenuItem(#mincol,"minutes")
  MenuItem(#hrscol,"hours")
  MenuItem(#jewcol,"jewels")
  MenuItem(#txtcol,"text")
  MenuItem(#tickcol,"border")
  MenuItem(#backcol,"background")
  MenuItem(#boxcol,"box")
 CloseSubMenu()
 MenuItem(#setInfo,"change info")
 MenuBar()
 MenuItem(#default,"set defaults")
 MenuBar()
 MenuItem(#ver,#version)
  DisableMenuItem(#set,#ver,1)
 

;-draw clock
DrawClock()
tid=CreateThread(@tick(),0)
;SetWindowCallback(@SizeCallback())

;event loop
Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #WM_SIZE 
      PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
    Case #WM_RBUTTONDOWN 
      popx.l=WindowX(#win)+WindowMouseX(#win)
      popy.l=WindowY(#win)+WindowMouseY(#win)
      DisplayPopupMenu(0,WindowID(0),popx,popy) 
;      Case #PB_EventGadget
;        GadgetID = EventGadgetID()
;        Select GadgetID
;     
;        EndSelect
    Case #PB_Event_Menu
      MenuID = EventMenu()
      Select MenuID
        Case #onTop
          SetMenuItemState(#set,#onTop,GetMenuItemState(#set,#onTop)!1) 
          ToggleOnTop()  
        Case #ShowDay
          SetMenuItemState(#set,#Showday,GetMenuItemState(#set,#ShowDay)!1) 
          If GetMenuItemState(#set,#ShowDay) = 1 
             flagShowday=#True 
          Else 
            flagShowDay=#False
          EndIf  
        Case #ShowInfo
          SetMenuItemState(#set,#ShowInfo,GetMenuItemState(#set,#ShowInfo)!1) 
          If GetMenuItemState(#set,#ShowInfo) = 1 
             flagShowInfo=#True 
          Else 
            flagShowInfo=#False
          EndIf  
        Case #setInfo
          Repeat
          info$=InputRequester(#appname+" info text edit","your text has: "+Str(Len(info$))+" chars, max. 30 chars are allowed",info$)
          Until Len(info$)<30
          
        Case #default
          ResetPrefs(#ininame)  
          SetWindowPos_(WindowID(#win),#HWND_TOP,winx,winy,width,height,#SWP_SHOWWINDOW) 
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
          ToggleOnTop()
        Case #seccol
          seccol=ColorRequester()
        Case #mincol
          mincol=ColorRequester()
        Case #hrscol
          hcol=ColorRequester()
        Case #jewcol
          jewcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #txtcol
          txtcol=ColorRequester()
        Case #tickcol
          tickcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #backcol
          backcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
        Case #boxcol
          boxcol=ColorRequester()
          PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid) 
      EndSelect
  EndSelect
Until EventID = #PB_Event_CloseWindow
SavePrefs(#ininame)
CloseWindow(0)

Verfasst: 07.03.2006 15:28
von Sylvia
Wohl wahr, was Lebostein hier schreibt. Habe die 'Bahnhofsuhr' erst nach
Lebosteins Hinweis auf W2000 getestet. Funktioniert nicht. Abbruch mit
Fehler bei 'TransparentSpriteColor()'. Auf meinen Entwicklungsrechner
mit der entsprechenden Ausstattung funktioniert sie natürlich.

Auf dem W2000 Rechner ist DirectX 7.0 installiert. Graphikkarte ist eine
'NeoMagic Magic Graph256AV'. Lt. dxdiag ist sie nicht 3D-tauglich. :cry:

Verfasst: 07.03.2006 15:33
von Sylvia
Moment mal, irgendwas verstehe ich jetzt nicht (ich sage ja, ich bin zu
blöd für diesen Graphikmist !!).

Bei dxdiag heisst es: Direct3D-Beschleunigung nicht verfügbar.
Wenn ich aber 'Direct3D-Testen' aufrufe, verläuft der Test einwandfrei.
Also, was ist Sache jetzt ? :freak:

Verfasst: 07.03.2006 15:48
von MVXA
Mit OpenGL und PB4.0 kompilieren <)! Haste noch die Möglichkeit, dass
Windoof den oGL Part emuliert und du bekommst deine Anzeige.

Verfasst: 07.03.2006 17:27
von Spirit
Sylvia hat geschrieben:Moment mal, irgendwas verstehe ich jetzt nicht (ich sage ja, ich bin zu
blöd für diesen Graphikmist !!).

Bei dxdiag heisst es: Direct3D-Beschleunigung nicht verfügbar.
Wenn ich aber 'Direct3D-Testen' aufrufe, verläuft der Test einwandfrei.
Also, was ist Sache jetzt ? :freak:
Direct3D kommt auch ohne Hardwarebeschleunigung aus,
ist aber dann auch entsprechend langsamer.

Verfasst: 07.03.2006 23:19
von AND51
Danke Sylvia!

Kannst du mir beizeiten mehr erzählen? Muss für heute ausmachen.


Bis dann, AND51

Verfasst: 10.03.2006 15:48
von AND51
So, da bin ich wieder. Wo gibt es denn zum Beispiel einen solchen Taster, den ich Abfragen kann?
Oder soll ich einfach mal mit nem Draht probieren? Ich denke nicht...

Ich habe im Keller noch eine serielle Maus, kann ich die vielleicht auseinandernehmen und den linken und rechten Mausknopf für zwei eigenständige Knöpfe benutzen? Und wenn ja: Wie ist denn das mit den Innereien, also den Mikrochips? Und: Wird die Maus dann immernoch von Windows XP erkannt? Das will ich nämlich nicht, Windows sll selbst ersteinmal nix erkennen, ich will nur manuell mit PB (und MVCom) abfragen, welcher Knopf gedrückt wurde.

Die Lib MVCom habe ich mir auch schon mal angeguckt: Was bedeutet denn der ganze Klimbim mit "Handshake" und Stopbits? Letzteres kann ich mir vielleicht noch denken...

Verfasst: 10.03.2006 16:36
von Sylvia
>>Oder soll ich einfach mal mit nem Draht probieren? Ich denke nicht...

Warum nicht ? Elektrisch besteht zwischen einem Taster und einem Draht,
der kurzgeschlossen wird, kein Unterschied.

>>Ich habe im Keller noch eine serielle Maus, kann ich die vielleicht
>>auseinandernehmen und den linken und rechten Mausknopf für zwei
>>eigenständige Knöpfe benutzen?

Klar, geht auch. Aber nicht (oder nicht so leicht) im eingebauten Zustand.
Löte den (die) Taster aus...zwei Drähte dran die an Pin1 und Pin4 zur
RS-232 führen...und schon geht die Post ab.
Oder hast du irgendwo einen alten Klingeltaster rumfliegen ? Wäre
bestens geeignet!

>>Was bedeutet denn der ganze Klimbim mit "Handshake" und Stopbits?

Damit hast DU in der Regel gar nichts zu tun. Und ich will auch an dieser
Stelle gar nicht so tief für dich in die Materie einsteigen. Wenn du es
wissen willst (du MUSST aber nicht) dann mach dich im Internet schlau
oder kaufe dir entsprechende Fachliteratur.

Wenn du grundsätzliches Interesse an der ganzen Sache besteht, würde
ich dir empfehlen: Kaufe dir eine Relais-Karte die seriell angesteuert wird.
Gibts für ca.40.- Euro oder noch weniger. Damit kannst da dann elektrische
Geräte Ein/Ausschalten (PC-gesteuert) und erste Erfahrungen mit der
Schnittstelle sammeln. Und keine Angst: IST GANZ EASY !
[Edit: Wenn du damit elektrische Verbraucher mit 220V schaltest, dann
lasse dir dabei von jemandem helfen, der was davon versteht. Ich
möchte nicht, dass dabei ein Himmelfahrtskommando herauskommt!
]

Und/oder besorge dir ein ser. IO-Interface. Da hast du dann mehrere
Input-Leitungen (z.B. für Taster o.ä.) und mehrere Output-Leitungen
(z.B. für LED's o.ä.)

Verfasst: 10.03.2006 16:45
von AND51
Danke für die Infos. Ich werde mich mal weiter informaieren und nehme dann jetzt mal die besagte Maus soweit es geht auseinander.