Archive for the ‘Teknik’ Category

Nir Shaviv en intressant klimatforskare

28/11/2019

Jag har under ett antal år följt med Nir Shaviv i klimatdiskussionen. Shaviv hör till gruppen klimatforskare som, baserat på tung forskning och experiment, uppfattar att den egentliga drivkraften bakom klimatförändring genom historien är solen och inte t.ex. koldioxid.

Mitt intresse för Nir Shaviv ses kanske bäst i min vebbok (Science Fiction) ”Mars” där Nir Shaviv för ett antal år sedan figurerar i en klimatdiskussion under en färd till planeten Mars.

Nedanstående video (för personer som förstår engelska) är intressant och ställvis rätt rolig då Nir Shaviv är en bra talare!

Att stämma f-hålen på en fiol

27/10/2019

F-hålen på en fiol bidrar, då de är rått justerade, till att ge fiolen en oboeliknande klang. Jag var länge omedveten om denna typ av ton. Min son, yrkesviolinist, använde ett lånat högklassigt instrument ägt av någon av de finlandssvenska stiftelserna. Då jag provspelade instrumentet hörde jag tydligt strängens grundton som den låter på alla instrument men ovan på denna fanns en varm oboeliknande ton som ger en mycket trevlig karaktär åt tonen.

Bekantskapen med toppinstrumentet gav mig orsak till att börja söka efter den saknade tonfärgen. Rätt mycket experimenterande ledde mig fram till att tonen genererades av de svängande ”vingarna” vid f-hålen. Vingarna drivs av de stora svängande områdena som man hittar då man går från vingspetsen längs fiberriktningen (se bild). Förutsättningen för att vingarna skall fungera korrekt är att de är mekaniskt impedansanpassade till de svängande områden som driver dem. Min uppfattning är att det är möjligt att knacka sig till när f-hålsvingarna är korrekt injusterade, mera om detta nedan.

Fhålsvinge.png

Justeringsprocessen är:

  • Justera botten och lock så att tonen blir jämn och klar men lämna vingarna helt i fred. Vi vill att knacktonen då vi knackar från vingspetsen mot det drivande området skall vara högre än i det drivande området.
  • Om det drivande området klingar högre än tungan måste det slipas tills knacktonen är lägre än i tunga, Detta betyder sannolikt rätt mycket arbete med att få locket i balans på nytt d.v.s. alla kvadranter måste slipas på nytt.
  • Slipa mycket försiktigt, 5-10 drag max, en vinge som klingar högre än det drivande området. Effekten hörs mycket kraftigt men den tenderar att delvis backa tillbaka inom minuter till timmar. Det lönar sig att göra små justeringar över flera dagar och att lyssna noga. Var extremt noggrann med att inte slipa för mycket eftersom detta betyder att hela locket måste bearbetas före att vingens stämning skall vara möjlig.

Knackning för att mäta impedansanpassningen

Knacka försiktigt stegvis från spetsen av vingen mot det stora svängande området och lyssna på tonhöjden. För en korrekt justerad vinge vill vi ha ungefär samma knackningstonhöjd i vingen som i det svängande området, vi har då mekaniskt impedansanpassat de två svängande områdena. Vi justerar vingarna sist eftersom en justering kräver att vingens knackton före justering måste vara högre än drivområdets knackton. Vi knackar i många steg mellan områdena eftersom detta gör det lättare att uppfatta skillnader i tonhöjd.

Notera att då vi slipar vingen från baksidan med magnet så är effekten dramatisk. Börja med maximalt t.ex. 5 slipdrag med magneten och lyssna på resultatet. Om du slipar för mycket så lönar det sig att vänta några dagar innan man ger sig på de stora områdena för att kompensera. En slipad yta ger genast en rätt stor effekt strax efter slipningen, en effekt som klingar av delvis inder minuter, timmar och dagar. Om du har klantat så vänta några dagar eller veckor innan du jobbar vidare … det kan hända att problemet löser sig själv.

Vilken är skillnaden?

Vilken är skillnaden mellan en stämd vinge och en ostämd vinge? Jag gjorde ett enkelt test där jag stämde D-strängens vinge på min ”Klezmerfiol” som är en billig kines jag har jobbat kanske två år med att akustiskt stämma.

Jag spelade in tonen E på d-strängen eftersom jag uppfattar att denna ton på det här instrumentet har en kraftig pålagd ”oboeton”.  Jag spelade in ett antal stråkdrag med endast tonen E på programmet Audacity. Därefter lät jag programmet rita ut spektret för denna ton.

Fhål_D__raw.png

Vi ser att vi i den stämda tungan har ett mycket jämnt och kraftigt övertonsspektrum.

Följande skede var att lägga till massa i tungan så att den igen blir ostämd. Jag gjorde detta genom att limma maskeringstejp på tungan men inte över själva f-hålet. Resultatet är vara att massan ökar vilket gör tungan ostämd. Spektret mäts igen på samma sätt som tidigare.

Fhål_D_tejpat.png

Vi ser att övertonerna från fiolen kraftigt försvagades och tonen försämrades. Observera att de två första övertonstopparna dämpades med 9-10 dB vilket betyder att den absoluta ljudstyrkan minskar till en tiondel! Människans öras känslighet är dock logaritmisk vilket gör skillnaden mindre dramatisk men skillnaden är stor.

Notera!

Ovanstående spektra är inte helt representativa! En korrekt bild fås naturligtvis endast om jag spelar in den ostämda tungan innan den justeras varefter jag gör samma sak efter att tungan justerats. Problemet är att jag tänkte på att göra mätningen först då tungan justerats. En tunga till vilken ja lägger massa uppför sig naturligtvis inte exakt som den ursprungliga vingen som hade både mera massa men också mera styvhet.

Notera!

Det är skäl att gå mycket försiktigt fram. Justera i mycket små steg och låt instrumentet vila mellan justeringar och spela på instrumentet. Då du uppfattar att tonen är vad du vill ha är det skäl att sluta justera. Det är mycket lätt att bli alltför girig så att man förstör ett instrument genom att justera alltför långt varefter det inte längre går att backa!

Notera!

Jag uppfattar att det bästa sättet att lära sig att justera fioler är att utgå från t.ex. billiga kinesiska fioler i prisklassen 100 – 200 dollar på Ebay. Instrumenten är tekniskt väl byggda men ljudet på det ojusterade instrumentet är inget vidare eftersom fabriken sannolikt väljer ut väljudande instrument som säljs till högre pris.

 

Konspiration: Motstånd är lönlöst?

26/10/2019

Under det senaste året har man satt in en ny växel i klimatpropagandan. Man talar inte längre om den ”globala uppvärmningen” som blev ”klimatförändringen” efter att den förväntade katastrofen uteblev. ”Klimatförändringen” tillåter användning av ”muminväder” som propagandaverktyg. En muminväderleksrapport rapporterar: ”varmt, möjligen kallt, sol eller möjligen regn samt vind mellan syd och nord.” ”Klimatförändringen” eller ”klimatkrisen” som den nu heter när man bytt ut termen ger nu möjlighet att skrämma människor då det är varmt på sommaren, då det faller mera snö än normalt på vintern eller då vi inte har snö, då det regnar mer än normalt … eller mindre. Varje väderhändelse kan förknippas med ”klimatkrisen” som implicit naturligtvis har varit förorsakad av människan.

Jag skrev en insändare till Hufvudstadsbladet, som till min stora förvåning togs in, tack för det, som kritiserade tidningens ensidighet. Utgångspunkten var en ledare i tidningen den 4.10.2019 där ledarskribenten förvånar sig över att mer än halva befolkningen inte är villig att pruta på sin livskvalitet i klimatets namn. Jag konstaterade:

”Den kortsiktiga och inskränkta halvan av befolkningen som inte är villig att pruta på sin livskvalitet verkar förvåna HBL:s ledarskribent Tommy Westerlund i HBL 4.10.2019. Det kunde vara aktuellt för HBL:s ledarskribenter att plocka fram en stor spegel, tittar i den och att ställer sig frågan om de kanske har någon egen andel i detta.”

Tidningen har under det senaste året nästan dagligen haft helsidesartiklar om ”klimatkrisen” en kris som inte har någon som helst förankring i verkligheten. Klimatkrisen antas leda till att kustområden översvämmas, skördar minskar till följd av stigande temperatur och torka och oändliga mängder av klimatflyktingar flyr klimatkatastrofen … till Europa. Problemet är att ingenting av detta existerar i verkligheten. Havsytan stiger, som den gjort i århundraden, med 1-3 mm/år d.v.s. 10-30 cm per århundrade. Denna havsytehöjning dränker ingen och den är så långsam att ingen värdefull infrastruktur förloras eftersom infrastruktur som är hundratals år gammal inte har speciellt stort värde. En förutsättning för den antagna temperaturförstärkningseffekten i klimatmodellerna är att mängden vattenånga i atmosfären ökar vilket bör ge mera regn … statistiskt verkar kallperioder gå hand i hand med svår torka. Vi ser faktiskt många flyktingar men flyktingkrisen är nog främst förorsakad av överbefolkning och krig med aktiv hjälp från bl.a. oligarken George Soros som har producerat en pamflett med instruktioner om hur man tar sig in i Europa och vilka argument man skall använda för att få stanna. De kriser George Soros har fått till stånd tidigare har varit mycket lönsamma för honom och antalet döda han är orsak till  är det nog ur hans synvinkel inget att orda om. Shit happens!

Jag konstaterade:

”Vi har under några år sett en klimatpropaganda i alla media som skulle ha gjort Tiedonantaja d.v.s. de finska extremkommunisternas språkrör på 1970-talet grönt av avund. Propagandan har varit av en sådan kaliber att ingen tänkande människa kan undgå att notera att att det finns ett antal frågor som det inte är politiskt korrekt att kritisera ens i en bisats.”

Samhället satsar idag mycket stora summor på att lösa ett problem vars grunder aldrig på allvar har diskuterats i vårt samhälle utan ”problemet” har accepterats som gudagivet uppifrån. Klimathysterins ursprung hittar man i slutna kabinett bland världens superrika elit d.v.s. de vi ofta kallar oligarker med rötter som ligger mycket nära 1930-talets ”Tredje rike”. En viktig spelare har varit Romklubben som fungerar som elitens tankesmedja.  År 1991 publicerade Romklubben boken ”The first Global revolution” som naturligtvis beskriver diskussioner som går årtionden tillbaka i tiden. Vi hamnar på 1970-talet:

“In searching for a common enemy against whom we can unitewe came up with the idea that pollution, the threat of global warming, water shortages, famine and the like, would fit the bill. In their totality and their interactions these phenomena do constitute a common threat which must be confronted by everyone together.” (The First Global Revolution – A Report by the Council of the Club of Rome, p.75)

Översatt till svenska:

”Då vi sökte efter en gemensam fiende mot vilken vi kunde enas kom vi fram med idéen att nedsmutsning, global uppvärmning, vattenbrist, svält och liknande skulle fungera bra. Totalt sett och i samverkan så utgör dessa fenomen ett gemensamt hot som alla tillsammans måste möta.” (The First Global Revolution – A Report by the Council of the Club of Rome, sida 75)

Politiker har länge varit medvetna om att massorna lättast leds genom att hålla dem rädda så att politikerna som herdar kan rädda sin tacksamma hjord. Det spelar ingen roll om problemen är verkliga eller inte, det viktiga är att undersåtarna är rädda så att de accepterar de ”lösningar” eliten för fram. Den gemensamma nämnaren för alla de skapade ”problemen” är att det krävs en global organisation för att lösa dem.

Den globala regering man strävar efter kommer att kräva resurser och idealet är naturligtvis beskattning som världen accepterar som nödvändig och som samtidigt är outsinlig. En i praktiken outsinlig beskattningsresurs är världens energianvändning.

Ett extra lager byrokrati som har autoritet över nationalstaterna gör elitens grepp över världen fastare genom att världens beslutsfattare, då de är relativt få, kan köpas genom ekonomiska privilegier eller genom direkta mutor om det utlovade lyxlivet inte är tillräckligt. Hur det hela kan komma att utvecklas ser man då t.ex. George Soros verkar ha fri tillgång till möten med nyckelpersoner i FN och i EU. Soros är miljardär men han har aldrig demokratiskt valts till någon befattning varken  i FN eller i EU.

I Finland slösar vi bort hundratals miljoner Euro på t.ex. understöd till vindkraft som i praktiken är en värdelös form av energiproduktion eftersom den varierar slumpmässigt vilket gör att det krävs i praktiken lika mycket reservkraft för att säkerställa tillgången till energi då det inte blåser och ofta i vårt klimat samtidigt är kallt. De resurser vi har slösat bort på tusen år gammal teknik, vindkraft, har inte gett oss någon global teknisk fördel och investeringarna kommer ge mycket dålig avkastning om ens någon avkastning alls. Understöden till opålitlig bortkastad vindkraft mostsvarar ungefär kostnaden för de uppskattningsvis 4400 vårdare vi skulle behöva i åldringsvården.

Media utsätts idag för en stor ekonomisk press från främst internet. Varför skall jag betala för information jag själv gräver fram från nätet? Ofta kan jag tydligt identifiera källan som Radio/TV eller tidningen har använt, en källa jag har sett redan några dagar tidigare. Resultatet är naturligtvis att det finns en stark press att rationalisera och skära ner på antalet medarbetare. Då tidningens spalter fortfarande måste fyllas med något material för att det skall finnas köpare och prenumeranter så måste innehållet hittas, billigt, på annat håll. Mycket material finns idag färdigt i en form som i stort sett kan lyftas över i tidningen. Organisationer som WWF, Greenpeace och andra producerar färdigt material som är extremt billigt att använda. Problemet är dock att dessa organisationer naurligtvis inte gör arbetet gratis utan man driver sin egen agenda genom att man skapar sig gratis distributionskanaler. För att systemet skall fungera krävs att det finns färdigskrivna artiklar som dagens journalister kan ta i bruk under eget namn. Mycket bekvämt!

