Saturday 11 May 2013

Inside cheap OBD2 ELM327 scantool





Inside cheap OBD2 ELM327 interface bought from china through Ebay (2 different model). 

Inside Android tablet Q88

Inside a cheap china A13 Android 4.1.1 tablet (Q88). Tablet bought at RM179 in Low Yat.






MX5 high low absorber spring swap

My 1992 MX5 ride is not very comfortable  I have Cusco hi-low absorber on my car. I notice that the spring for the rear assembly is shorter, thus the harsher ride. So what I did is to take the from Cusco spring and put it at the back. Picture below (right to left) show MX5 OEM rear absorber/spring, rear cusco/front cusco spring, rear cusco absorber and original cusco rear spring, front cusco absorber and cusco front spring.
The result is: much improved and comfortable ride. What about the front? I put back the OEM spring and absorber for now until I found replacement cusco spring..


Arduino chart recorder using reverse camera TV

Arduino rock!
Created a simple program to monitor oven temperature using arduino, TCmux shield, and TV out library.
Take note that the picture attached do not have the TCmux circuit connected.


Code as below:


// Note:        This code uses TV-OUT for Arduino library. Also credit to Shadi Soundation for the TV oscilloscope code

#include <TVout.h>
#include <fontALL.h>
TVout TV;
#include <SPI.h>

#define CS_TEMP  8 // MAX6674/6675 /CS Line
//#define MUX_EN   7 // ADG608 MUX Enable
#define MUX_A0   4 // ADG608 Addr0
#define MUX_A1   5 // ADG608 Arrd1
#define MUX_A2   6 // ADG608 Addr2
#define BUZZER   3 // BUZZER pinout3
#define SO 12    // MISO
#define RESETBTN  2// MISO
#define SCK 13   // Serial Clock


int temperature = 0;

int channelAI = A0;      // select the input pin for the Oscilioscope
int scaleYAI = A1;       // select the input pin for the Y (horizontal) potentiometer
int scaleXAI = A2;       // select the input pin for the X (Vertical) potentiometer

int delayVariable = 0;   // define a variable for the Y scale / delay
int xVariable = 0;       // define a variable for the x scale 
int yCtr = 0;            // define a variable for the y counter used to collect y position into array
int posy = 0;            // define a variable for the y position of the dot 
int myArray[127];         // define an array to hold the data coming in 
int RESETval = 0;

unsigned long cure_t=0;
unsigned long base_t=0;
unsigned long minute=0;
unsigned long seconds;

void setup()  {
  
TV.begin(_PAL,128,96); //for devices with only 1k sram(m168) use TV.begin(_PAL,128,56)



 pinMode(SO, INPUT);
  pinMode(SCK, OUTPUT);
  pinMode(CS_TEMP, OUTPUT);
  pinMode(MUX_A0, OUTPUT);
  pinMode(MUX_A1, OUTPUT);
  pinMode(MUX_A2, OUTPUT);
  //pinMode(MUX_EN, OUTPUT);
  pinMode (BUZZER, OUTPUT);
  pinMode (RESETBTN, INPUT);

  digitalWrite(CS_TEMP,HIGH);// Set MAX7765 /CS High
  //digitalWrite(MUX_EN,HIGH); // Enable on
  digitalWrite(BUZZER,LOW); // Enable on

  digitalWrite(MUX_A0,LOW);
  digitalWrite(MUX_A1,LOW);
  digitalWrite(MUX_A2,LOW);
  //Serial.begin(9600);
  TV.select_font(font6x8);
  TV.println(15,30,"TIM TEMPERATURE"); 
  TV.println(15,50," OVEN CHECKER"); 
  draw_axis();
  delay(5000);
  TV.clear_screen();
  draw_axis();
}

