FSST - Hardwarenahe Programmierung

You are viewing an older revision! See the latest version

Klassendesign LM75B

Inhalt

C++-Seite

Wozu UML und objektorientierte Modellierung gebraucht wird; wird in dem Buch UML @ Classroom eine Einführung mit vertonten Folien gegeben (z.B. hier für das Klassendiagramm).

Die folgende Überführung aus der strukturierten Programmierung in C in ein Klassendesign der objektorientierten Programmierung in C++ wurde mit dem Programm StarUML bzw. neue Version 3.0 vorgenommen, wobei zwei Unzulänglichkeiten aufgetreten sind: void vor dem Konstruktor und der Aufruf des Konstruktors in der CPP-datei der Klasse I2C wurd nicht richtig abgebildet (LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)).

Die folgende Abbildung zeigt das Klassendiagramm in UML (Unified Modeling Language), wobei die I2C Klasse nur der Vollständigkeit halber hinzugefügt wurde, da sie in der MBED-Bibliothek enthalten ist:

/media/uploads/fpucher/lm75b_uml.jpg

//
//  Generated by StarUML(tm) C++ Add-In
//
//  @ Project : Untitled
//  @ File Name : LM75B.h
//  @ Date : 11.03.2016
//  @ Author : pe
//

#if !defined(_LM75B_H)
#define _LM75B_H


class LM75B {
public:
	void LM75B();
	void LM75B(PinName sda, PinName scl);
	float read();
protected:
	I2C i2c;
};

#endif  //_LM75B_H

Adaptierte Header-Datei:

#include "mbed.h"

#if !defined(_LM75B_H)
#define _LM75B_H
 
//  LM75B I2C Adresse
#define    LM75B_ADDR 0x90
 
//  LM75B Register
#define    LM75B_Conf        0x01
#define    LM75B_Temp        0x00
 
class LM75B
{
public:
  LM75B(PinName sda, PinName scl);  // I2C Pins übergeben p28, p27
  ~LM75B();
  float read(); 
  
private:
  I2C i2c;
};
 
#endif  //_LM75B_H

Aus Star-UML generierte CPP-Datei der LM75B Klasse:

//
//  Generated by StarUML(tm) C++ Add-In
//
//  @ Project : Untitled
//  @ File Name : LM75B.cpp
//  @ Date : 11.03.2016
//  @ Author : pe
//

#include "LM75B.h"

void LM75B::LM75B() {
}

void LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)  // fehlt im aus StarUML generiertem Code
{
}

float LM75B::read() {
}

CPP-Implementierung der LM75B Klasse:

// https://developer.mbed.org/cookbook/LM75B-Temperature-Sensor
#include "mbed.h"
#include "LM75B.h"
 

LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl)  // fehlt im aus StarUML generiertem Code
{
    char cmd[2];
    cmd[0]    = LM75B_Conf;
    cmd[1]    = 0x0;   
    i2c.write( LM75B_ADDR, cmd, 2);
}
 
float LM75B::read() {
    char cmd[2];
    cmd[0] = LM75B_Temp;
   
    i2c.write(LM75B_ADDR, cmd, 1);  // Send command 
    i2c.read(LM75B_ADDR, cmd, 2);   // Read command 
    return (float((cmd[0]<<8)|cmd[1]) / 256.0);    
}

LM75B::~LM75B(){}

Testprogramm:

#include "mbed.h"
#include "LM75B.h"

Serial pc(USBTX, USBRX);
LM75B sensor(p28, p27);
 
int main ()
{
    while (1) {
        pc.printf("Temp = %.2f\n", sensor.read());
        wait(1);
    }
}

All wikipages