EU parlamentarikern Nils Torvalds kommenterade problemet med användning av obskyrt material som inte producerats av tidningen själv i samma nummer av Hbl som ledaren jag hänvisade till ovan. Problemet är alltså känt på högsta nivå men det är inte politiskt korrekt att påpeka att gratismaterial kanske inte alla gånger behöver vara fullt tillförlitligt eller neutralt.

Den 22.10 kommenterade Kristian Stenius mitt inlägg. Kommentaren gick i gammalt mönster där ingenting han skriver egentligen har något att göra med vad jag skrev. Jag citerar:

Konspiratioinsteoriere får inte ta över debatten (rubriken är sannolikt satt av Hbl). Lars Siléns hätska och dåligt underbyggda attack mot HBL:s sätt att skriva om klimat och energifrågor  (HBL debatt 13.10) kräver en kommentar … också jag ställde mig för tjugo år sedan tveksam till vindkraft … produktionsvariationerna kompenseras med reglerkraft och styrning av elkonsumptionen.” (min understrykning)

Vi är tydligen ganska överens då jag själv skrev: ”De subsidier man årligen ger till vind- och solkraft vilka kräver hundraprocentig kontinuerlig reservkraft, och således är värdelösa, motsvarar ungefär kostnaden för de 4400 vårdare man idag saknar.”

Kristian Stenius konstaterar också att elproduktionen i Finland då Olkiluoto 3 tas i bruk nästa år kommer att vara utsläppsfri till 90%. Det här är bra men problemet är att vad händer om Olkiluoto 3 tvingas stänga under vintern då vi har svår köld?

Vi skulle behöva gå mycket längre på kärnkraftens område. Vi har fyra reaktorer två i Lovisa och två i Olkiluoto som snart faller för åldersstrecket. De här reaktorerna måste relativt snabbt ersättas med nya kärnreaktorer men procerssen för att få tillstånd att bygga reaktorer är komplicerad och mycket dyr. Vi borde skapa en lagstiftning som säger att en reaktor som gått igenom tillståndsprocessen och som har fått drifttillstånd kan dupliceras som sådan med mycket lite byrokrati. Endast en helt ny modell såsom Olkiluoto 3, som är en prototyp, skulle behöva tillstånd enligt det tunga formuläret.

Det finns flera konstruktioner för små kärnreaktorer med en effekt på ca. 150 MW som till följd av sin storlek kan byggas så att de inte kan råka ut för härdsmälta (tänk Fukushima). Tanken med många små reaktorer är att kärnan med några års mellanrum byts mot en ny modul och den gamla renoveras på fabriken.  Små reaktorer av denna typ kunde placeras inne i tätorter för att automatiskt med mycket lite personal producera elektricitet och fjärrvärme. Utnyttjandet av reaktorns spillvärme höjer verkningsgraden till över 90% jämfört med de existerande reaktorernas verkningsgrad på ca. 40%.

Rubriken på Kristian Stenius inlägg ”Konspirationsteorier får inte ta över debatten” för osökt tankarna till den gröna rörelsens rötter:

Teknologie doktor Jarl Ahlbeck kommenterar Kristian Stenius analys i Hbl angående 90% utsläppsfri elproduktion år 2020. Ahlbeck skriver:

”Finland har under de senaste åren skrotat ca. 3000 MW egen elproduktionseffekt. Den är utkonkurrerad av billig import, subventionerad vindkraft och koldioxidhandel. Då elförbrukningen samtidigt har ökat har Finland vid sträng kyla och vindstilla ett effektunderskott på ca. 4000 MW (mer än två stycken Olkiluoto 3, min kommentar) som måste avklaras genom import. Importeffekten är cirka 1500 MEW från Ryssland mestadels fossil kondenskraft på natten då förbrukningen är låg , plus ca. 2500 MW vattenkraft från Sverige och Norge.”

Kristian Stenius kommentar att man också styr konsumtionen betyder att vi medvetet har börjat vandringen mot att bli ett u-land. Vill vi faktiskt ha en situation där jag som konsument kontinuerligt måste kontrollera energipriset för att jag skall våga sätta på tvättmaskin eller en situation där eltillgången områdesvis stängs av (förr kallades detta ransonering)? Saken blir inte bättre av att eliten nog förväntar sig rätt att använda privatflygplan, ha tillgång till många bostäder och ett energifotavtryck som kan vara tiotals gånger större än för Medelsvensson.

Rätt komponent och fel komponent!

23/10/2019

Jag har fått lasern för min vibrationsmätare för fiol. Efter att ha experimenterat med lasern bl.a. byggt en strömkälla med konstant ström (ca. 20 mA) så har det visat sig att lasern speciellt vad gäller den inbyggda ljusdetektorn inte uppförde sig som väntat. För att komma vidare med felsökningen beslöt jag att öppna en sensor, jag har fem stycken, för att kontrollera att ljusdetektorn faktiskt existerar. Det finns många exempel på att ljusdetektorn lämnats bort av kostnadsskäl medan anslutningsbenet finns kvar.

Jag slipade försiktigt bort toppen av laserkomponenten med hjälp av en diamantfil och tittade på innanmätet i mikroskop.

P1000885.JPG

Laserchipen i halvledarlasern är lödd till ett vertikalt ”torn” i metall.  Tornet är den positiva polen. Den andra polen är lödd med guldtråd till ett av benen på komponenten, benet syns till vänster i bilden.

Ljusdetektorn vars ursprungliga uppgift har varit att mäta laserns intensitet kan ses i följande bild då vi fokuserar om mikroskopet.

P1000886.JPG

Ljusdetektorn finns i botten av komponenten. Den ena polen är igen lödd direkt till den positiva stommen och den andra polen är lödd med guldtråd till  ett eget ben.

ADL-65052TL_laser.png

Laserns datablad visar hur helheten fungerar. Halvledarlasern är dioden LD som matas från ben nummer två i framriktning. För att inte bränna lasern måste den drivas med konstant ström ca. 20 mA.

Den andra dioden PD är backad och den används som fotodetektor. Strömläckaget genom den backade detektordioden är proportionell mot ljusintensiteten.

Man får en bild av dimensionerna då man noterar att diametern på den fönsterförsedda delen är 3,55 mm. Man ser de aktiva komponenterna med en bra lupp men mikroskop är att föredra.

Slutkommentar

Det ser ut som om den laserkomponent jag beställde är äkta vilket betyder att jag måste fundera vidare på varför jag inte får det resultat jag förväntar mig.

Orsaken till att jag skar upp lasern var att jag i något skede beställde ett antal TIP120 effekt darlingtontransistorer. Transistorerna har legat en tid i miljonlådan och jag tänkte använda en TIP120 eftersom den, det är en darlingtontransistor, har hög strömförstärkning på över 1000. Konstruktionen fungerade inte riktigt som väntat varför jag mätte den och fick strömförstärkningen hfe=100. Då jag tittade närmare på transistorn märkte jag att förpackningen också var fel d.v.s. de kära kineserna hade antagligen köpt en sats konventionella NPN effekttransistorer billigt och därefter ändrat typangivelsen till TIP120 som är något dyrare. I detta fall blev jag alltså blåst … smile!

Att behandla symptom men inte orsak. Relativ och absolut risk (statiner)

08/10/2019

Vi lever i en intressant tid då snart varje äldre person ordineras statiner oberoende av om medicinen egentligen ”behövs” eller inte. Statinerna är den grupp av mediciner som har hämtat in mest pengar någonsin till läkemedelsindustrin. Frågan uppstår då i vilken grad den extrema statinordinationen är business och i vilken mån den är medicinskt motiverad.

Jag hittade en intressant kalkylator för beräkning av risken för hjärtproblem.

Jag plockade fram lite utgångsdata för friska personer:

Totalt cholesterol: 200 – 239 mg/dl på gränsen till hög.

LDL:  <100 mg/dl,  100 – 129 nära optimal.

HDL: <40 mg/dl risk, 40 – 59 mg/dl ju högre dess bättre, >60 mg/dl skyddar mot hjärtproblem.

Blodtryck Systoliskt: 120

Blodtryck Diastoliskt: 80

Det är intressant att notera att om jag använder data från NIH (National Institute of Healt) och använder ”optimala” nivåer så rekommenderar kalkylatorn alltid medelhög eller hög dos statiner.

Jag lägger in följande värden:

HDL (bra kolesterol) = 100 mg/l  då rekommendationen säger att HDL över 60 skyddar mot hjärtproblem och stroke.

Totalt kolesterol lägger jag till 199 mg/dl då rekommendationen är optimalt mindre än 200 mg/dl.

Min ålder sätts till 65 år. Jag gissar att åldern oberoende av andra värden ger rekommendationen ät moderat eller mycket statiner.

Systoliskt blodtryck sätts till 120 vilket är normalt för alla åldrar.

Diastoliskt blodtryck sätts till 80 vilket är normalt för alla åldrar.

Dessutom säger jag att jag inte äter blodtrycksmedicin och jag har inte diabetes d.v.s. allting bör vara helt normalt och kalkylatorn ger svaret:

Statinrekommendation

Sorry men jag uppfattar kalkylatorn som bondfångeri.

Om vi accepterar resultatet så ser vi att risken för hjärtattack på årsbasis ligger på ungefär 0,75% d.v.s. mindre än en person på hundra uppskattas råka ut för en hjärtattack. Den absoluta risken ovan är strax under 1/130 för en icke letal hjärtattack. Om statinernas relativa riskminskning antas vara ca. 30% så betyder detta att risken då statiner används minskar till ungefär 0,525% d.v.s. ungefär 1/190 per år.  För att vi skall spara ett enda människoliv behöver vi då behandla ungefär 400 sannolikt friska personer med statiner. Forskning visar att användning av statiner sannolikt i viss mån minskar risken för hjärtattack eller blodpropp i hjärnan men den totala dödligheten i statingruppen minskar inte d.v.s. andra dödsorsaker som sannolikt beror av statinerna dyker upp i stället.

Vi vet att statiner kan ha allvarliga biverkningar och att en betydande del av användarna kan få allvarliga bieffekter. Bieffekterna kan också vara dödliga t.ex. till följd av blockering av produktionen av CoQ10 som är nödvändigt för energiproduktionen i hjärtat. Resultatet kan vara plötsligt hjärtstopp. Det finns indikationer på att läkemedelsindustrin manipulerar data om hur vanliga dessa biverkningar är, metoden är pre-screening d.v.s. försökspersonerna sätts på kortvarig behandling och patienter som i detta skede visar bieffekter tas inte med … forskningsfusk!

Vilka är då biverkningarna? Listan nedan är inte komplett.

  • Muskelsmärtor som kan påminna om träningsvärk men som i vissa fall kan vara invalidiserande.
  • Muskelskador vilka som biverkning kan ge njurskador då nedbrytningsprodukterna skall elimineras. Muskelskadorna kan också bli permanenta.
  • Nervskador som kan försvåra användninga av t.ex. fingrar. Sannolikt en följd av att skyddet runt nerver delvis försvinner/skadas (fetter).
  • Minnesproblem inklusive total förlust av närminnet. Normalt är problemet temporärt men det kan återkomma om statinanvändningen fortsätter.

Problemet med ovanstående lista är att de ofta av läkare tolkas som symptom på normalt åldrande.

Finns det alternativ till användning av statiner?

Världens kanske främsta kemist någonsin, Linus Pauling, som till följd av bredden i sitt tänkande har fått två personliga Nobelpris har rätt övertygande visat vad som är orsaken till kranskärlssjukdomarna mänskligheten idag lider av. Paulings förklaring visar att uppbyggnaden av plack i artärerna är en följd av ett underliggande problem inte orsaken. Att blockera en för människan livsviktig produktion av kolesterol är att behandla symptomen och inte den underliggande orsaken till problemen.

Bakgrund exempel från djurvärlden

Det finns ett litet antal djurarter som i likhet med människan har förlorat förmågan att producera C-vitamin ur glokos (socker). De stora aporna, marsvinet och någon fladdermus har en genetisk defekt i det sista skedet av C-vitaminsyntesen som gör att C-vitamin inte bildas utan det måste tillföras genom maten.

Experiment med marsvin visar att då man minskar mängden C-vitamin i Marsvinets kost så utvecklar djuret samma kranskärlsskador som en människa d.v.s. kranskärlen blockeras och djuret kan dö av hjärtattack precis som en människa.

Man har uppskattat att en Gorilla via maten, den äter under nästan hela sin vakna tid, sätter i sig ungefär fem gram C-vitamin per dag. Gorillor i fångenskap tenderar att få bristfällig mat och lider av stress vilket man vet att det höjer C-vitaminbehovet. Resultatet är C-vitaminbrist som leder till blockering av kranskärlen och eventuellt hjärtattack och död.

Koppling till skörbjugg

Akut brist på C-vitamin leder till skörbjugg. Skörbjugg har många symptom av vilka några ges nedan:

  • Ger upphov till svår depression
  • Tandlossning då produktionen av kollagen stoppar eftersom kollagenproduktionen i kroppen kräver C-vitamin. Kroppen består till 25-30% av kollagen som är det ”limämne” som håller ihop kroppen.
  • Ledproblem eftersom slitytorna i lederna kräver högklassigt kollagen som inte produceras.
  • Ryggproblem som uppkommer bl.a. då kollagenet blir av så dålig kvalitet att kuddarna (diskarna) mellan ryggradens kotor inte klarar belastningen utan det uppstår diskbråck. Diskbråck kan vara extremt smärtsamt om nerver hamnar i kläm eller kommer i kontakt med bråckytan.
  • Slumpmässiga blånader på olika delar av kroppen uppstår till följd av att det kollagen som behövs i blodådrorna är av så dålig kvalitet att ådrorna läcker med blånader som följd.
  • Hjärnblödning om läckaget sker i hjärnan.

