Arduino schéma - arduino.sk

IR teplomer - Vymena LCD za OLED

Kompletné projekty s návodom a zdrojovým kódom
Obrázok užívateľa
Príspevky: 14
Registrovaný: Uto 10. Apr 2012 14:35:37

IR teplomer - Vymena LCD za OLED

Poslaťod peter » Sob 18. Máj 2013 13:57:03

Ahojte,

Podarilo sa mi rozbit LCD dislej na infracervenom bezkontaktnom teplomeri. Bolo by skoda ho vyhodit a kupovat novy, tak som sa rozhodol popatrat aka by bola moznost opravy. Teplomer ma seriove rozhranie cez ktore sa s nim da komunikovat. Celkom rychlo sa mi podarilo najst uz nieco hotove kde stacilo dolepit kod pre OLED displej s kontrolerom SSD1306.
Pinout disleja je v zdrojovom kode.
Teplomer pracoval na dve baterie AAA a to nebolo dost pre OLED displej, ktory potrebuje aspon 3.3V tak som do tela umiestnil Li-ion 3.7V bateriu a doplnil nabijacim IC TP4056 (vid samostatna tema v hardware sekcii). Odteraz nabijam cez usb.

IMG_4447.JPG


Kód: Vybrať všetko
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


byte n = 0;                                  // Interrupt Bit Count            
volatile byte pos = 0;                  // Values Position Count
volatile byte values[5] = {
  0,0,0,0,0};                                                      // Values to be stored by sensor
byte cbit = 0;                          // Current bit read in

boolean irFlag = false;                  // Flag to indicate IR reading has been made
boolean ambFlag = false;               // Flag to indicate ambient temp reading has been made


byte irValues[5] = {
  0,0,0,0,0};                                           // Variable to store IR readings
byte ambValues[5] = {
  0,0,0,0,0};                                               // Variable to store Ambient readings

const int len = 5;                             // Length of values array
const int clkPin = 3;                               // Pins
const int dataPin = 2;
const int actionPin = 5;  //not used


void setup() {
Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)
  //display.clearDisplay();
  //display.setTextColor(BLACK, WHITE); // 'inverted' text
 
  display.setTextSize(1);
  display.setTextColor(BLACK, WHITE);
  display.setCursor(0,37);
  display.println("Uvitacia obrazovka");
    display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,20);
  display.println("Caka sa na teplotu...");
  //display.setCursor(0,57);
  display.display();
 
  pinMode(clkPin, INPUT);               // Initialize pins
  pinMode(dataPin, INPUT);
  pinMode(actionPin, OUTPUT);
  digitalWrite(clkPin, HIGH);
  digitalWrite(dataPin, HIGH);
  digitalWrite(actionPin, HIGH);

  attachInterrupt(1,tn9Data,FALLING);                // Interrupt
 
}


void loop() {



     //display.clearDisplay();
  //display.setTextColor(BLACK, WHITE); // 'inverted' text

  display.setTextSize(4);
  display.setTextColor(WHITE);
  display.setCursor(5,7);    // line 1: 0,46     line 2: 0,57

  gettemp();
  display.display();
 
}




void tn9Data(){                  // Interrupt Function
  cbit =  digitalRead(dataPin);                 // Read bit
  if(pos >= len) pos = 0;                    // Keep index below 5
  values[pos] = (values[pos] << 1) | cbit;           // Store to values
  n++;                     // Increment bit count
  if(n == 8){                  // Increment position count based on bits read in
    pos++;
    n = 0;
  }
  if(pos == len){                // If complete "packet" sent, stop sensor from sending
    digitalWrite(actionPin,HIGH);                // again until main loop allows it.
  }
}


boolean tn9Check(byte tn9Values[]){         // Checksum calculating function
  int mcheck = (int)tn9Values[0] + (int)tn9Values[1] + (int)tn9Values[2];   // Checksum calculation
  int scheck = (int)tn9Values[3];                // Checksum sent by sensor
  boolean crc = false;                  // Initialize return value
  if(mcheck > 510) mcheck = mcheck - 512;           // Handle sensor byte rollover
  if(mcheck > 255) mcheck = mcheck - 256;           // Handle sensor byte rollover
  if(mcheck == scheck) crc = true;         // Check checksum
  return(crc);                  // Return
}