void loop()
{
  //base_time==millis();
  //cure_time==0;
  update_display();



void update_display() {
exit_loop:  
  //base_t==Read_time();
  //delayVariable = analogRead(scaleYAI);
  //delayVariable = (5000/100);
  delayVariable = 100; // change to plot slower or faster
  //xVariable = analogRead(scaleXAI);
  xVariable = 1;  // 
  TV.select_font(font4x6);
  for(yCtr = 0; yCtr < 127; yCtr += 1)   // the for loop runs from 0 and < 127, it fills the array with 126 records
    {     
      //if(!(millis() / 1000)) seconds++;

      seconds=millis()/1000;
      minute=seconds/60;
      // check door status
       if(digitalRead(RESETBTN)) 
       {
         TV.clear_screen();
         base_t=seconds;

         TV.println(90,10,seconds);
         TV.println(90,18,"OPEN ");
         cure_t=0;
         draw_axis();
         goto exit_loop;
       }
       else
       {
         TV.println(90,18,"CLOSE");
         cure_t=millis()/1000 - base_t;      
         TV.println(90,2,cure_t/60);
         TV.println(90,10,seconds);
       }      
       
      //posy = analogRead(channelAI);       // read the value from the sensor:
      temperature = Read_Temperature();   // + temptol;    
      posy = 120-temperature;     
      //-------------------------------------------------------------------------------------------------
      //check temp here
      //
      if((cure_t > 60*30) || (cure_t < 60*60))   // check low temp during ramp
       {
        if(temperature < 100) error_low();   
       } 
    
      if((cure_t > 60*60) || (cure_t < 60*60*2))  // check low temp during soak first hour
       {
        if(temperature < 175) error_low();   
       } 
      
      if((cure_t > 60*60*2) || (cure_t < 60*60*4))  // check low temp during soak 2, 3, 4  hour
       {
        if(temperature < 175) error_low();   
       }    
      
       if((cure_t > 60*60*4) || (cure_t < 60*60*5))  // check high temp during cool down
       {
        if(temperature > 175) error_high();   
       }       
      
       if(temperature > 185) error_high();   // check high temp at any time

      
      
      //-------------------------------------------------------------------------------------------------

      TV.select_font(font4x6);
      TV.println(30,2,temperature);
      TV.println(50,2,"*C, Cure=       m");

      myArray[yCtr] = (posy/xVariable);   // scale the value based on the x scale potentiometer 
      delay (delayVariable);           // scale the y collection of data using the delay from the y potentiometer  

       TV.set_pixel(yCtr, myArray[yCtr], 1); // Prepare the 126 pixels      
    }
  
    yCtr == 0;                 
      TV.clear_screen();
      draw_axis();
  for(yCtr = 0; yCtr < 127 ; yCtr += 1)  // for loop runs 126 times
    {
       TV.get_pixel(yCtr, myArray[yCtr]); // Output to TV
    }

       yCtr == 0;                         


void error_low()
{
  TV.select_font(font6x8);
  TV.println(10,50,"ERROR LOW TEMP  "); 
  digitalWrite(BUZZER,HIGH); // Enable on
  while(digitalRead(RESETBTN)){}
}

void error_high()
{
  TV.select_font(font6x8);
  TV.println(10,50,"ERROR HIGH TEMP"); 
  digitalWrite(BUZZER,HIGH); // Enable on
  while(digitalRead(RESETBTN)){}
}


//int Read_time()
//{
//  return (millis() );
//}  


//int Cure_time()
//{
//  return millis()- base_t;
//}

void draw_axis() {
  TV.select_font(font4x6);
  TV.println(5,2,"Temp= ");
  TV.draw_line(2,2,2,96,INVERT);
  TV.draw_line(2,94,128,94,INVERT);
  TV.draw_line(12,94,12,96,WHITE);
    TV.draw_line(12,93,12,96,WHITE);
    TV.draw_line(24,93,24,96,WHITE);
    TV.draw_line(36,93,36,96,WHITE);
    TV.draw_line(48,93,48,96,WHITE);
    TV.draw_line(60,93,60,96,WHITE);
    TV.draw_line(72,93,72,96,WHITE);
    TV.draw_line(84,93,84,96,WHITE);
    TV.draw_line(96,93,96,96,WHITE);
    TV.draw_line(108,93,108,96,WHITE);
    TV.draw_line(128,93,128,96,WHITE);
  
    TV.draw_line(0,10,4,10,WHITE);
    TV.draw_line(0,20,4,20,WHITE);
    TV.draw_line(0,30,4,30,WHITE);
    TV.draw_line(0,40,4,40,WHITE);
    TV.draw_line(0,50,4,50,WHITE);
    TV.draw_line(0,60,4,60,WHITE);
    TV.draw_line(0,70,4,70,WHITE);
    TV.draw_line(0,80,4,80,WHITE);
    TV.draw_line(0,90,4,90,WHITE);

}


int Read_Temperature() {
  int value = 0;
  float temp;
  int temp_out;
  int samples = 10;
  float error_tc;

  digitalWrite(CS_TEMP,LOW);
  delay(2);
  digitalWrite(CS_TEMP,HIGH);
  delay(220);


  for (int i=samples; i>0; i--){
    digitalWrite(CS_TEMP,LOW); // Enable device
    /* Cycle the clock for dummy bit 15 */
    digitalWrite(SCK,HIGH);
    delay(1);
    digitalWrite(SCK,LOW);
    for (int i=11; i>=0; i--){
      digitalWrite(SCK,HIGH);  // Set Clock to HIGH
      value += digitalRead(SO) << i;  // Read data and add it to our variable
      digitalWrite(SCK,LOW);  // Set Clock to LOW
    }

    /* Read the TC Input inp to check for TC Errors */
    digitalWrite(SCK,HIGH); // Set Clock to HIGH
    error_tc = digitalRead(SO); // Read data
    digitalWrite(SCK,LOW);  // Set Clock to LOW

      for (int i=1; i>=0; i--) {
      digitalWrite(SCK,HIGH);
      delay(1);
      digitalWrite(SCK,LOW);
    }

    digitalWrite(CS_TEMP, HIGH); //Disable Device
  }

  value = value/samples;  // Divide the value by the number of samples to get the average
  temp = (value*0.25);  // Multiply the value by 25 to get temp in [ch730]C
  temp_out = temp;  // Send the float to an int (X10) for ease of printing.

  /* Output 9999 if there is a TC error, otherwise return 'temp' */
  if(error_tc != 0) { 
    return -1; 
  } 
  else { 
    return temp_out; 
  }
}