Listan kan göras ännu längre eftersom kollagenet har en ytterst central roll i kroppens funktion. Man har uppskattat att det tog läkarvetenskapen över 700 år att acceptera att skörbjugg kunde botas med C-vitamintillskott t.ex. genom att äta cittrusfrukter. Det är då inte speciellt förvånande att vi ser mängder av sjukdomar som i grunden kunde kallas kronisk skörbjugg men som läkarvetenskapen inte accepterar.

Den rekommenderade C-vitaminmängden idag enligt Amerikanska normer är 50-100 mg. Mängden är tillräcklig för att eliminera de akuta bristsymptomen och snabb död men frågan är om mängden är tillräcklig för att förhindra skador vid långvarig brist (om vi antar att t.ex. 75 mg per dag leder till kronisk C-vitaminbrist).

Uppskattning av C-vitaminbehov

Det är rätt enkelt att göra en uppskattning av hur mycket C-vitamin det behövs för att kroppen skall må bra. Det finns koncensus på att kroppen förnyas rätt fullständigt på ungefär sju år. Man uppskattar att kroppen består till 25-30% av kollagen som således också måste förnyas i samma takt. Vi kan då enkelt uppskatta den dagliga kollagenproduktionen på följande sätt om vi antar en kroppsvikt på 80 kg (80 000g):

Kollagenprod = 0,3*80000/(7*365)

Kollagenprod = 9,4 g/dag

f2f618_w

Bilden visar en kollagenfiber som består av tre sammansvetsade proteinfibrer.

Kollagen bildas genom polymerisering (kemisk sammansvetsning) av tre proteinfibrer. En fiber svetsas till en granne vart tredje varv. Då vi tittar på det bildade kollagenet så ser vi att mängden C-vitamin (som förstörs vid processen) som behövs för att tillverka perfekt kollagen är ungefär densamma som vikten av det bildade kollagenet. För att bilda perfekt kollagen så förbrukar kroppen således enligt ovanstående beräkning ungefär 9 gram C-vitamin per dag.

Vi ser att det finns en klar konflikt mellan ovanstående beräkning och den rekommenderade dosen på 75 mg. Beräkningen visar att vi för att producera högklassigt kollagen behöver ca. 120 ggr mera C-vitamin än vad läkarvetenskapen anger. Linus Pauling som levde till 93 års ålder drog sina egna slutsatser och konsumerade 18 gram C-vitamin per dag med motiveringen att upp till 50% av C-vitamindosen förstörs i tarmen.

Det är självklart att kollagen bildas också då det är brist på C-vitamin men kvaliteten blir allt sämre. Vi såg ovan att optimalt producerat kollagen kräver ca. 9 gram C-vitamin per dag. Om det inte finns tillräckligt C-vitamin så bildas kollagen men polymeriseringen försämras d.v.s. fibrerna sitter allt sämre ihop. I stället för en stadig kollagenfiber bildas fluffig ”vadd” som inte klarar mekanisk belastning. Vid en C-vitamindos på 75 mg per dag ser vi att ungefär en svetspunkt av hundratjugo är svetsad. Vid den nedre gränsen strax innan en människa får akut skörbjugg är ungefär en svetspunkt på tvåhundra svetsad.

Vilka är de kroniska följderna av C-vitaminbrist?

Man kan vänta sig att kronisk C-vitaminbrist ger liknande symptom som akut skörbjugg men processen fortskrider långsamt över år eller årtionden. Vilka ”ålderssymptom” ser vi i befolkningen?

  • Alla tandläkare kontrollerar vid varje besök tänderna för att detektera tandlossning. Tandlossning är epidemisk bland äldre människor i vårt samhälle. Ä detta en följd av kronisk skörbjugg?
  • Min personliga gissning är att socker endast är en delorsak till att det bildas hål i tänderna. En annan orsak är att C-vitaminbrist lämnar tänderna oskyddade mot bakterieangrepp då de porösa kanalerna i tänderna inte på ytan skyddas av kollagen.
  • Ledproblem. Är detta ett symptom på kronisk skörbjugg.
  • Ryggproblem. Är detta ett symptom på kronisk skörbjugg?
  • Depression. Vi ser epidemisk depression i vårt samhälle. Är detta ett symptom på kronisk skörbjugg?
  • Hjärtproblem. Är detta ett symptom på kronisk skörbjugg?

Sambandet mellan kransartärssjukdomar och C-vitaminbrist

Kransartärerna arbetar under högt tryck och stora mekaniska rörelser. Detta kräver en god kvalitet hos det kollagen som håller ihop blodådern. Då kollagenkvaliteten vid C-vitaminbrist börjar likna vadd eller poröst tyg uppstår det mikroläckage. Kroppen gör då temporära reparationer av läckaget genom att plugga igen läckan med vax (kolesterol). Då kroppen senare har tillräckligt mycket C-vitamin så kan skadan repareras permanent med kollagen. Vid kronisk C-vitaminbrist kommer aldrig den dag då det finns tillräckligt C-vitamin för en bestående reparation. I stället uppstår nya mikroskador som kroppen igen pluggar igen med kolesterol … med åren kommer så småningom hela den skadade ådern att fyllas med kolesterol (fett) och resultatet kan bli en hjärtattack. Om vi då vi har C-vitaminbrist använder t.ex. Statiner för att förhindra kollagenproduktion så leder detta till att kroppens reservsystem för reparation av skador på blodådror skadas. I stället för ”blodpropp” i hjärtat eller hjärnan ökar då risken för t.ex. hjärnblödning som är mycket dödligare än en blodpropp.

Enligt ovanstående resonemang är alltså högt kolesterol kroppens sätt att reparera skador förorsakade av C-vitaminbrist. Om vi medicinerar mot kolesterolet så angriper vi endast ett symptom och resultatet kan bli svåra skador på hjärna, nerver e.t.c. eftersom kolesterol har många viktiga funktioner i kroppen.

Notera att socker konkurrerar om samma kanaler genom cellmembranen som C-vitamin använder för att komma in i en cell. Dagens epidemi av typ 2 diabetes och därigenom förhöjd blodsockernivå kan förväntas försvåra en redan existerande C-vitaminbrist.

Hur ersätta Statiner och bota den underliggande orsaken

Vi kan bota den underliggande C-vitaminbristen genom att äta mera C-vitamin. Behovet är flera gram per dag utspritt över dygnet (ingen engångsdos). Problemet är dock att en delvis blockerad blodåder fortfarande är blockerad även om vi äter mera C-vitamin. Vi måste ge kroppen möjlighet att eliminera placket.

Linus Pauling konstaterade då placket kom på tal att det för varje fysikalisk kemist är självklart hur placket kan elimineras.

Placket är kemiskt fäst i blodåderväggen. För att placket skall kunna elimineras måste fästpunkterna neutraliseras så att inte kolesterol på nytt fastnar i blodåderväggen. Pauling konstaterade utgående från plackets och blodåderväggens kemiska struktur att det behövs L-Lysin för att neutralisera fästpunkterna. Resultatet blir att placket långsamt löses bort och transporteras till levern där det förbränns.

Pauling/Rath protokollet för att eliminera kranskärlssjukdomar är mycket enkelt:

  • 6-9 gram C-vitamin taget över dagen (inte som en enkel dos)
  • 6-9 gram L-lysin taget över dagen
  • Prolin 1-1,5 gram

Det finns mängder av rapporter att protokollet fungerar och att lindring för t.ex. angina pectoris fås inom dagar till veckor beroende av hur svåra blockeringarna var. Några exempel på effekten av Pauling Rath protokollet hittas här.

Observera att protokollet endast innehåller billiga och inte patenterbara komponenter. Själv äter jag ca. 5 gram C-vitamin per dag, mera om jag känner symptom på t.ex. förkylning. Jag köper C-vitamin kilovis. Ett kilogram C-vitamin kostar ca. 25 Euro. Jag beställer C-vitamin över nätet antingen från Polen eller från England. Lysin kostar 50-80 Euro per kg och Prolin kostar ca. 100 Euro per kg. En några veckors kur kostar således en spottstyver jämfört med konventionell behandling. Den enda kända bieffekten av stora doser C-vitamin är gaser och lös mage. Om dessa symptom uppträder så experimenterar man fram en lägre dos som eliminerar problemet.

Linus Pauling världens enda ensamma dubbla nobelprisvinnare och mottagare av tiotals hedersdoktorat diskuterar orsakerna till kardiovaskulära sjukdomar och hur dessa rätt enkelt kan botas. Linus Pauling fick hela läkarskrået emot sig men det finns otaliga exempel på att Pauling Rath protokollet fungerar och de underliggande orsakerna till sjukdomen elimineras i stället för att som idag behandla symptomen. Dagen läkarvetenskap är en industri som är flera gånger större än telecomindustrin. Onödig behandling av kardiovaskulära sjukdomar i form av ballongutvidgning, statiner e.t.c. omsätter hundratals miljarder dollar per år.

 

En intressant berättelse om Statinskador hittar man på bloggen Space Doc.

Dr. Duane Graveline läkare för bl.a. astronauter på NASA började efter rekommendation från sin egen (!) läkare efter en hälsokontroll äta statiner. Artikeln är en beskrivning av vad som hände under flera år fram till Dr. Duane Gravelines död.

Att leka jurist!

24/08/2019

Jag fick nyss ett intressant brev på posten från Polisen, en ordningsbot på 170 Euro. Jag hade enligt polisen kört 72 km/h på en plats där hastighetsbegränsningen är 60 km/h. Överhastigheten är då 12 km/h vilket enligt trafiklagens 103 § ger 170 Euro i böter om överskridningen är under 15 km/h.

IMGP6220.JPG

Så här ser situationen ut då jag åkte och kontrollerade platsen ikväll. Saken verkar skenbart rätt klar vi har en tydlig skylt med hastighetsbegränsning 60 km/h eller hur och strax på andra sidan av korsningen finns en kamera och sensor i vägen (sensorn också efter korsningen)?

Om jag kommer körande från Sjundeåhållet så är Sjundeåvägens hastighetsbegränsning 80 km/h som tar slut vid anslutningen till riksväg 51 det finns alltså inget trafikmärke som anger att det skulle vara 60 km/h begränsning om jag svänger från Sjundeå mot Hangö. Tolkningen är då att den allmänna hastighetsbegränsningen i Finland utanför tätort avgör hastigheten efter korsningen då man svänger mot hastighetskameran. Notera att den aktuella hastighetskameran är den som är längre mot höger i bilden (det finns två hastighetskameror i bilden). Kameran närmare korsningen fångar bilar i riktning mot Helsingfors.

IMGP6224.JPG

Notera att jag då jag kommer från Sjundeåhållet har 80 km/h begränsning men trafikmärke, triangel,  för förkörsrätt för bilar på riksväg 51. Det finns inget trafikmärke som anger att hastigheten skulle vara begränsad till 60 km/h om jag svänger från Sjundeå mot Hangö/Ekenäs en bit längre fram kanske 200 m finns en hastighetsbegränsning på 100 km/h. Enligt trafiklagen bör då tolkningen vara att hastighetsbegränsningen efter korsningen i riktning Hangö då är 80 km/h. Resultatet är alltså att trafikkameran har mätt hastigheten på min bil till 72 km/h på ett område där 80 km/h är tillåten hastighet. Jag känner att glorian på mitt huvud riktigt lyser då jag har kört fint och försiktigt. Det är kanske skäl att notera att lagen knappast tillåter att bilar som kör längs längs 51 mot Hangö har en annan hastighetsbegränsning än de bilar som svänger till 51:an från Sjundeå mot Hangö. Om bilar på 51:an och bilar som svänger mot Hangö från Sjundeå är lika inför lagen så betyder detta att hastighetsbegränsningen efter vägskälet är 80 km/h och inte 60 km/h helt enligt trafiklagen.

Kontroll #1

Då man befinner sig på den plats där den första filden är tagen och tittar över riksväg 51 ser man en sidoväg med hastighetsbegränsningen 30 km/h som är ansluten till riksväg 51.

IMGP6229.JPG

Hastigheten på riksväg 51 har ändrats till 80 km/h mellan Sjundeåvägens avtag och bildens avtag. Hastighetsbegränsningen vid en sväng till höger mot Helsingfors är inte angiven med trafikmärke till 80 km/h utan det är självklart att vägtrafiklagens allmänna begränsning gäller d.v.s. 80 km/h. Vi ser tydligt att trafikplanerarna har varit medvetna om detta. Om jag vill svänga till vänster mot Hangö så kör jag i den riktningen in i ett område med hastighetsbegränsningen 60 km/h varför man där slarvigt satt en hastighetsbegränsningsskylt 60 km/h på vänster sida av vägen för att påminna bilar som svänger från sidovägen att hastighetsbegränsningen är 60 km/h och inte 80 km/h. Den korrekt placerade, på höger sida, hastighetsbegränsningsskylten för korsningsområdet  finns en bit upp i backen till vänster om bilden. Slutsats: Om hastighetsbegränsningen är annan än den allmänna hastighetsbegränsningen på 80 km/h så skall detta anges med skylt. Om skylten inte finns så gäller den allmänna hastighetsbegränsningen d.v.s. 80 km/h.

Kontroll #2

På väg till övervakningskameran kanske 5 km i riktning mot helsingfors finns en motsvarande T-korsning mellan Isonsuontie och riksväg 51. På riksväg 51 är hastighetsbegränsningen 80 km/h och på Isonsuontie så är begränsningen 60 km/h.

IMGP6219.JPG

Notera triangeln som visar att 51:an har förkörsrätt. Däremot finns det i likhet med Sjundeåvägsavtaget ingen skylt som anger hastighetsbegränsning. Om jag svänger till höger i bilden så antas 51:an ha hastighetsbegränsningen 80 km/h eftersom inget annat anges.

