%%%%%%% %If you have questions, contact me at lukehunt@stanford.edu or 831-655-6208 %Some of this is patterned off Dave Wethey's iButton reader for SAS. %Thanks Dave! %November, 2003 % %This file interprets the hex data from a mission.txt file output by the Scanning Devices %Thermochron iButton Reader and saves it in a array, as well as giving you the option to plot %all the button Data. 'close all' closes all the figures. The hex file %(mission.txt) should be in the format: %M-60 N 14H 34C00001BA0D21 0 49 11 7 4 2003 1 24 255 0 0 80 100 30 0 0 0 15 4 7 2002 -1 19 50 3 20 5 2003 2 13290 59559 hhhgfgggggiiiiiiiiiiiiiiihhhhijjjiklmlkiihgfgghgggggfgffeedgghhiiiiiihhhhhhiijjkpproopnnllkiihhhihihhhhhhfhggghhhiiiiiiiiihihijiikimloponlkjiihghhihiihhhfffedcbdghhhiiihiiiiiijqnmmpqsstrrqpmkigfggghhhhfedccbb``cdghhhhhhhhhiiknnmoqrssssqomlkjiihiihhhgfeeeeddeeeeegiiiiiiiiijljjmppstuttsplkjhhghhhihffdccbbaa`````bfhiiiiiiijklloqsuutpnlkjjjiihgiiiihigfeeeedcbbabbehiiiiiiijlkikijkjihhfeeffeeeihiiiigfcba```__^^^_`hiiiiiiijlnmlnooonkiggffffehiiiiiiigdba``__^^^_`afhiijjjkknnopqqrumljjiihgggiiiiiiigecbabbbbbbcddefhklmnkmoprqqrssqmjihgffffffhhihhhfcbbbaaa``bdedhkmlnnprqpqrrtssqmjiihhggfffghiihhheca`__^^^_``ehjopqqqtvxxwwvvvtpmljjihhggffhhhihhggcba``_`aabdggimpoprtuvvwtwtupnlkkjiihgggfeegfgggddccbbbdefjnmnmptstvw~||zvttrponmlllkkkjjjihiiiiiihhhgghikmpnpqssruuwy{v~vsqonnmmmllkkkjjjjjiijjjjiiiiggggjlqsyxstvxvvusqqonnmmlkkkkkkkkjjihhgggiijjiiiiiklmquwxzxyz|zuwusrqqmjhhhhhhhhhhhiiiiiihhhhhhhhhhijooqu{||}yxvttrrrpnjjiiihihijjjkkkkjjiiihhhhhhhhiilomqruuwwyyy||yqkihhhhhhhhhhhedccbbdefhhhhhhhhhihiqptspsvvuuqqpmkjghhiiiihhgfeedddbccccfghhiiiiiiiijhijjlmnonmljihfehhihiiihgedddcccccbbcdfhhhiiiiijjijklnnooonkihggghhhhhhhgedbbaaaaba`aacceghiiijjlooqqpopqrqnlllkkkiiiiiiihhgfgfffedddeeefhhkkklklmkmnoppmkjjihgggghijjjjjjiihededbbbbbcdegiklmmnmopopprsuusolkjihhhhiijjjjjjjhhgfeefffgijjlotnooonpontusrnmljihhhgffghiiiiiiiiihhggffhjijkklonkiimprsrwvwtqljhgffeeeegfhiiiihhhgffccbcbcfghknmnpqrtwvvvsrrpolkjihgffeedccceeffffffddbbbdfikjpursuwx|}}?~~|vsqonnmlkkjkjjjjjijihhhhhhikmnnqqsuuwyz||{yxywvvrnlihggggffffeeeeeeddfgghgggggghhjknooprtvuvtsrqihggggggedccbbaaab``acffffgggggklnqrttwx{z~???~|vspliihhgeedddccbbbbbaaafggfggimpopquy|‚……†ˆ„~zvsrqpkjihgfffeeddccbbbbcccfeghinsuwwzxzy†…†………~xvsrlihggffeeedcccccbababcdefggghkmnqqtvvyy?€}uqomlkhggggggfffeeffeeeeeefffggggggghhhjjiilnoloogfdddeffggggfeba`_a``_````abaefhgihikgsnhtvsrokefeccddffggggggfcb```_^^]^````cgjhgikkmnnqqsvvwywsnkihgeffggggfedaaaaaaaabbbcacdfghjjklllmnoproppljhgffdegggggggfdbaa``____``adefgijjkjkkkllononmkhgffeccfffggggfebaa______`acgjnnooprsvvvwwxyxwvrnlkjihhfffgggggfedbaa``_``abegkik %M-132 N 5TH 34C000003FD621 7 4 11 7 4 2003 1 24 255 0 0 80 100 30 0 0 1 6 8 7 2002 -1 30 17 3 20 5 2003 2 13115 198335 mlllkkkkkkkkjihjjjjjjjjiiiiiiiijkklkklmlljjjjiiiiihihhhhhhhhhggffhhiijjjjijnkkkklpuwttrqponmlkjjjijiiiiihihhhhhhghijijkkkjjjjklmsrqqqrrrqponmmkkjjijihhhgggffefeeeeefghjjknoolnz|{€}{wurqponmmlkjjiiihgggggggfffeeeeeehhjllpnst|}}|}zwutsqpponnmlllkkkjjiiiiihhhhhhhhhhhhiijkkklmoorpponmmmllkjjiiiihiihgggggfffffeeeedegqqtnrrvututtqpnnmmmmllkkkkjjjjiiiiiiihggggfeeeeefghjommklqpnnmmmmlllkjiiiiiiihhhfffeeddcccbbbbbgou}z{{ustqsqonmlkkjjjiiiihihhhhghgggffeeeddcccdltx‡‡†ˆƒ|{wsrqponnmmmllkkkjjjiiihhhgfeeeededddddcdddefinpssspnmmllkkkjiiihhhhhhhhggffffeeeeeedcddfffntx|z{{xtqpnnmllkkjjiiiihhhhhhfffeeeedccbbcjpu{€‚„ƒ„†„?~zxvtsqponnmmlkkkjjjiiihhhffffeeeeefintxyy|?‚…?}zywtsrqqpoonmmllkkkjjjiihhgggggffffgkoptxyy~?ƒ?~{ywvvuutssrqponnnmmmmlllkkkkkkkkjiiihiijloprvxwvuttsssrqpponnnnmmmmmllllllllkkkjjiiktwzwtuvw{}{yxxwvttsrrqppooonnnmmllllkkkkkjjjjjjjjkllmquvxzzxvttsssrqqomlkkjjjjjjjjkkkkkkkkjjjjknqtttrt}}}~||zxwuttsponlllllkkmnnnnnnnnmmmkjjjklklnpvxxuxttqpponmllkkjjjjjjjjjjiihgggfhffgggiijjjjjjkjksssqonnmlklkjjjiihhiiiiiihihhhhgggggghjmmpklnnqqppnkjjiiihhhhhggghhiiijjiihhggggffffffgmnutvuqpqsponlkjkkkjjjiihhhhihhhihhgggeeeeeeeeefopvx{}vwvuussqppoonnnmmklllkkkkkjjjjjjiiiiiihhhiow{}?ƒ„~|yusqpooommlllkkkjjjjjjkkjkkjihhhggggggosy€€?‚‚~{xusqononmmmmlllkkkkkkjjjkjkkjjjjjiiiiihiijkmlnopoooppponmmmlkkjjjjjiiiiiijjjjiiiiiiihijjkllnooonmnqpononmlkkjiiihhhggggggghhhiggfeefffnqz?…†ˆ†‡…ƒ}zwtsrponmmlkkjjiihhgggggggffedddeehkqtt{……†…‡„‚}zyvutsrqqpooonnmmmmllllllllllkkkkklmnqqv{€~€~|yxvtsrpponmlkkjjjjiiiihhhhhhhgggggimqsx‚……„ƒ|ywutrqomljjiihhhhhghgggfggfffgfeghgkorruspt€‚‚€~{wvttsrrqqponnmlkkjjjihhhhhhhghhggiruyy??…ˆ‹ˆ‡†…?~|{zyxxwutsrqqponnnmlllkkjjjjjjiijoz~??…??‘?ŽŒ‡‚~{{{zxwwvutsrqqpooonnmmllkkkkjjjikoy}}?‚{}y{}yyxvwwwwusrqoonnnmkjjjjjjjjjjiiiiiiiiiikjkkljjjllmllmmnmllkkjiiiiihhgfgffeeededdddddeghqw||wtsrqrsppomnmmlkjighhgfgggffgdedddccbbbbddflsvz~~~~}zvrqoonmmllkkjiihhgefdeddcdddeeeedeeeefelszy}{zxwtrqonmmmlkkjjiiihgghgggffffeddddddflov|ƒ…„?€~zxtrqonmlkkjiihhhhggggffffeeeddddccbceiou{}|}?€~zwvutsrppoonllkkkjjiiiiihgfgffeedddjnt{~}ƒ… %M-132 N 5TM 34C00001EF8B21 48 18 11 7 4 2003 1 24 255 0 0 80 100 30 0 0 1 6 8 7 2002 -1 20 17 3 20 5 2003 2 13115 53984 ihhihhhhhhhhhhhhiiiiiiiihhhghgghiiiiiijjighhgfggggggfffffffffggghhhhhhhhhhhiiijhinnronnmmlkjiihhhihhhhhhhhhgggfgfhggihiihihhhiijlnnlmlllllkkjjihhghghhhghffeedddeddghgghhhikiiilquvusqonmllkjjjihgfggghhhgffeeeeeddddeggghjiiijjosuusqnmnmmlkkkjjjihhhhhhgggggffffffffffghiiiiiiijmlllkjjjjiiihhggggffgggffeeeeeddddddcccgikjjjijlkkllkkjiiijiihhhhhhhhhghhhghggfeeeddccccdfhiiiiiikkkijiiiihhhgfgggffffghhhegddcbbbaa```chnqnmnnkkjjkjihhhhggggfffffffefiihhghgeddcccbbbfopv|~wttqoklkkkjjiiiiiihhhhhgggghhggfdddccccbbbbabbbcdeglnnkjiihhghggggffffeeffeeffffeddddccccbacdddmpqxywuronmlkkjjiihhgggfffffffeeedddccbaa`aenpw{€?‚ƒ„?|xutrqponmllkjjjiihhhhgggffegfdddddccgintuvzz€{vtsrqpoonmllkjjjiiiihhgggffeeeeddddefkkpryuw{|~{wtssrrrqqqponmlllkkkkjjjiiiiiiiiihgggghhikmnrusrqpppppponmmlllkkkkkjjjiiijjiiiihhhggmwvurprtv{{wttttsrqqpoonmmlllllkkjjjjjiiiihhhhghgghhiilpsttusrqrqqppookjihihhhhhhihiiiiiiihihhhhjlklrpqtwwtxuwuuutsrppmllkijiiiiijkkkljlljjjihhhhhiiijlpqqrqnmmlllkjjiihhhhhhhhhhghggffeeeeeeghhhhhhhhihimoomllkjjiiihgggggghghhghggfgfffeeeeeehijjiiijlkkljihhggggfffeeeffgghhhihgggfffeeeeeddegjlkqpokmklkiihggggggffffffghhghhhggfeedcccccccdhotsxunljmlmmlllkkkkjjjiiiihhhiiiiihhhhgggggffffhqx{{}€||rponlllkkjjiiiihhhhgiijiiiiiiihgfffeefejmwz|~|{xvtnoomlkkkkkjjjiiiiiiiiiijijiiiiihghggggggghjkklmmllmkllkkjjjiihhgghggghiiihiiiiihhggggghhikklnmlkknnmkjkkjiihgfffffeeeefghghhgggfeeeddknwy~€‚‚€~{wutrpomkjjjiihhgggffeeeeeeeeedddddddikopuz?€?}yxwvtsrqpponnmmllkkkkkjjjjjjjjjihhhiijlomqt{zyxxuttsqqpnnmlkjjiihhhhggggffffffeeffggilnqv{{}{|zvtrrqpomlihhghgfggffgffffeeeeeeefeffgikolmqmq{zytrqppoonnnmmlkjjiihhhgfgeeeeeeeeeeeejnstox{}?}{yuuuuutttsrqponnmllkkjjiiiihhhhhggggjuy~zu€‚„„‚€~yxvvvvutssrqponnmlijiijihhhhhhhggffhruzslqqnrsrrppooqqrppnmlkkkihhhgggggggghgggggggggghihhihghhiiiiijjjiihggfffffffffgeddcccbcbcbccceflsssmokkkikjijiiiihhggeeefffffgfgfecbbbbaa```cciortx{zqpqnljjhihhghhgggffeedddfffdbbabbbbbcccccdcdotsuutspmlkkjiiihhhggfffefeffggfeeedcccbbbbgmoyy}?€€yvsllkjihhhgfffeeeeeefdeeggfeddccccbbaabejqvxzx{{zyvtrqqpoommlkjihhhgggggffggfeedccbbbdkpsxw{z€ %M-4 N 5TL 34C000017D5621 50 20 11 7 4 2003 1 24 255 0 0 80 140 30 0 0 0 6 9 7 2002 -1 9 17 3 20 5 2003 2 13067 66855 jiiiiiiiiiijijjjjjjjjiiiiiiiihhiiijjjjjjihiihhhiiiiihhhghhhhiiiiiiiiiiiiiiijiijjikmqnnmlkkkjjiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiijlnolllmlkkjjiihhiiiiiiiiiihhhgffegiiiiiiiiiiiiijmrprpomlkjjjihhhhggiiiiihhhgggggggfgghhiiiiiiiiijkpqpnmlllkkkjjiiiihiiiiiiiihhgggggggghiiiiiiiiiiikkmlkkjjjiiihhhgggghiiiiiihggfffffeeeefijijijjjjkklkkjjjiiiiihhhhhhijjijijiiihhggffeeeefgiiijjjjjjjjjjiiiiihhggggggghiiiiiiiigfeddccccbdkopljjjjjjjjjjihhhgggggfffhgiiijjjjjiiiggfeeeedgovyzvqlkkkjjjkjjjgiiiihhhhhhhhijijiiiihfeeeedddddddeeegjlllkjjiihhhhggggfffffffiiiiiiihffeeeeedcdeffmrrstrpnmkjjiihhhgggggggggghiiiiiiihfeeddccgpux{|}{zzywtrqponmllkkkjjiiiiihiiiiiiiiiihgffeeimqwwvuuwyxusrqpoonnnmllkkkjjjjiiiiihhhgiggffeefgmmrvxttvuwtqppopooonnnmmllkkkkkjjjjjjjjjjjiiiihhhiijkmnqsqponnnnnnmmllkkkkkkjjjjjjjjjjjjjjjjiiiltvspppqtvvsqppppooonnmmmllllkkkkkjjjjiiiijhiiiiihhiijlqrqqpooooooonnjjgghhiiiiiiiiiiiiiiiiiiiiiiiijjjsqttusrsqponnmmmmkiiiiiiiiiiiijkjjjiiiiiiiiiiiiijkkmnnmmllkkjjjiiiiiiiiiihiiihhiggggghggiiiiiiiiiiikkmnmlkkjiiihhggiiiiiiiiihihhhggfgggghiiiiiiiiiijjjihhhgggggfffghihiiiiiiiihigggffffffghjkmjiiiiijjiihhghgggggggffghiiiiiiihggfeeeeeeeeiortsnjjjjjkjkkkkkjkjjiiiiiihiiiiijiiiihhhhhgggghrvxwxxmnkmkkkkkjjjiiiihhhhhijijjjjjjjjiihhggggglovx{xxwvnnlkkkkkkkkkjjjiiiiiijjjjjjjjjjjjiiihhhhhhiijkllllklljkkkjjjjiiihhhhhhiiiiiijiiiiiihhhhhiiijjkmmljklmlkjjjjjihhggggggghgiiiiiihhhhgggfflrwx|}~~{yxvsrrponkkjiiiihhhgggggfffffffffffffffmqttwz|yyyywuutsrqpoonnmmllkkkjjjjjjjjjjjiiihhhiijkmlorwxvutrrqponnmllkjjihhhhhgggggffgfffghhhghiinpruvwuvsqonnmmlkjihhhhhhgggggggggfgfgffggggggghhijimrtusponnmmmlllkkjjiiiihihhggffffffffffffjjhhhlirvvutsppooonnnnmmmllkjjihhhhgggggffffffffkswomjjsrxxvurqoppoonnnmmllkkhhhhhhhihghggggggffjrnhhghhiilmmmmmmnnnnmlkkjjhggggggggghgghhggghhhhhhhhgggggghiiiiijjjjihhhgfggggggggggfeeeddddddddeglttmikhhihhihiihihhgggffffggggggggggedddcccbbgeipswxupkijkjiihhhgggggfffeeffggggggfedcdcccdddddeeeqrqrromlkjiihghggffffeefgghgggggggffeedddddhmpwwx{ywwqoljiihhgggfffeeeeffggghggggggfeeedddcdfjrtxxtuvtsrponnmmmllkkjiiihhhggggghhgggfeedddemrvywwwx %that is, it requires mission names and mission numbers, if they aren't %there, put them using a text editor. Columns are tab delimited. %Note, this interpreter doesn't adjust for daylight savings time. The %Scanning devices one does (however in 2002 it "fell back" 1.5 hours?!), %the Dallas iButton reader also doesn't adjust for daylight time. Beware %when combining data sets. %%%%%%% %the final matrix is 'myData'. It's an array of cell arrays. The cell array has the format %{button ID, button#, timeData, temperature Data}. Type MyData{1} to see the first line %of the cell array. The types are {characterarray, char.array, numericarray, numericarray}. %The outer array is indexed by bNum(1:Number of Buttons) The inner cellArray is 1:4. %to get the date string for the 4th record (for ex) use datestr(myData{4}{3}) memSize=2048; %bytes before iButton rolls over tDTemp=[]; %temporary array of start times and Dates mStart=[]; %array of mission start time/date as a MatLab Date (numeric) remLaunch=''; %character array keeping the time/date string remainder as it's read as tokens tokLaunch=''; %char. array. Steps through the tokens in the time/date string tDScr={}; %temporary cell array holding [Year,Month,Day,Hour,Minute,Second]. The order is reversed %from how it is in the mission.txt file myData={[],[],[],[]}; %the final data in a pair of nested cell arrays. The outer one is indexed for %each button. The inner one has 4 cells with the data. See intro paragraph too. endDate =0; %time/date of final sample %************************************************************************** %************************************************************************** %************************************************************************* dataFile='C:\Documents and Settings\Luke Hunt\Desktop\iButton\txt files to process\mission.txt', %************************************************************************** %************************************************************************** %************************************************************************** %Indices for myData cell array: mNameI=1; bNumI=2; dateI=3; tempI=4; plotfigs=''; %%%%%%% %the variables to store the data read from mission.txt with textread. missNum={}; %cell array of character arrays. ie array of strings with the M-158 mission# not used. missName={}; %also cellarray of strings. with user-entered mission name butNumStr={}; %button number alphanumeric string dlDateTimeStr={}; %download date time string launchDateTimeStr={}; endDateTimeStr={}; %when mission scheduled to end nSamples={}; %array of doubles: number of samples in the mission. deviceCount={}; %number of samples total for this button. tHexData={}; %cell array of strings. Each string is a run of hexTemperature data as an ASCII string. %b,f,g,h,j are placeholders for useless(?) tab-delimited columns. Not used %%%%%%%% disp('Make sure your data is in the correct format. You must include') disp('mission numbers and mission names. See m-file for example data') disp(' ') disp(' ') %plotfigs= input('Plot Data? (y/n) ','s'); %do you want to plot the data at the end? %read the text in the proper format needs MatLab 6 or newer, it seems. [missNum,b,missName,butNumStr,dLDateTimeStr,f,g,h,sInt,j,launchDateTimeStr,endDateTimeStr,nSamples,deviceCount,k,tHexData]=textread(dataFile,'%[^ ]%s%[^ ]%s%s%s%s%s%n%s%s%s%n%n%s%[^ \n]', 'delimiter','\t'); sInt=sInt/60/24; %fraction of day=MatLAB date. for bNum=1:length(tHexData) %Num buttons in data file. more precisely, #records %in data file b/c some could be faulty. length tHexData returns the # of cells with hex data %%%%%%%% %everything happens in this if loop, b/c only extract data if the record is a thermochron iButton %checks to make sure a thermochron button is present. Is there a button %number ending in 21 in the button-number column? Thanks Dave Wethey! %%%%%%%%% if butNumStr{1}(1,(length(butNumStr{1})-1:length(butNumStr{1})))=='21' %%%%%Get the times out of string format, only first 6 tokens are used %first the data are chopped into tokens, saved in a matrix of the %format: [Year,Month,Day,Hour,Minute,Second]. The order is reversed from how it is in %the mission.txt file (ie indexed by 7-j instead of by j) % remainder after chopping off token. set first to be entire string remLaunch=launchDateTimeStr{bNum}; %6 tokens, m/d/yr hr:min:sec %date in mission.txt is whitespace delimited, so read into tDscr, a temporary cell array for j=1:6 [tokLaunch, remLaunch]=strtok(remLaunch); tDScr{bNum}(1,7-j)=str2num(tokLaunch); end %mission start date (numeric). from a heinous concatenation of the tokens into %m-d-y-hr:min:sec. then interpreted as datenum. mStart(bNum,1)=datenum(strcat(num2str(tDScr{bNum}(1,2)),'-',num2str(tDScr{bNum}(1,3)),'-',num2str(tDScr{bNum}(1,1)), '-' ,num2str(tDScr{bNum}(1,4)),':',num2str(tDScr{bNum}(1,5)),':' ,num2str(tDScr{bNum}(1,6)))); endDate(bNum)=mStart(bNum,1)+(nSamples(bNum)-1)*sInt(bNum); %final sample dateTime. %%%%%%%%%%%%%%%%%%%% %%convert temperature data into Celsius by Celsius =(hexTemp-80)/2. %%Thanks Dave Wethey! %%%%% %For each temperature, also compute the date of sample. Use the %mission Launch Date, Sample Interval, and Number of Samples, to %Calculate the final sample time (=endDate). Then subtract a sample interval for each %temperature reading, and this builds a column of times (it would be backwards, but I filled %the time array in reverse starting at index=length(tHexData{bNum}) ie the number of samples.) for i=1:length(tHexData{bNum}) myData{bNum}{tempI}(i,1)=(tHexData{bNum}(i)-80)/2; %conversion from hex to celsius = (hex-80)/2 myData{bNum}{dateI}(length(tHexData{bNum})-(i-1),1)=(endDate(bNum)-(sInt(bNum)*(i-1))); %explained above. Starting with endDate being placed in the highest index, Column is filled %from the bottom up, with each time/date calculated from missStart. end %% add button name and number to myData myData{bNum}{mNameI}=missName{bNum}; myData{bNum}{bNumI}=butNumStr{bNum}; %%%%%%%%%% %if you elected to plot, plots them as tiled figures. %%%%%%%%%% if upper(plotfigs)=='Y' myTitle= strcat(myData{bNum}{mNameI}, '---' ,myData{bNum}{bNumI}); figure; plot(myData{bNum}{3},myData{bNum}{4}); xlabel(myTitle); ylabel('Temperature C'); datetick('x',2); %makes the x-axis as a readable date instead of Matlab sequential date axis('tight'); end end end tileFigs