void gettemp(){

  if(pos == len && values[0] == 0x4C){              // If sensor has sent IR packet...
    for(int i = 0; i < len; i++){                         // Store values to irValues
      irValues[i] = values[i];
    }
    irFlag = true;                                   // Indicate IR reading
    pos = 0;
    //digitalWrite(actionPin,LOW);                // Make sensor start sending data
  }

  if(pos == len && values[0] == 0x66){              // If sensor has sent ambient packet...
    for(int i = 0; i < len; i++){                       // Store values to ambValues
      ambValues[i] = values[i];
    }
    ambFlag = true;                          // Indicate Ambient reading
    pos = 0;
    //digitalWrite(actionPin,LOW);              // Make sensor start sending data   
  }

  if(pos == len && values[0] == 0x53){                   // If sensor has sent junk packet
    pos = 0;
    //digitalWrite(actionPin,LOW);             // Make sensor start sending data   
  }

  if(irFlag && ambFlag){            // If successful IR and Ambient reading...
    digitalWrite(actionPin,HIGH);              // Make sensor stop sending data.  Because Timing is weird, I want to ensure the interrupts do not happen during this section.   
    word tempword = 0;                   // Next 4 lines isolate temperature component of values
    tempword = tempword | irValues[1];
    tempword = tempword << 8;
    tempword = tempword | irValues[2];
    if(tn9Check(irValues)){            // If checksum is valid, print IR temperature
      //Serial.print("IR = ");
      display.clearDisplay();
     
      Serial.print(int(tempword)/16.0 - 273.15);
      display.println(int(tempword)/16.0 - 273.15);
      Serial.print(", ");       
    }
    else{                       // If checksum isn't valid, print impossible temp
      //Serial.print("IR = ");
      Serial.print("-273.15, ");
    }

    tempword = 0;               // Isolate temperature component again for ambient
    tempword = tempword | ambValues[1];
    tempword = tempword << 8;
    tempword = tempword | ambValues[2];
    if(tn9Check(ambValues)){            // If checksum is valid, print ambient temperature
      //Serial.print("Amb = ");
      Serial.print(int(tempword)/16.0 - 273.15);
      display.setTextSize(2);
      display.setCursor(61,52);
      display.print(int(tempword)/16.0 - 273.15); 
    display.setTextSize(1);
  //display.setTextColor(WHITE);
  display.setCursor(18,57);
  display.println("Okolie:");
  display.setCursor(4,35);
  display.println("text pod teplotou");
display.drawLine(0, 50, 128, 50, WHITE);
display.drawLine(0, 0, 128, 0, WHITE);
    }
    else{                  // If checksum isn't valid, print impossible temp
      //Serial.print("Amb = ");
      Serial.print("-273.15");
    }
    irFlag = false;               // Reset flags
    ambFlag = false;
   
    //Serial.println(" ");
    //delay(2000);               // Simulate other sensors or code
    //digitalWrite(actionPin,LOW);                   // Make sensor start sending data 
}                                 
}
Prílohy
IMG_4448.JPG
IMG_4449.JPG
IMG_4450.JPG
usb nabijanie

Obrázok užívateľa
Príspevky: 300
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: IR teplomer - Vymena LCD za OLED

Poslaťod tomXX » Str 29. Máj 2013 13:42:32

Displej super, ale tá vyhryzená diera na USB je úplná raketa :D
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Príspevky: 26
Registrovaný: Ned 17. Mar 2013 3:11:53

Re: IR teplomer - Vymena LCD za OLED

Poslaťod sampler » Pon 03. Jún 2013 23:55:24

Pekna praca aj kod, mechanicky by som to spravil urcite krajsie, ale bol by som radsej, keby som rozumel aspon 50% tvojho kodu :-)

Obrázok užívateľa
Príspevky: 300
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: IR teplomer - Vymena LCD za OLED

Poslaťod tomXX » Štv 27. Nov 2014 15:50:57

blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Späť na Hotové projekty