Det kan vara intressant att notera att kameran som mätte min hastighet tidigare fanns framför korsningen d.v.s. i ett område som otvivelaktigt har 60 km/h begränsning enligt klar markering med trafikmärke. Då man senare ville ha en kamera också före korsningen i riktning mot Helsingfors så kombinerade man tydligen strömmatningen och dataförbindelsen för båda kamerorna (kostnadsskäl?) vilket ledde till att den ena kameran plötsligt befinner sig i 80 km/h område men bötfäller enligt 60 km/h begränsning.

Det blir intressant att se vilken effekt mitt klagomål kommer att ha. Jag kommenterar klagomålet senare då jag får svar från polisen.

Nyckelharpa i barnstorlek justering

03/06/2019

Jag har byggt en barnharpa med mensuren 340 mm i huvudsak efter Sören Åhkers ritningar. Sören är en trevlig person som det är lätt att kommunicera med och samtidigt en av de nyckelhapsbyggare som regelbundet har fått mycket gott betyg för sina harpor. Avsikten med bygget är att undersöka om det är lättare eller svårare för en fiolspelman att spela på en mindre harpa där mensuren ligger betydligt närmare fiolens. Personligen har jag störts av att spela på en fullstorleksharpa då det gäller att spela i det högre registret d.v.s. det register där man på en fiol skulle spela på E-strängen. Klaviaturens storlek på en stor harpa leder till stora handrörelser motsvarande lägesspel på en stor altfiol.

IMGP5971.JPG

Bilden visar den nya barnharpan i relation till min fullstora harpa. Klaviaturen är ca. 50 mm kortare än klaviaturen på den stora harpan. En fullvuxen hand bör då ha betydligt bättre räckvidd på den lilla harpan är på en harpa av full storlek.

Följande skede i byggprocessen blir nu att i små steg börja justera in harpan. Min uppfattning om instrument är att ett bra instrument är ett instrument där man har lyckats eliminera så många fel som möjligt.  Jag hoppas kunna dokumentera felsökningsprocessen med ljud och bild i ett antal kommande artiklar.

Vilka fel har jag noterat i detta skede

Mina finstämmare för Cello (3/4 – 4/4 storlek) är för små. Detta gör att rörelsen i finstämmaren blir mycket liten innan strängens ändkula rör i stränghållaren. Min tanke är att jag byter till större finstämmare (storlek 4/4 cello) då de levereras efter någon vecka. Alternativet är att korta av stränghållaren en aning. Byte av finstämmare uppfattar jag vara enklare och mera rationellt i detta skede då stränghållaren redan är ytbehandlad. Det var naturligtvis en miss från min sida att inte i tid upptäcka att 3/4-cello finstämmarna egentligen är för små. Jag kan leva med detta problem en kort tid.

A-strängen fungerar i princip rätt bra men tonen är inte så brilliant som jag skulle vilja ha den. Detta justeras i ett senare skede.

D-strängen (jag stämmer C-G-D-A räknat från basen inte CGCA vilket är traditionellt) marginellt användbar men den tänder dåligt. Justeringen av G-strängen kommer också att påverka D-strängen positivt. Orsaken till att jag stämmer CGDA är att fingersättningen då är lika som på fiol vilket gör det lättare att spela både nyckelharpa och fiol.

G-strängen tänder mycket dåligt. Mycket ”murrig” och ”sträv” i tonen.

Det första steget blir att justera ljudpinnens plats för att hitta möjligast god ton utan andra justeringar. Det här steget är viktigt eftersom man vet att ljudet kan förändras kraftigt till följd av väldigt små ljudpinneförflyttningar. Jag vill inte göra oåterkalleliga justeringar på instrumentet innan ljudpinnejustering har gjorts eftersom senare förflyttningar av ljudpinnen annars kan leda till behov av ytterligare helt onödigt slipande.

Jag kommer att börja med att försöka få G-strängen att fungera korrekt och senare justera D- och A-strängarna. Det är möjligt att A-strängen fixar sig själv då man får G- och D-strängarna att fungera.

Det första steget i justeringen av G-strängen blir (om det behövs … vilket är sannolikt) att kontrollera och efterjustera kanalen mellan halsen och basbjälkens övre ända. På en fiol blir tonen väldigt torr och sträv om motsvarande område är för tjockt/styvt. Den här barnharpans nyckellåda har konstruerats så att det finns plats att slipa den kritiska övre basbjälkekanalen. Utrymmet mellan lock och nyckellåda i min fullstora harpa är för litet för att tillåta efterjustering genom inre slipning. Bara den lilla harpan fås spelbar så kan jag plocka isär den stora harpan och modifiera den så att den effektivt kan efterjusteras.

Om erfarenheterna från fioler går att applicera så kan det också vara värt att tunna ut området strax ovanför bassidans f-hål. Dessa förändringar bör tydligt förbättra G-strängens respons.

Om D-strängen efter justeringen av G-strängen blir för svag (relativt sett) så brukar man kunna förstärka tonen genom att slipa området några centimeter ner från bassidans  f-hål.

Också stallet kan justeras men min erfarenhet är att inre graduering ger betydligt starkare effekt än stallsjustering. Om andan faller på justerar jag eventuellt också stallet då harpan i övrigt börjar vara OK.

Fioltrimning … Oooops!!!

01/05/2019

Jag har i ungefär två års tid jobbat med att optimera en kinesisk fiol som jag idag kallar min Klezmerfiol d.v.s. fiolen används för spelning av klezmermusik.

Jag ropade in fiolen på e-bay för $111 + frakt d.v.s. totalpriset inklusive moms och frakt kom att ligga på ca. 200 Euro eller grovt översatt till svenska kronor 2000 sek. Fiolen köptes ursprungligen för att den skulle fungera som demonstrationsobjekt för inre justering för fiolbyggarna i finland (Suomen viulunrakentajat ry.) då vi hade en utställning gällande fiolbygge och justering i samband med Folklandia kryssningen 2018.

Jag har specialiserat mig på efterjustering av fioler genom justering av lockets och bottenplattans tjocklek något som kallas re-graduering. Efterjusteringen sker så att fiolen hela tiden är spelbar och justeringen sker genom slipning av kritiska punkter från insidan i små steg. Fiolen slipas varefter den provspelas och därefter slipas på nytt utgående från det akustiska resultat man uppnådde.

Fiolen fixades så att vi som teknisk demonstration hela tiden inför publik bytte ljudpinnen mot en ljudpinne med korrekta dimensioner och korrekt skärning. De kinesiska metallsträngarna byttes mot Pirastro Tonica som inte är speciellt bra men de är billiga jämfört med t.ex. dominant eller Eva Pirazzi. Därefter justerade vi ljudpinnens plats för bästa möjliga ljud. Resultatet var en i princip spelbar fiol d.v.s. fiolen hade inga externt synliga direkta byggfel men ljudet var nasalt och tråkigt. I likhet med de flesta billiga fioler så var basen hes och torr.

Om man tittar på fiolens spektrum så ser man att torrheten beror på att basens grundtoner på g-strängen saknas i princip helt och hållet. Den mänskliga hjärnan hör raden av harmoniska övertoner som produceras av instrumentet och hjärnan lägger själv till den saknade bastonen … men detta görs aldrig fullt ut vilket gör att att de låga tonerna inte är fylliga utan ”torra”.

Torrheten kan enkelt justeras bort genom att göra området mellan basbjälkens övre ända och halsklossen tunnare. Slipning på detta område ger en extemt kraftig effekt och man bör gå fram i små steg säg 10-15 slipdrag fram/tillbaka mellan provspelningar eftersom resultatet om man slipar för mycket kan bli en mörk ”råmande” (tänk ko) ton som inte är önskvärd. Kinesen krävde (extremt) mycket slipande här för att få tonen på plats.

Efter justeringen av basen justeras bottenplattan så att den klingar d.v.s. den får inte vara stum. De viktigaste områdena brukar vara tvärs över locket strax ovanför nederändans kloss och strax nedanför halsklossen.  Det gäller här att vara försiktig så att man inte slipar för mycket uppe vid halsen eftersom detta kan ge upphov till en vargton i trakten av A…H.

Om hur man gör Oooops!

Jah har en längre tid uppfattat att fiolen fungerar ungefär som jag vill ha den. En fiolspelande vän, yrkesviolinist,  som använder axelstöd (vilket jag normalt inte gör) kom på besök och jag lånade honom mitt axelstöd. Jag fick egentligen bara lovord över fiolen men då jag själv spelade fiolen med axelstöd så tyckte jag att fiolen lät lite torr i mina öron (axelstödet påverkar ofta fiolens ljud helt hörbart genom att axelstödet klämmer ihot fiolen från sidorna). Jag tänkte inte vidare på orsaken till problemet … det är ju lätt att åtgärda genom lite slipning.

Torrheten är ju inget problem att åtgärda så jag slipade lite till vid kanalen mellan basbjälke och halskloss vilket löste problemet. På morgonen nästa dag lät fiolen fortfarande bra men jag upptäckte att jag hade slipat ett litet hål vi halskanalen (se bild, mycket pinsamt natuligtvis 😉 ).

Den intressanta frågan uppstod då hur man fixar detta problem på ett snyggt sätt utan att skära loss locket? Min lösning blev att jag skar en liten träflisa från ett lockämne för fiol som jag råkade ha på lager. Jag formade spånan så att den är något större än hålet varefter jag limmade träflisan (svagt) på en supermagnet. Bilden är tagen innan flisan/spånan har rundats/jämnats med sandpapper. Notera att träspånan är limmad på en liten supermagnet som är något mindre än själva spånan. Den stora supermagneten som syns i bilden är en hjälpyta vid bearbetningen av träbiten.

Med hjälp av en yttre magnet kunde jag nu föra lappen till hålet .

Lappens kant kan nu ses vid hålets högra kant under de yttre hjälpmagneterna. Jag tvingade in lim från yttre sidan (flödigt) och flyttade lappen av och an så att den skulle få lim jämnt över hela ytan. Därefter flyttade jag lappen till önskat läge och lämnade kvar en magnet som limpress (den yttre limpressen kan vara precis den slipmagnet som gjorde hålet).

”Limpressen” är på plats.

Då limmet hade torkat tillräckligt tvättade jag bort överloppslimmet från utsidan. Hjälpmagneten på vilken lappen hade limmats togs bort genom att använda en lite större magnet som hammare för att slå loss hjälpmagneten från lappen, detta fungerade helt problemfritt.

Lappen är nu på plats utan ytterligare skador. Lappen är vänd så att ådringen i stort sett går vinkelrätt mot lockets ådring.

Följande steg blev nu att fixa skadan så att den är möjligast osynlig. Eftersom fiolen är åldrad på konstgjord väg beslöt jag att inte försöka återställa lackytan till ursprungligt skick … i stället ”smutsade” jag lappen med mjuk blyertspenna varefter jag drog ett lager brunt betslack över stället. Resultatet är att lappen ser ut ungefär som övriga skador på locket vilket var avsikten med övningen.

Reparationen påverkar inte ljudet på fiolen hörbart men det är självklart att det här instrumentet inte skall slipas mera. Orsaken till att jag slipade hål på locket var att ändan på basbjälken styrde slipmagneten exakt över ett väldigt begränsat område. I framtiden måste jag tänka på att inte vid slipningen ligga och stödja mot ändan av basbjälken. Slipningen skall alltså medvetet spridas ut över en större yta.

Om någon i Sverige är intresserad av att provspela instrumentet så kommer det att finnas på Ekebyholm den 23-27.6 2019 där jag kommer att vara deltagare.

Hur kan denna reparationsteknik användas

Det kan av olika skäl uppstå sprickor i ett fiollock. I vissa fall är sprickan så liten att det inte lönar sig att skära loss locket för reparation utan sprickan limmas och sprickan dras ihop med något lämpligt verktyg. Problemet är dock att en lagning av denna typ sällan blir beständig om man inte limmar ett eller flera såkallade frimärken över den limmade sprickan. Ovanstående lagning visar hur man enkelt kan limma ett frimärke över en spricka i en fiol utan att ta loss locket.

Äggplotter, bygg själv!

05/02/2019

Det är alltid kul att lära sig något nytt och att tvingas motionera de små grå cellerna innanför det grå håret med problemlösning och felsökning av något man aldrig har lekt med tidigare.

Det är snart påsk igen, som baha’i ser jag fram mot baha’i nyår Naw Ruz … i båda fallen har ägg en plats i måltiderna i anslutning till dessa högtider. Det är för övrigt intressant att se hur många sedvänjor med en ursprungligen Zoroastrisk bakgrund (från det antika Persien) lever kvar i olika sedvänjor från Afghanistan till Spanien. Sedvänjorna har helt enkelt modifierats så att de passar ihop med den lokala religionen varefter man kan glömma varifrån sedvänjorna kommer.

I den Nordiska traditionen hör ägg, ofta snyggt målade, till påsktraditionen. Man färgar ägg på olika sätt. Själv minns jag hur man kokade ägg tillsammans med lämpliga växter för att ge äggen en trevlig färg. Senare har jag många gånger ritat figurer på ägg tillsammans med barnen. Vad är då naturligare än att använda moderna hjälpmedel för att göra mera avancerade utsmyckningar t.ex. i form av geometriska mönster som är alltför arbetsdryga eller komplicerade för att göras för hand.

Videon ovan visar en Ägg skrivare som dock ser relativt komplicerad ut 🙂 . Det här projektet använder dock betydligt bättre, och dyrare stegmotorer än vad jag använde.

Jag hittade en variant som kan skrivas ut med 3d skrivare och som såg snygg och väl genomtänkt ut. Bygget av den varianten och problem i anslutning till detta bygge beskrivs i den här artikeln. Jag utgick från den här äggplottern:

Vad behöver jag för projektet

Filerna som behövs för 3d utskrift av mekaniken hittar man på thingiverse i form av en stl-fil. Stl är en beskrivning av hur de mekaniska delar som skall skrivas ut med 3d skrivare ser ut. Innan skrivaren kan skriva ut komponenten måste stl-filen vidarebehandlas av ett lämpligt program som skär upp föremålet i en serie skikt  som 3d skrivaren sedan kan rita ut skikt för skikt och på såsätt långsamt bygga upp hela det föremål som skrivs ut. Jag använder programmet slic3r för att vidarebehandla stl-filen. Skrivarprogrammet jag använder är Repetier-Host V1.6.2.

Problem #1

Min 3d skrivare klarar av att skriva ut föremål med dimensionerna ca. 200x200x200 mm³.  Det visade sig att alla delar till Ägg skrivaren fanns i samma fil som kräver en betydligt större skrivare än den jag har. Alternativen är då att antingen hitta någon firma med en skrivare med tillräckligt stor byggyta … eller att modifiera stl-filen så att bitarna kan skrivas ut på min skrivare. Jag valde det senare alternativet.

Då jag själv konstruerar föremål som skall skrivas ut på 3d skrivare så använder jag programspråket openscad för att designa föremålen. Jag kan enkelt läsa in en stl-fil i openscad:

storbit1

Jag använder helt enkelt kommandot import( … ); för att läsa in stl-filen som ett enda stort föremål. Därefter använder jag kommandot difference() på den inlästa filen och använder stora lådor (klossar) som skär bort de delar jag  för tillfället inte vill se. Det spelar inte någon roll på vilket område på skärmen den kvarvarande delen finns, den centreras automatiskt av skrivaren.

Jag klippte söner stl-filen i tre olika föremålsgrupper d.v.s. skalet blev två olika bitar och de små mekaniska delarna blev en egen grupp. De olika beskurna delarna skrevs sedan ut separat. Jag antar att motsvarande funktionalitet finns i de flesta CAD-program som stöder 3d utskrift.

Utöver plastdelarna behövde jag två stycken små kullager, skruvar i olika dimensioner som jag klippte till lämpliga längder med hjälp av en Abico-tång. Lager hittade jag på en lokal järnaffär och skruvar har jag på lager i olika dimensioner.

Hopplockning av styrelektroniken

Skalet är konstruerat för en Arduino UNO med stor USB (typ B) kontakt. Jag har olika varianter av processorkortet på lager så jag valde helt enkelt en som fysiskt var kompatibel med en Arduino Uno. Processorkortet kostar kanske sex dollar på ebay.

Ett litet RC-servo av lämplig storlek hittade jag i miljonlådan (Tower Pro micro servo 9g). Ett servo kan beställas från ebay för någon dollar.

Jag hittade stegmotorn inklusive drivkort ULN2003 hos en elektronikaffär i Åbo och beställde den över nätet (https://www.triopak.fi/fi).

Jag monterade styrelektroniken utan att ännu bygga in den i det 3d utskrivna skalet. Jag ville enkelt kunna testa servot och stegmotorerna utan att ideligen öppna skalet på apparaten. Det började nu dyka upp problem …

Problem #2

Jag kunde utan problem kompilera drivprogrammet och ladda ner det på Arduinokortet. Då jag försökte få kontakt med äggskrivaren genom programmet Inkscape dök det upp problem. Ritprogrammet Inkscape för vilket det finns en tilläggsdel för att driva äggskrivaren verkade inte över huvudtaget kunna se Arduinoprocessorn.

Problemet visade sig bero på att då jag via min dator försöker komma i kontakt med Arduinon så skickar datorn via USB en DTR signal (data terminal ready) som på UNO är kopplad till Reset d.v.s. UNOn startade om då jag öppnade kommunikationen mot UNO. I sig är detta inget problem, jag behöver bara vänta på att Arduino Uno startar om varefter linjen är öppen och bör fungera i fortsättningen.

På en linuxdator söker Inkscape efter äggskrivaren genom att öppna en serieförbindelse i taget varefter programmet väntar på att UNO startar om varefter Inkscape skriver ‘v\r\n’ d.v.s. ber om äggskrivarens versionsinformation. Om svaret kommer inom en vettig tid så vet Inkscape var äggskrivaren finns och kan börja skicka kommandon till skrivaren. Orsaken till problemet är att en Linuxdator har tillgång till en stor mängd potentiella serieportar ocxh det krävs lång tid för att beta av alla portar … så lång tid att jag gav upp 😉 . Den lösning jag fastnade för var att läsa av om Arduino Uno var kopplad till min dator. Detta kan kontrolleras med hjälp av kommandot:

lsusb

Bus 002 Device 005: ID 248a:8367
Bus 002 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 002 Device 060: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 002 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Man kan enkelt identifiera den egna anslutna USB-enheten i mitt fall Arduino Uno-kortet genom att först ge kommandot lsusb utan att kortet är anslutet varefter man ansluter kortet och ger kommandot på nytt. Den nya rad som dyker upp innehåller den kod jag vill ha. Jag har märkt ut den aktuella raden med fet stil ovan.

Kommandot listar alla USB anslutna apparater på datorn. I princip har UNOn en unik identifikationsadress. Jag modifierade Inkscapes sökprogram så att det först tittade efter min specifika Arduino UNO innan den försöker söka igenom alla andra serieportar. Äggskrivaren hittas nu snabbt och bekvämt utan problem.

Eggbot tilläggsdelen för Inkscape finns i en linuxdator i katalogen:

~/.config/inkscape/extensions

Programmet jag modifierade var: ~/.config/inkscape/extensions/ebb_serial.py .

Jag lade in mitt Arduino UNOs id i raden:

if port[2].startswith(”USB VID:PID=1A86:7523”):

Koden 1A86:7523 fick jag från lsusb-kommandot ovan.

Problemet med att Arduino UNO startar om då en yttre enhet försöker ansluta över USB kan elimineras genom att bryta en förbindelse på kretskortet om Arduinon är en äkta Arduino Uno. I mitt fall är det fråga om en kopia från vilken man har lämnat bort den här egenskapen. Nackdelen med att kapa ifrågavarande hopptråd är att programmeringen blir besvärligare. Inom ca. en sekund efter att man börjar ladda upp program till Arduinon måste man trycka på reset på Arduinokortet … reset-tryckningen har eliminerats i Arduino Uno genom att låta DTR sköta saken men då dyker det upp ovanstående problem.

Problem #3

Min ena stegmotor av typen 28BYJ-48 var defekt. Stegmotorn råkade vara kopplad till armen som styrde pennan. Något kugghjul inne i motorns kuggväxel (64 ggr nedväxling) är defekt vilket leder till att motorn stoppar i ett specifikt läge.  Jag bytte ut motorn varefter det fungerade.

Problem #4

Då jag testade stegmotorerna med en verklig bild genom Inkscape så visade det sig att motorerna gick relativt varma och de snurrade endast i en riktning. Orsaken var att instruktionerna för hur styrsignalerna fron Arduino skulle kopplas till drivkortet var felaktiga. In/ut pinnarna 2,3,4,5 styr IN1, IN2, IN3 och IN4 på stegmotorns drivkort. Det visade sig att jag för korrekt funktion måste kasta om pinnarna 3 och 4. Kopplingen till stegmotorn blev då:

pin 2 –> IN1

pin4 –> IN2

pin3 –> IN3

pin5 –> IN4

På mitsvarande sätt måste pinnarna för den andra stegmotorn kopplas:

pin 8 –> IN1 (drivkort #2)

pin10–> IN2

pin9 –> IN3

pin11–>IN4

IMGP0849_mod.JPG

Bilden visar processorkortet Artduino UNO till vänster (blått) samt två stegmotordrivkort (vita) baserade på kretsen ULN2003. Drivkorten är inget stegmotorkontrollkort utan uttryckligen en serie transistorer som kan kopplas på och av under processorkontroll. Arduinin kontrollerar bitmönstret för varje steg.  För att en stegmotor skall stega måste en serie bestämda bitmönster genereras som genererar önskade magnetfält inne i stegmotorn och bitmönstrena måste skickas till motorn i korrekt ordning och ordningsföljden byter om man vill backa …

En stegmotorkontroller behöver egentligen endast två signaler steg och riktning en kontrollkrets kan oftast också justera strömmen genom stegmotorn vilket kan användas till bl.a. att justera motorns effekt och motorns temperatur. En riktig stegmotorkontroller innehåller egen intelligens och den genererar själv korrekta bitmönster för stegning framåt och bakåt. Det finns avancerade stegmotorkontrollers som också på egen hand klarar av att accelerera och decelerera. Man kan inte abrupt ändra stegfrkvensen på en stegmotor eftersom den då kan tappa bort steg vilket blir pinsamt om maskinen som styrs inte mäter den exakta positionen … vilket i allmänhet inte görs om man använder stegmotorer.

De fyrpoliga sladdarnas ledare i mitten (på de vita korten eller på arduino men inte båda) måste kastas om för att stegmotorn skall stega i båda riktningarna.

Efter att ett antal gånger ha plockat ihop äggskrivaren och sedan isär igen började grundfunktionerna se korrekta ut. Hålen i de 3d utskrivna mekaniska bitarna tenderade att vara för små vilket krävde filande samt varmluftsblåsare. Då ett hål nästan är korrekt kan man värma komponenten varefter man pressar på den med milt våld varvid passningen blir exakt. Någon bit värmde jag så mycket att den ändrade form vilket löstes genom att skriva ut en ny bit.

Ägghållaren vid rotationsstegmotorn använder en O-ring som friktionsyta mot ägget. Vid den fria axeländan som är kullagrad finns motsvarande något mindre O-ringsyta som trycks mot ägget med hjälp av en metallfjäder. Metallfjäderns längd kan justeras med hjälp av en mellanbricka som kan skrivas ut med 3d skrivare i olika tjocklekar. Tanken  är att ägget skall vara stadigt monterat men man får inte trycka så hårt att ägget går sönder. Det är extremt viktigt att ägget inte rör sig medan äggskrivaren skriver eftersom detta dödar all precision. Mer om injustering senare i artikeln. Jag är inte övertygad om att min konstreuktion som använder O-ringar nödvändigtvis fungerar speciellt bra. Tiden får utvisa och då måste något annat system prövas.

IMGP0858_mod.JPG

Pennans drivmekanik. Den lilla stegmotorn till höger i bilden vrider pennan kring centrum av ägget. Vi ser  den vita servoarmen som används för att höja/sänka pennan. Pennan trycks mot ägget av dess egen tyngd. Vi ser o-ringen  vid rotationsmotorn som fungerar som friktionsyta för att hålla ägget på plats.  Den fjäderbelastade hållaren för äggets spetsiga ända syns nere till höger.

IMGP0857_mod.JPG

Äggskrivaren sedd från en annan vinkel. Observera att pennans lyftservo är monterat på den vertikala armen som är monterad på stegmotorn i mitten.

Arbetsprocess för att rita på ett ägg

Vi använder programmet Inkscape som är ett öppet källkodsprogram som finns att ladda ner gratis för Windows, Masc och Linux. Jag kör sedan många år endast Linux och jag har inte ens Windows installerad på mina två arbetsmaskiner. Nedanstående är inte någon ingående instruktion för hur man använder Inkscape. Det finns goda instruktioner för detta om man googlar Inkscape.

Då vi monterar ägget är det viktigt att det är möjligast väl centrerat vilket vi kan kontrollera t.ex genom att utan penna vrida ägget ett varv. Detta kan vi enkelt göra genom att skapa en Inkscape bild med storleken 4070×800. Från dokumentets vänstra kant till dokumentets högra kant dras en rät linje mitt på dokumentet. Använd View/Zoom Out så att hela bildytan kan ses då strecket ritas från kant till kant.  Om vi utan penna ”skriver ut” detta dokument så kommer ägget att vridas 360 grader runt sin axel. Genom att hålla ett lämpligt föremål som referens mot skrivarbasen kan vi kolla om avståndet mellan referensföremålet hålls konstant genom varvet eller om avståndet varierar. Om vi sder betydande variationer lönar det sig att försiktigt flytta ägget vid någondera ändan så att felet blir så litet som möjligt. Det lönar sig att experimentera.

OneTurnInkscape

En hjälpbild som består av endast ett enda streck tvärs över bilden kan användas till att kontrollera att ägget roterar precis ett varv och att det sitter korrekt monterat utan att kasta av och an då det roterar.

Under Extensions/Eggbot/ hittar vi EggBot control. Med denna kontroll kan vi kontrollera att lyftning/sänkning av penna fungerar samt skriva ut en bild i Inkscape.  Vi börjar med att skriva ut (utan penna) vår räta linje för att kontrollera att ägget är centrerat och att det roterar precis ett varv.

Vi öppnar nu ett nytt dokument antingen så att vi skapar det själv eller så att vi laddar ner ett mönster vi gillar från nätet. Vi måste nu justera bildens storlek så att den precis fyller hela ägget utan att överlappa. För min skrivare med 28BYJ-48 stegmotorer och ULM2003 styrkretsar skall dokumentets storlek sättas till ungefär 4070(bredd) x 800 (höjd). Den bild vi har läst in kan manuellt justeras till den bredd vi vill ha.

Ett test av utskrift från Inkscape visar att skrivaren i princip fungerar men det är extremt viktigt att:

  • Ägget centreras korrekt så att det inte blir några kast då det roterar
  • Pennan ställs in till lämplig höjd så att den ritar också vid ytterlägena
  • Pennan ställs i mittläge innan ritningen påbörjas. Det finns annars risk för att pennan slår i ägghållaren i ändläget vilket kan lösgöra ägget delvis så att det gungar av och an.

Provritning gav resultatet nedan vilket inte ännu är så bra.

IMGP0863.JPG

Då man tittar noga på bilden ser man att det är en springa mellan ägget och tjockändans O-ring vilket gör att denna ända av ägget abrupt hoppar av och an med intressanta resultat vid utritningen.  Jag glömde att dra fast skruven som håller pennan vilket ledde till att pennan gungade av och an beroende av pennans rörelseriktning.

Jag kommer att modifiera tjockändans fastsättning för att åtgärda felen. Jag är helt optimistisk på att skrivaren ännu kommer att fungera helt OK.

Tack till alla kända och okända på nätet som har lagt ner mycket arbete på både utveckling av programvara och hårdvara.

Den extremt billiga och samtidigt kompakta stegmotorn 28BYJ-48 är inte bra till följd av att den är utväxlad. Kugghjulen i kuggväxeln är aldrig perfekta och speciellt i en sådan här billig motor så finns det glapp d.v.s. om vi ritar en linje i en rörelseriktning och sedan byter riktning så kommer det att finnas ett obestämt område till följd av glapp. Lösningen skulle vara bättre stegmotorer som inte är utväxlade men detta betyder samtidigt att en stor del av mekaniken måste förnyas. Byter man stegmotorerna så får man dock mycket bättre exakthet vid ritandet.

Modifierad fastsättning av ägget

Jag konstaterade ovan att ägget gungade av och an i upphängningen gjord av O-ringar. Orsaken var att O-ringens dimension i förhållande till ägget blev fel. Ägget låg antagligen delvis direkt mot ändplattan vilket gjorde att det kunde glida sidlänges vilket i sin tur gjorde ritandet mycket inexakt.

Jag hittade röda flaskkorkar av gummi (se bild nedan). I finland är det här traditionella korkar som man speciellt hittar på hösten vid saftningstider. Jag köpte en påse korkar och klippte sönder en som blev en ca. 7 mm djup mjuk ägghållare. Resultatet blev mycket bra och precisionen förbättrades radikalt.

IMGP0883.JPG

Med den modifierade hållaren blir ritandet reproducerbart, räta linjer som går runt hela ägget träffar startpunkten igen efter ett varv … något som inte hände tidigare.

IMGP0882.JPG

Notera den 3d utskrivna pennhållaren. Jag skrev också ut en hållare för tre pennor i vilka pennorna kan förvaras utan kork. Den extra pennadaptern gör det mycket enklare att montera pennerna exakt och lika för alla pennor.

Planerade vidare modifiationer

Det finns fortfarande ett tydligt kännbart glapp i pennans stegmotor till följd av stegmotorns växellåda med utväxlingen 1:64 d.v.s. stegmotorn roterar 64 varv då den utgående axeln roterar ett varv.
Jag beställde en Nema 13 stegmotor som har ungefär samma dimensioner som den nu använda 28BYJ-48 men helt utan utväxling.  Då jag får stegmotorn så planerar jag att först köra den med den existerande drivkretsen och om det fungerar OK så använder jag den. Alternativet är att jag byter ULN2003 drivkortet mot en kontroller av den typ som finns i dagens 3d-skrivare. Exempelvis A4988 eller DRV8825 av vilka jag uppfattar den senare som marginellt bättre.

En stegmotor av annan typ kommer att kräva modifikation av ritarmen d.v.s. jag blir tvungen att designa en egen variantmed något annorlunda dimensioner. Fastsättningen av armen i stegmotoraxeln kommer att säkras med skruv vilket inte är falllet nu.

Beslutar jag mig för att byta ut stegmotorkontrollern så blir jag antagligen tvungen att skriva ut en modifierad bottenplatta eftersom A4988 och DRV8825 saknar skruvhål och därför kräver en annan fastsättning.

Några källor:

Byggbeskrivningen för den här presenterade Egg Painter Mini.

Den ursprungliga EggBot skrivaren.

Mjukvara till äggskrivaren.

Byggbeskrivning i PDF.

 

 

Enkel temperaturlogger

08/01/2019

Jag gjorde för en tid sedan en första preliminär mätning av UHI (Urban Heat Island) d.v.s. värmenedsmutsning av tätorter. Det är självklart att meteorologiska mätstationer som ligger nära eller i tät bebyggelse bör mäta högre temperaturer än stationer som ligger ostörda på landsbygden. De lärda tvistar idag om hur stor inverkan från UHI har på globala uppskattningar av temperaturen och uppskattningarna varierar från i princip ingen alls till några tiondels grader.

Temperaturloggerns upplösning d.v.s. de minsta temperaturskillnaderna den kan detektera är 0.1 grader C.  Sensorns precision d.v.s. felet i förhållande till en välkalibrerad temperaturgivare ligger antagligen på ca. +/- 0.5 grader C.

Jag har ingen aning om hur sensorn driver med tiden och inte heller hur linjär den i verkligheten är (om jag exempelvis vet att sensorn visar rätt vi 20 grader C, hur stort är felet vid +40?). Min gissning är dock att de relativa felen vid temperatursving på några grader är mycket små d.v.s. i storleksordningen +/- 0.1 grad C.

imgp5759

Fig. 1  Den första loggerprototypen. Det 3D-utskrivna skalet är misslyckat men bättre än ingenting. Följande version kommer ur ”ugnen” efter fyra timmar då detta skrivs. Bilden visar temperaturmätning i mitt arbetsrum kväll-natt. temperaturtoppen på nästan en grad är förorsakad av min kroppsvärme.

arbetsrum20190107

Fig. 2  Mätning av temperatur i mitt arbetsrum natten mellan den 7 och 8.1.2019. Rummet är i andra våningen /därav rätt hög temperatur) och det värms endast av datorer, skrivare etc. Det är intressant att notera hur temperaturen stiger med nästan en grad då jag sitter i rummet. En människa torde producera ungefär 200W värme vilket jag uppfattar att man kan se i mätningen. Andningsluften innehåller rätt mycket fukt vilket kan ses i den röda kurvan som är relativ luftfuktighet. Grafen skapades genom att läsa in mätvärdena i LibreOffice Calc i CSV (Comma Separated Values) format. Inläsningen krävde ingen editering av datafilen.

temp_logger_base

Fig. 3  En virtuell bild av stommen till version #2 av den nya lådan till loggern i programmet Repetier-host som jag använder för utskrift. Lådan är konstruerad i programmet openscad. Processorn och skärmen är skyddade men enkelt åtkomliga. I den första versionen kom kretskortet lite för nära lådans inre vägg vilket har åtgärdats här. Likaså modifierade jag öppningarna till USB-kontakten, SD-kortet och anslutningen för signalsladden till sensorn.  I nedre hörnet finns fack för SD-kortet och Bluetooth givaren HC-05. Nära det övre hörnet finns hjälpväggar som fungerar som kraftavlastare för sensorns sladd. Normalt brukar jag behöva tre iterationer för att designen skall bli ungefär vad jag vill ha.

tloggerboxutskrift

Fig. 4  Utskrift av den nya lådan från föregående bild. 3D-skrivaren är en Geeetech I3 kopia på motsvarande Prusa I3 skrivare. Skrivaren är byggd från en byggsats och den fungerar bra. Det krävdes dock en hel del tid, kanske två veckor,  att få allt korrekt injusterat både mekaniskt och mjukvarumässigt. Fördelen med en byggsats är dock att jag inte har några som helst hämningar att fixa eventuella problem eller göra uppgraderingar.  Det här är den bästa leksak jag har gett mig på många år.

imgp5761

Fig. 5  De i temperaturloggern ingående delarna. Från vänster Arduino Mega 2560 (blå). Därefter SD-kortadapter(ljusgrön). Bluetooth adapter HC-05 (vit) och bildskärmen sedd bakifrån (röd).  I den 3D-printade lådans skruvfästen smälts mässingsgängor vilket på sikt är mycket pålitligare än att skruva direkt i plast.

En Arduino Mega som temperaturlogger

En temperaturlogger kan byggas billigt från följande komponenter:

  • Processor Arduino Mega 2560 (ca. $10 ebay)
  • Display 480×320 pixlar innehåller ofta SD-korthållare ($5-$10 ebay). Kontrollera att displayen är kompatibel med en Arduino Mega och att den inte är gjord för en Arduino Uno (SD-kortet kan vara svårt att få att fungera om kortet är för en UNO). Det lönars ig inte att använda en Arduino Uno som logger om bildskärm används … minnet räcker inte till.
  • Bluetooth adapter HC-05 ($5 på ebay)
  • Någon typ av låda för att skydda loggern jag designade en egen låda och skrev ut den med 3D-skrivare.
  • Temperatur/fuktighetsgivare DHT22 ($3 på ebay). Det finns kombinationsgivare som också mäter lufttryck. Jag byter eventuellt senare ut DHT22 givaren mot en givare som mäter temperatur, luftfuktighet och lufttryck.
  • Ett minneskort t.ex. 8 GByte (det minsta man hittar i en normal butik)
  • Två stycken 1 kohms motstånd

Utöver ovanstående behövs lödkolv, gärna en universalvoltmätare, tröd, lödtenn o.s.v. normala hobbytillbehör för elektronikhobby.

Egenskaper hos den färdiga loggern

Loggern mäter och lagrar temperatur och luftfuktighet på ett SD minneskort. Mätta data plottas i grafisk form till bildskärmen. Mätintervallat kan ställas från ca. 1s till timmar mellan mätningarna. Bildskärmen kan skalas enligt behov d.v.s. det minsta och det största värdet p skärmen kan ställas via kommandon.

Jag kommer att lägga till funktionalitet i loggern senare. Det är enkelt att lägga till mätning av andra parametrar om det behövs. Jag har för närvarande endast en temperatursensor. Tanken är att lägga till en annan sensor så att jag kan mäta utetemperaturen nära bilens tak och ca. 10 cm högre upp. Det bör vara möjligt att få en uppfattning om hur mycket värmen i bilen stör mätningarna genom att placera två termometrar på olika höjd i luftflödet.

Kontroll/styrning av loggern

Loggern skriver ut mätningar till processorns USB serieport samt till Bluetooth modulen HC-05. Via båda dessa kanaler kan man ge kommandon åt loggern.

Bäst kontrollerar man loggern via t.ex. en mobiltelefon eller en lämplig läsplatta med bluetooth.  En lämplig App för kontroll är appen ”Bluetooth Terminal” som man hittar på Google Play. Appen är gratis (det finns säkert många andra som också fungerar). Då man kopplar på strömmen till loggern och då Bluetooth är aktiv i telefonen så kommer det att dyka upp en enhet HC-05. Om det i omgivningen finns flera HC-05 enheter så känner man igen dem på deras unika id (hexadecimal sträng av bokstäver/siffror). Då anslutningen har lyckats så kan man testa förbindelsen med kommandot ”help” som visar vilka kommandon systemet känner.

Följande kommandon finns för närvarande (kommandot ”help” ger en lista över kommandon):

COMMANDS:
help      --> This help.
start     --> Start logging
stop      --> Stop logging
sdstart   --> Re-initialize SD
sdstop    --> SD write stopped
tlog      --> Print tlog.txt
tdata     --> Print tdata.txt
ls        --> List SD files
ctlog     --> Erase tlog.txt
ctdata    --> Erase tdata.txt
!         --> Comment to tlog.txt.
logint    --> Logging interval secs.
ymin      --> Set plot ymin
ymax      --> Set plot ymax
ytic      --> Set plot ytic
replot    --> Clear screen and replot

Innan man börjar logga lönar det sig att ställa in skärmen:

ymin

Säller in y-axelns minsta värde. Om vi t.ex. vet att temperaturen ute ligger på ca. +5 och vi kommer att göra en körning som kräver några timmar så kan vi sannolikt ställa in skärmen på t.ex. 0 grader C. Commandot är då ”ymin 0” utan citationsteckn.

ymax

På motsvarande sätt ställer vi in det största värdet som ryms påskärmen t.ex. 15 grader C. Kommandor är ”ymax 15”.

logint

Kommandot ställer in intervallet mellan mätningar uttryckt i sekunder. Om vi t.ex. vill logga en gång per minut så ger vi kommandot ”logint 60”.  Intervallet är inte helt exakt. Den löpande tiden d.v.s. tidpunkten för mätningen i sekunder sedan start är relativt noggrann.

replot

Kommandot ”replot” raderar skärmen och ritar ut koordinatsystemet på nytt. Räknaren som håller reda på mätningens ordningsnummer sätts till ett (1).

start

Starta loggningen med de parametrar systemet för närvarande känner (ymin, ymax och logintervall).

stop

Stoppa loggning.  Loggning kan startas på nytt med ”start”.

sdstart

SD minneskortet initialiseras t.ex. om man har tagit ur kortet och kopierat innehållet till en dator ellr om minneskortet har bytts. Samma initialisering görs då loggern startas d.v.s. det är inte nödvändigt att ge kommandot ”sdstart” då loggern startas.

sdstop

Stoppar skrivning till SD minneskortet. Det är säkrast att ge kommandor ”sdstop” innan man tar ur SD-kortet eller innan man stänger av strömmen till loggern. Om man råkar rycka ur kortet precis då loggern skriver data till minnet så kan SD minnet förstöras. På motsvarande sätt kan kortet förstöras om man stänger av strömmen medan loggern skriver till kortet.  Risken för skador på minneskortet är naturligtvis störst om loggningsintervallet är kort. Användning av ”sdstop” förhindrar skador på SD-kortet eftersom skrivning till kortet stoppas.

tlog

Lista (skriv ut) hela loggfilen. Man kan skriva kommentarer till loggfilen genom att börja en kommentar med kommandot ”!”. Den maximala längden på en rad är satt till 50 tecken.

Exempel:

! Sommarö, start

Strängen lagras som sådan i filen tlog.txt men den förses med en tidsstämpel som motsvarar tiden för mätningarna. Man kan alltså senare direkt relatera kommentaren till specifika mätningar.

tdata

Skriv ut alla mätdata i mätfilen till både USB serieporten och till Bluetooth (HC-05). Ett sätt att överföra data till en annan apparat är att lista mätdata till serieterminalen och sedan på den kontrollerande enheten kopiera data från terminalen till en fil. Användning av tdata gör att loggningen inte behöver avbrytas och man behöver inte ta ut minneskortet.

ctlog

Radera loggfilen. Allt innehåll i loggfilen försvinner.

ctdata

Radera innehållet i datafilen. Allt innehåll i datafilen försvinner.

Koppling av termometer/luftfuktighetsmätare till loggern

Sensorns signalstift kopplas till Arduino Mega A15.

Sensorns strömmatning VCC koplas till 5V bredvid Arduinons stift 22.

Sensorns jord kopplas till Arduinons jord bredvid Arduinons stift 52.

Koppling av Bluetooth HC-05

Bluetooth VCC går till 5V på Arduino Mega (bredvid VCC för temperatursensorn). Till samma stift kopplas också VCC för SD-kortet.

Bluetooth jord GND kopplas till GND på Arduino (nära A15).

Bluetooth TXD kopplas till A13.

Bluetooth RXD kopplas via spänningsdelare t.ex. så att signalen från Arduino leds till jord via två 1 kohms motstånd kopplade i serie. Signalen till Bluetooth modulen tas ut mellan motstånden. Problemet är att HC-05 RXD är gjord för 3.3V spänningsnivå medan Arduinon använder 5V nivåer. HC-05 kan fungera en tid utan spänniungsdelare men den blir inte långlivad om den kopplas direkt.

Koppling av SD-kort

SD-korthållaren bör vara av en som har inbyggd spänningsregulator och 5V tålig. Orsaken är att SD minnet är konstruerat för endast 3.3V. Ansluter man ett oskyddat SD-kort till ett 5V system så kommer minnet att förstöras snabbt (jfr. HC-05 problemet).

SD 5V kollas till Arduino 5V (kombinerat med HC-05).

SD jord (GND) kopplas till Arduino GND (kombinerat med HC-05),

SD MOSI kopplas till Arduino Mega 2560 ICSP pin 1 (MISO)

SD MOSI kopplas till Arduino Mega 2560 ICSP pin 4 (MOSI)

SD SCK kopplas till Arduino Mega 2560 ICSP pin 3 (SCK)

SD CS kopplas till Arduino Mega 2560 dig. io pin 48

LCD skärmen

LCD skärmen är en billig kinesisk skärm designad för en Arduino UNO. Skärmen har inbyggd SD-kortläsare men problemet är att SPI gränssnittets signaler i en Arduino mega ligger påannan plats (ICSP konnektorn). Jag uppfattade det inte som mödan värt att tjuvkoppla mig runt problemet så jag använder en separat SD-kortläsare.

Problemet med många billiga kinesiska skärmar är att de är totalt ”namnlösa” och det finns ofta ingen information om vilken drivkrets de använder. Drivkretsens typ avgör vilket bibliotek jag måste använda på Arduinon för att skriva till skärmen. Vill jag has en skärm som är enkel att använda för t.ex. mätändamål så vill jag inte ha en skärm som sitter som en skäld ovanpå Arduinon och samtidigt förhindrar åmst till arduinons in/ut kontakter.

Skärmen jag har använt i det här projektet använder UTFT APIN f skärmaccess. Många kinesioska skärmar använder kontrollkretsen ILI9xxx för vilken man oftast hittar drivrutiner på nätet.

Notera att skärmen inte är nödvändig för funktionen.

Om ingen skärm finns kan programmet fortfarande köras genom att kommentera bort

#define HAVESCREEN

genom att skriva // framför definitionen d.v.s:

//#define HAVESCREEN

Programmet använder då inte alls skärmen men kontroll över programmet via Bluetooth och Arduino IDE fungerar fortfarande.

Programmet i Arduino

Programmer är skrivet i Arduinos C/C++ som är standardspråket om man använder Arduino IDE. Programmet är skrivet i en form som är typisk för en mikrokontroller där det ofta helt saknas ett underliggande operativsystem. Programmet sköter alltså själv alla funktioner och det är programmerarens sak att se till att programmet aldrig hamnar i en återvändsgränd och stoppar. Programmet är i princip en oändlig slinga som upprepas på nytt och på nytt. En cykel körs på ungefär 1/10 sekund. Vid varje varv genom programslingan kontrollerar programmet om det är tid att göra en mätning, kontrollerar om det finns något nytt kommando som borde utföras.

Om det är tid att göra en mätning så mäts temperatur och luftfuktighet och mätningens nummer, tiden sedan programstart, temperatur och luftfuktighet loggas till SD-minne. Temperaturen skrivs också ut på skärmen.

Om det finns ett kommando så utförs kommandot varefter programmet väntar på att följande varv genom slingan skall starta. Långa kommandon t.ex. en utskrift av en lång datafil kan ge tidsfel d.v.s. avståndet mellan två mätningar behöver inte vara helt exakt.

Notera att indenteringarna iprogrammet har förlorats vid inklistringen  i bloggen.

Jag kommer senare att lägga ut programmet på Github som fri programvara. Tillåtelse att använda programmet fritt ges här.

// Temperature_logger
// (c) 2019 Lars Silén
// Version 1.0
//
// Runs on an Arduino Mega 2560
//
// Using a 480×320 TFT diplay will hide the ICSP connector which caries
// the HW SPI signals. The are two options going around this problem.
// The first option is th solder the signals to the ICSP allowing us to use
// the ICSP connector with the display mounted (this option is selected here).
// The other option is to use a SW SPI library driving the SD memory card.
// This option is not selected.
//
// Any free text comin in over BT is stored including clock stamp.
// This allows simple input of location.
//
#include <Arduino.h>
#include <dhtnew.h>
#include <SPI.h>
#include <SD.h> // Support library for SD memory
#include <SoftwareSerial.h>

#define HAVESCREEN

#ifdef HAVESCREEN
//################################################
// GLUE class that implements the UTFT API
// replace UTFT include and constructor statements
// remove UTFT font declaration e.g. SmallFont
//################################################

#include <UTFTGLUE.h> //use GLUE class and constructor
UTFTGLUE myGLCD(0,A2,A1,A3,A4,A0); //all dummy args

// Declare which fonts we will be using
//extern uint8_t SmallFont[]; //GLUE defines as GFXFont ref

#define ORG_X 10
#define ORG_Y 10
#define MAX_X 470
#define MAX_Y 300

#define SCALE_MINY -10.0
#define SCALE_MAXY 30.0
#define SCALE_TICY 2.5
#define CIRCLE 0
#define CIRCLE_SIZ 2
#define SQUARE 1
#define TRIANGLE 2
#define LINES 1
float miny = SCALE_MINY;
float maxy = SCALE_MAXY;
float ytic = SCALE_TICY;

#endif

#define SDavailable // We have access to a sd memory
#define REPORTINTERVAL 60*10 // For testing reporting is done ar one minute interval.
int reportinterval=REPORTINTERVAL;

// ****************************************************
// Thermo and humidity sensor
// ****************************************************

#define connectedTSens1 true
#define connectedTSens2 false

// Looks like digital IO 22-53 don’t work properly.
// Use PWM pins or A-series pins.
#define DHT22Sens1 A15
#define DHT22Sens2 A12

DHTNEW mySensor1(DHT22Sens1);
#ifdef DHT22Sens2
DHTNEW mySensor2(DHT22Sens2);
#endif

// ****************************************************
// SD-memory support
// ****************************************************
// MISO, MOSI and SCLK in ICSP header.
// CD on pin 53.

Sd2Card card;
SdVolume volume;
SdFile root;
int SDstop = false;

int measured = false;
float Temperature = -999.0;
float Humidity = -999.0;
unsigned long timeSecs = 0; // Updated at 1s intervals using interrupts this is the main clock
unsigned long timeSinceStart=0; // Time in seconds since start
unsigned long stepper_rotate=0; // How often should we rotate the tower by one movement step (one turn of the motor).

int reportCnt = 0;
boolean stringComplete = false;
String inputString = ””; // a String to hold incoming sewrial needs initialization in setup().
String sysString = ””; // Handles writing/reading data
SoftwareSerial BTSerial(A13, A14); // RX, TX

unsigned long t;
int counter=0;
int shortcnt=REPORTINTERVAL;
int isRunning = false;
unsigned long tOffs;

void setup() {
// Serial interface towards supervising computer at 9600 baud
Serial.begin(9600);
pinMode(A14,OUTPUT);
BTSerial.begin(9600);

// Set up the temperature/humidity sensor type DHT2x (AOSONG AM230x)
//pinMode(50,INPUT);
if(connectedTSens1){
mySensor1.read();
}
#ifdef DHT22Sens2
if(connectedTSens2){
mySensor2.read();
}
#endif
Serial.println(”Started the Temperature/humidity sensor”);
BTSerial.println(”Started the Temperature/humidity sensor”);

// Start the system
inputString.reserve(50);
sysString.reserve(50);

// ***********************************************
// Setup SD-memory
// ***********************************************
#define SDCS 48
//pinMode(SDCS,OUTPUT);
if (!card.init(SPI_HALF_SPEED, SDCS)) {
Serial.println(”initialization failed. Things to check:”);
Serial.println(”* is a card inserted?”);
Serial.println(”* is your wiring correct?”);
Serial.println(”* did you change the chipSelect pin to match your shield or module?”);

BTSerial.println(”initialization failed. Things to check:”);
BTSerial.println(”* is a card inserted?”);
BTSerial.println(”* is your wiring correct?”);
BTSerial.println(”* did you change the chipSelect pin to match your shield or module?”);
return;
} else {
Serial.println(”Wiring is correct and a card is present.”);
BTSerial.println(”Wiring is correct and a card is present.”);
}
SD.begin(SDCS);
if (!volume.init(card)) {
Serial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
BTSerial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
return;
}
if(SDstop==true){
Serial.println(”SD stopped use SDstart”);
BTSerial.println(”SD stopped use SDstart”);
}

#ifdef HAVESCREEN
// ***********************************
// Setup the LCD
// ***********************************
Serial.println(”Trying to init LCD”);
BTSerial.println(”Trying to init LCD”);
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
#endif
}

float get_temperature(int sensorNo){
switch(sensorNo){
case 1: if(connectedTSens1){
Serial.println(”mySensor1.temperature”);
BTSerial.println(”mySensor1.temperature”);
return mySensor1.temperature;
} else {
return -999.0;
}
break;
case 2: if(connectedTSens2){
Serial.println(”mySensor2.temperature”);
return mySensor2.temperature;
} else {
Serial.print(”Not connected connectedTSens2=”);Serial.println(connectedTSens2);
return -999.0;
}
break;
}
Serial.println(”Fell through no such sensor number”);
BTSerial.println(”Fell through no such sensor number”);
return -999.0;
}

unsigned long get_time_since_start(){
// Get time in seconds since start
return timeSinceStart;
}

void ck_serial(){
// ***********************************
// Handle incoming serial data
// ***********************************
// CheclUSB serial typically Arduino Serial Monitor
while (Serial.available()>0) {
// get the new byte:
char inChar = (char)Serial.read();
inputString += inChar;
// if the incoming character is a newline the command is complete
// set a flag so the main loop can
// do something about it:
if (inChar == ‘\n’) {
stringComplete = true;
//Serial.println(”Got CR”);
}
}
// Check Bluetooth connection to phone/pad
while (BTSerial.available()>0) {
// get the new byte:
char inChar = (char)BTSerial.read();
inputString += inChar;
// if the incoming character is a newline the command is come,
// set a flag so the main loop can
// do something about it:
if (inChar == ‘\n’) {
stringComplete = true;
//Serial.println(”Got CR”);
}
}
serial_cmd();
}

void writeToLog(String ipStr){
if(SDstop==true) return;

File wrf=SD.open(”tlog.txt”,FILE_WRITE);
wrf.print(counter);
wrf.print(”,”);
wrf.println(ipStr);
wrf.close();
}

void serial_cmd(){
int n=0;
float h;
float energy=0;
float price=0;
// Some very basic commands
if(stringComplete==true){
// Ensure that case doesn’t matter when entering commands.
inputString.toLowerCase();
if(inputString.startsWith(String(”#”))){
// Handle comments
// Allows us to use scripts on the PC to set parameters on the controller.
Serial.print(”# ”);
Serial.println(”inputString”);
BTSerial.print(”# ”);
BTSerial.println(”inputString”);
stringComplete=false;
return;
}
// Restart use of the SD memory card after a SD stop.
if(inputString.startsWith(String(”sdstart”))){
Serial.print(”# command=sdstart ”);
BTSerial.print(”# command=sdstart ”);
// Re-initialize the card. The card may have been replaced.
if (!card.init(SPI_HALF_SPEED, SDCS)) {
Serial.println(”initialization failed. Things to check:”);
Serial.println(”* is a card inserted?”);
Serial.println(”* is your wiring correct?”);
Serial.println(”* did you change the chipSelect pin to match your shield or module?”);
BTSerial.println(”initialization failed. Things to check:”);
BTSerial.println(”* is a card inserted?”);
BTSerial.println(”* is your wiring correct?”);
BTSerial.println(”* did you change the chipSelect pin to match your shield or module?”);
inputString=””;
return;
} else {
Serial.println(”Wiring is correct and a card is present.”);
BTSerial.println(”Wiring is correct and a card is present.”);
}
SD.begin(SDCS);
if (!volume.init(card)) {
Serial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
BTSerial.println(”Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card”);
return;
}
SDstop = false;
inputString=””;
stringComplete=false;
return;
}
// Secure removal of the SD memory card.
if(inputString.startsWith(String(”sdstop”))){
Serial.print(”# command=sdstop”);
BTSerial.print(”# command=sdstart ”);
SDstop=true;
inputString=””;
stringComplete=false;
return;
}
// Start logging
if(inputString.startsWith(String(”start”))){
Serial.println(”# command=start”);
BTSerial.println(”# command=start”);
isRunning=true;
tOffs=millis()/1000;
stringComplete=false;
inputString=””;
return;
}
// Stop logging
if(inputString.startsWith(String(”stop”))){
Serial.println(”# command=stop”);
BTSerial.println(”# command=stop”);
isRunning=false;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ymin”))){
Serial.print(”# command=ymin value=”);
BTSerial.print(”# command=ymin value=”);
#ifdef HAVESCREEN
miny=inputString.substring(4).toFloat();
Serial.println(miny);
BTSerial.println(miny);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ymax”))){
Serial.print(”# command=ymax value=”);
BTSerial.print(”# command=ymax value=”);
#ifdef HAVESCREEN
maxy=inputString.substring(4).toFloat();
Serial.println(maxy);
BTSerial.println(maxy);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”ytic”))){
Serial.print(”# command=ytic value=”);
BTSerial.print(”# command=ytic value=”);
#ifdef HAVESCREEN
ytic=inputString.substring(4).toFloat();
Serial.println(ytic);
BTSerial.println(ytic);
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”logint”))){
Serial.print(”# command=logint value=”);
BTSerial.print(”# command=logint value=”);
reportinterval=inputString.substring(6).toInt();
Serial.println(reportinterval);
BTSerial.println(reportinterval);
reportinterval=10*reportinterval;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”replot”))){
Serial.println(”# command=replot”);
BTSerial.println(”# command=replot”);
#ifdef HAVESCREEN
setup_graph_screen();
#else
Serial.println(”Error: No screen defined”);
BTSerial.println(”Error: No screen defined”);
#endif
counter=1;
stringComplete=false;
inputString=””;
return;
}
if(inputString.startsWith(String(”tlog”))){
Serial.println(”# command=tlog”);
BTSerial.println(”# command=tlog”);
#ifdef SDavailable
dumpTLog();
#else
Serial.println(”SD card not available”);
BTSerial.println(”SD card not available”);
#endif
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”tdata”))){
Serial.println(”# command=tdata”);
BTSerial.println(”# command=tdata”);
#ifdef SDavailable
dumpTData();
#else
Serial.println(”SD card not available”);
BTSerial.println(”SD card not available”);
//BTSerial.println(”SD card not available”);
#endif
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ls”))){
Serial.print(”# command=ls: ”);
BTSerial.print(”# command=ls: ”);
File root = SD.open(”/”);
printDirectory(root,0);
root.close();
//root.openRoot(volume);
// list all files in the card with date and size
//root.ls(LS_R | LS_DATE | LS_SIZE);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctlog”))){
Serial.print(”# command=ctlog”);
BTSerial.print(”# command=ctlog”);
clearTLog();
Serial.println(”tlog.txt cleared (erased)”);
BTSerial.println(”tlog.txt cleared (erased)”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”!”))){
Serial.print(”# command=”);
Serial.println(inputString);
BTSerial.print(”# command=”);
BTSerial.println(inputString);
#ifndef SDavailable
return;
#endif
t = millis()/1000;

File wrf=SD.open(”tlog.txt”,FILE_WRITE);
wrf.print(counter);wrf.print(”,”);
wrf.print(t);wrf.print(”, ”);
wrf.println(inputString);
wrf.close();
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctlog”))){
Serial.print(”# command=ctlog”);
BTSerial.println(”# command=ctlog”);
clearTLog();
Serial.println(”tlog.txt file erased”);
BTSerial.println(”tlog.txt file erased”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”ctdata”))){
Serial.println(”# command=ctdata”);
clearTData();
Serial.println(”tdata.txt file erased”);
BTSerial.println(”tdata.txt file erased”);
inputString = ””;
stringComplete=false;
return;
}
if(inputString.startsWith(String(”help”))){
Serial.println(””);
Serial.println(”COMMANDS:”);
Serial.println(”help –> This help.”);
Serial.println(”start –> Start logging”);
Serial.println(”stop –> Stop logging”);
Serial.println(”sdstart –> Re-initialize SD”);
Serial.println(”sdstop –> SD write stopped”);
Serial.println(”tlog –> Print tlog.txt”);
Serial.println(”tdata –> Print tdata.txt”);
Serial.println(”ls –> List SD files”);
Serial.println(”ctlog –> Erase tlog.txt”);
Serial.println(”ctdata –> Erase tdata.txt”);
Serial.println(”! –> Comment to tlog.txt.”);
Serial.println(”logint –> Logging interval secs.”);
Serial.println(”ymin –> Set plot ymin”);
Serial.println(”ymax –> Set plot ymax”);
Serial.println(”ytic –> Set plot ytic”);
Serial.println(”replot –> Clear screen and replot”);
Serial.println(””);

BTSerial.println(”COMMANDS:”);
BTSerial.println(”help –> This help.”);
BTSerial.println(”start –> Start logging”);
BTSerial.println(”stop –> Stop logging”);
BTSerial.println(”sdstart –> Re-initialize SD”);
BTSerial.println(”sdstop –> SD write stopped”);
BTSerial.println(”tlog –> Print tlog.txt”);
BTSerial.println(”tdata –> Print tdata.txt”);
BTSerial.println(”ls –> List SD files”);
BTSerial.println(”ctlog –> Erase tlog.txt”);
BTSerial.println(”ctdata –> Erase tdata.txt”);
BTSerial.println(”! –> Comment to tlog.txt.”);
BTSerial.println(”logint –> Log interval secs.”);
BTSerial.println(”ymin –> Set plot ymin”);
BTSerial.println(”ymax –> Set plot ymax”);
BTSerial.println(”ytic –> Set plot ytic”);
BTSerial.println(”replot –> Clear screen and replot”);
inputString = ””;
stringComplete=false;
return;
}
// Any comman that isn’t recognized is assumed to be a comme that is loged
// into the tlog.txt logfile.
Serial.print(”inputString”);
Serial.println(inputString);
writeToLog(inputString);
inputString = ””;
stringComplete=false;
return;
}
return; // Never reached
}

void report_serial(){
// Write as comma separated values for easy import to a spread sheet program

Serial.print(”Time,”); Serial.print(t); Serial.print(”, ”);
BTSerial.print(”Time,”); BTSerial.print((timeSecs/3600.0)); BTSerial.print(”, ”);
if(connectedTSens1){
Serial.print(”Temp1, ”); Serial.print(mySensor1.temperature); Serial.print(”, ”);
Serial.print(”Hum1, ”); Serial.print(mySensor1.humidity); Serial.print(”\n”);
BTSerial.print(”Temp1, ”); Serial.print(mySensor1.temperature); Serial.print(”, ”);
BTSerial.print(”Hum1, ”); Serial.print(mySensor1.humidity); Serial.print(”\n”);
}
//if(connectedTSens2){
// Serial.print(”Temp2, ”); Serial.print(mySensor2.temperature); Serial.print(”, ”);
// Serial.print(”Hum2, ”); Serial.print(mySensor2.humidity); Serial.print(”\n”);
//}
}

// ********************************************
// SD related functions
// ********************************************

void printDirectory(File dir, int numTabs) {
while (true) {

File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
// Repaced ‘\t’ with ‘ ‘ to save screen space
Serial.print(‘ ‘);
BTSerial.print(‘ ‘);
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println(”/”);
BTSerial.println(”/”);
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print(”\t\t”);
Serial.println(entry.size(), DEC);
BTSerial.print(”\t\t”);
BTSerial.println(entry.size(), DEC);
}
entry.close();
}
}

void dumpTLog(){
// Dump the logfile to the external computer
char c;
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
File rdf = SD.open(”tlog.txt”,FILE_READ);
if (rdf){
while (rdf.available()) {
c=rdf.read();
Serial.write(c);
BTSerial.write(c);
}
rdf.close();
} else {
Serial.println(”Error: Could not open tlog.txt”);
BTSerial.println(”Error: Could not open tlog.txt”);
}
}

void clearTLog(){
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
SD.remove(”tlog.txt”);
}

void dumpTData(){
// Dump the logfile to the external computer
char c;
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
File rdf = SD.open(”tdata.txt”,FILE_READ);
if (rdf){
while (rdf.available()) {
c=rdf.read();
Serial.write(c);
BTSerial.write(c);
}
rdf.close();
} else {
Serial.println(”Error: Could not open usrlog.txt”);
BTSerial.println(”Error: Could not open usrlog.txt”);
}
}

void clearTData(){
#ifndef SDavailable
Serial.println(”Error: No SD memory available”);
BTSerial.println(”Error: No SD memory available”);
return;
#endif
SD.remove(”tdata.txt”);
}

#ifdef HAVESCREEN
int cy(int y){
// Convert y into screen coordinate sy)
int v=0;
v = MAX_Y – y;
if(v<0){
v = ORG_Y;
return v;
} else if(v>MAX_Y){
v= MAX_Y;
return v;
}
return v;
}

int cx(int x){
// Dummy conversion of x-coordinate to screen coordinate
int v=0;
v = x+ORG_X;
if(v<ORG_X){
return ORG_X;
} else if(v>MAX_X){
return MAX_X;
}
return v;
}

void draw_axisX(){
// Draw x-axis
myGLCD.drawLine(cx(0), cy(0), cx(MAX_X), cy(0));
}

void draw_axisY(){
// Draw y-axis
myGLCD.drawLine(cx(0), cy(0), cx(0), cy(MAX_Y-10));
}

int cnvYfloatToInt(float y){
int intY;
//intY = MAX_Y*(y-SCALE_MINY)/(SCALE_MAXY-SCALE_MINY);
intY = MAX_Y*(y-miny)/(maxy-miny);
//Serial.print(”y=”);
//Serial.println(y);
//Serial.print(”Conv intY=”);
//Serial.println(intY);
return intY;
}

void ticX(int dx){
// Starts from x=0
// Draw x-ticks
myGLCD.setBackColor(0, 0, 0);
for (int i=0; i<460; i+=dx){
myGLCD.drawLine(cx(i), cy(0), cx(i), cy(10));
sysString=String(i);
myGLCD.print(sysString, i+5, cy(15));
}
}

void ticY(float dy,int ltype){
float ypos;
int intY;
int i;
//for (int i=0; i<MAX_Y; i+=dy) myGLCD.drawLine(cx(0), cy(i),cx(10), cy(i));
ypos = miny;
while(ypos < maxy){
intY = cnvYfloatToInt(ypos);
myGLCD.drawLine(cx(0), cy(intY),cx(10), cy(intY));
if(ltype==LINES){
myGLCD.setBackColor(0, 0, 0);
for(i=10; i<469; i=i+10){
myGLCD.drawLine(cx(i), cy(intY),cx(i+3), cy(intY));
}
}
sysString=String(ypos);
myGLCD.print(sysString, 15, cy(intY+9));
ypos = ypos + dy;
}
}

void setup_graph_screen(){
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.print(”* Temperature logger V1.0 *”, 30, 20);
// Draw a background
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, 479, 13);
myGLCD.setColor(64, 64, 64);
myGLCD.fillRect(0, 306, 479, 319);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
draw_axisX();
ticX(60);
draw_axisY();
ticY(ytic,LINES);
}

void plot_point(int x, float flY, int symb){
int y;
//Serial.print(”Initial float Y=”);
//Serial.println(flY);
y = cnvYfloatToInt(flY);
//Serial.print(”Converted intY=”);
//Serial.println(y);
switch(symb){
case CIRCLE: myGLCD.drawCircle(cx(x), cy(y), CIRCLE_SIZ);
break;
}
}
#endif

void store_data_SD(){
if(SDstop==true) return;
File wrf=SD.open(”tdata.txt”,FILE_WRITE);
wrf.print(t-tOffs);
wrf.print(”,”);
wrf.print(counter);
wrf.print(”, T , ”);
wrf.print(mySensor1.temperature);
wrf.print(”, h , ”);
wrf.println(mySensor1.humidity);
wrf.close();
}

// ********************************************************************************************
// MAIN PROGRAM
// We run, very roughly one loop per second.
// Notice that variables defined within the loop are local to loop() and they
// are initialized when a new loop starts. To preserve data between loops variables have
// to be declared outside the loop().
// ********************************************************************************************

void loop() {
// ******************************************************
// Main loop for actual work
// ******************************************************
ck_serial();

if (counter==0){
#ifdef HAVESCREEN
setup_graph_screen();
#endif
counter=1;
}
shortcnt–;
if((shortcnt<=0) & isRunning==true){
mySensor1.read(); // Read Temperature and Humidity sensor #1
t = millis()/1000; // Seconds since start
Serial.print(t-tOffs);
Serial.print(” , ”);
Serial.print(counter);
Serial.print(” , T , ”);
Serial.print(mySensor1.temperature);
Serial.print(” ,h, ”);
Serial.println(mySensor1.humidity);
BTSerial.print(t-tOffs);
BTSerial.print(”,”);
BTSerial.print(counter);
BTSerial.print(” , T , ”);
BTSerial.print(mySensor1.temperature);
BTSerial.print(” , h , ”);
BTSerial.println(mySensor1.humidity);
shortcnt = reportinterval;
#ifdef HAVESCREEN
plot_point(counter,mySensor1.temperature,CIRCLE);
#endif
store_data_SD();
counter++;
}

delay(100);
}


Pointman's

A lagrange point in life

THE HOCKEY SCHTICK

Lars Silén: Reflex och Spegling

NoTricksZone

Lars Silén: Reflex och Spegling

Big Picture News, Informed Analysis

This blog is written by Canadian journalist Donna Laframboise. Posts appear Monday & Wednesday.

JoNova

Lars Silén: Reflex och Spegling

Climate Audit

by Steve McIntyre

Musings from the Chiefio

Techno bits and mind pleasers

Bishop Hill

Lars Silén: Reflex och Spegling

Watts Up With That?

The world's most viewed site on global warming and climate change

TED Blog

The TED Blog shares interesting news about TED, TED Talks video, the TED Prize and more.

Larsil2009's Blog

Lars Silén: Reflex och Spegling

%d bloggare gillar detta: