#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Adafruit_BMP280.h>
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"воскр", "понед", "вторн", "среда", "четвг", "пятн", "субот"};
Adafruit_BMP280 bmp280;
int mm;
int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 7; // число матриц
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
String tape = "";
int wait = 15; // скорость
int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
String Serial_Read() {
unsigned char c; // переменная для чтения сериал порта
String Serial_string = ""; // Формируемая из символов строка
while (Serial.available() > 0) { // Если в сериал порту есть символы
c = Serial.read(); // Читаем символ
//Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
if (c == '\n') { // Если это конец строки
return Serial_string; // Возвращаем строку
}
if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
}
return Serial_string;
}
String chas;
String myn;
//String mesyc = "";
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280"));
//==================================== часы
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//====================================
while (!bmp280.begin(BMP280_ADDRESS - 1)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
delay(2000);
}
matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости
matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270
//a=a+1;
}
void loop() {
DateTime now = rtc.now();
float temperature = bmp280.readTemperature();
float pressure = bmp280.readPressure();
float altitude = bmp280.readAltitude(1014.7);
mm = pressure/133.322;// тут вычисляем мм ртутного столба
//======================================= корекция цыфр времени ноль перед числом
chas ="";
myn = "";
if (now.hour() < 10) {
chas = '0';
}
if (now.minute() < 10) {
myn = ('0');
}
//=======================================
tape = utf8rus((String)+daysOfTheWeek[now.dayOfTheWeek()]+" время "+chas +now.hour()+":"+myn+now.minute()+" температура = "+temperature +"^С время " +chas +now.hour()+":"+myn+now.minute()+ " давление = "+ mm +" мм/рт.ст.");
if (Serial.available()){
tape=Serial_Read();
}
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
matrix.fillScreen(LOW);
int letter = i / width; // номер символа выводимого на матрицу
int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали
while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
}
letter--;
x -= width;
}
matrix.write(); // Отправить картинку для отображения
delay(wait);
}
}
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
2. ....<тут было матом>...
Спасибо, давно так не ржал. :)))))
Над тем, что я запятую перед "если" пропустил? ;))
Спасибо злой кот. почитал, не чего не понял кроме здрасти.На забугорном форуме написали что не хватает памяти для каких то там переменных и предложили несколько вариантов для решения этой проблемы. реализовал как смог.А на счет той строчки над которой ты потешался они написали что все ОК.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Adafruit_BMP280.h>
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][24] = {"воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "субота"};
//char monthe[12][24] = { "Декабрь","январь","Февраль", "Март", "апрель", "Май", "Июнь", "июль", "Август", "Сентябрь", "Октябрь", "Ноябрь"};
Adafruit_BMP280 bmp280;
int mm;
int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 7;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
String tape = "";
int wait = 15; // скорость
int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
String Serial_Read() {
unsigned char c; // переменная для чтения сериал порта
String Serial_string = ""; // Формируемая из символов строка
while (Serial.available() > 0) { // Если в сериал порту есть символы
c = Serial.read(); // Читаем символ
//Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
if (c == '\n') { // Если это конец строки
return Serial_string; // Возвращаем строку
}
if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
}
return Serial_string;
}
String chas;
String myn;
//String mesyc = "";
int stroka = 0;//переменая строки
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280"));
//==================================== часы
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//====================================
while (!bmp280.begin(BMP280_ADDRESS - 1)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
delay(2000);
}
matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости
matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270
//a=a+1;
}
void loop() {
DateTime now = rtc.now();
float temperature = bmp280.readTemperature();
float pressure = bmp280.readPressure();
float altitude = bmp280.readAltitude(1014.7);
mm = pressure/133.322;
//======================================= корекция цыфр времени ноль перед числом
chas ="";
myn = "";
if (now.hour() < 10) {
chas = '0';
}
if (now.minute() < 10) {
myn = ('0');
}
//=======================================
if (stroka == 0) {
tape = utf8rus((String)" "+daysOfTheWeek[now.dayOfTheWeek()]+"");
}
if (stroka == 1) {
tape = utf8rus((String)" время "+chas +now.hour()+":"+myn+now.minute()+" температура = "+temperature +"^С давление = "+ mm +" мм/рт.ст.");
}
stroka += 1;
if (stroka == 2) {
stroka = 0;
}
if (Serial.available()){
tape=Serial_Read();
}
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
matrix.fillScreen(LOW);
int letter = i / width; // номер символа выводимого на матрицу
int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали
while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
}
letter--;
x -= width;
}
matrix.write(); // Отправить картинку для отображения
delay(wait);
}
}
Спасибо злой кот. почитал, не чего не понял кроме здрасти.На забугорном форуме написали что не хватает памяти для каких то там переменных и предложили несколько вариантов для решения этой проблемы. реализовал как смог.А на счет той строчки над которой ты потешался они написали что все ОК.
так я и не потешался, я хотел шаг за шагом тебя по твоему же коду провести за ручку (заняться от неча делать коррекционной педагогикой). Но, если ты это так воспринимаешь, я этова делать не буду.
кстати, массив дней недели, так как он у тебя обьявлен, жрёть 168 байт ОЗУ, а так как у меня - меньше, 117 всего. Чуешь разность на ровном месте?
строка Бога))
ты устанавливаешь температуру и давление среды, совершаешь побитовые операции с температурой и миллиметры делишь на ртутный столб))
я бы сделал через двоеточия, слова писал-бы с Большой Буквы, десятичные через запятую, нарисовал знак градусов ° и давление написал по человечески "мм рт. ст."
Пятница Температура: 27,1°С Давление: 748 мм рт. ст.
и т.д...
но это дело личное, кому как нравится)
ЗЫ: я кодер, но воспитывали меня дизайнеры)) шутка)
#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <Adafruit_BMP280.h> #include "RTClib.h" RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {"воскр", "понед", "вторн", "среда", "четвг", "пятн", "субот"}; Adafruit_BMP280 bmp280; int mm; int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK) int numberOfHorizontalDisplays = 1; int numberOfVerticalDisplays = 7; // число матриц Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = ""; int wait = 15; // скорость int spacer = 2; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина шрифта 5 пикселей /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ //Serial.print(c,HEX); Serial.print(" "); Serial.print(c); if (c == '\n') { // Если это конец строки return Serial_string; // Возвращаем строку } if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ if (c >= 0xBF && c <= 0xFF) c = c - 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } String chas; String myn; //String mesyc = ""; void setup() { Serial.begin(9600); Serial.println(F("BMP280")); //==================================== часы if (! rtc.begin()) { Serial.println("Couldn't find RTC"); Serial.flush(); abort(); } if (! rtc.isrunning()) { Serial.println("RTC is NOT running, let's set the time!"); // When time needs to be set on a new device, or after a power loss, the // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } //==================================== while (!bmp280.begin(BMP280_ADDRESS - 1)) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); delay(2000); } matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270 //a=a+1; } void loop() { DateTime now = rtc.now(); float temperature = bmp280.readTemperature(); float pressure = bmp280.readPressure(); float altitude = bmp280.readAltitude(1014.7); mm = pressure/133.322;// тут вычисляем мм ртутного столба //======================================= корекция цыфр времени ноль перед числом chas =""; myn = ""; if (now.hour() < 10) { chas = '0'; } if (now.minute() < 10) { myn = ('0'); } //======================================= tape = utf8rus((String)+daysOfTheWeek[now.dayOfTheWeek()]+" время "+chas +now.hour()+":"+myn+now.minute()+" температура = "+temperature +"^С время " +chas +now.hour()+":"+myn+now.minute()+ " давление = "+ mm +" мм/рт.ст."); if (Serial.available()){ tape=Serial_Read(); } for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape[letter], HIGH, LOW,1); } letter--; x -= width; } matrix.write(); // Отправить картинку для отображения delay(wait); } }начнем, помолясь, с самого начала. Хто тебя вот этому научил?
char daysOfTheWeek[7][12] = {"воскр", "понед", "вторн", "среда", "четвг", "пятн", "субот"};в этот массив больше 5 символов не залазит.
в этот массив больше 5 символов не залазит.
Но вопрос другой был. Где ты это увидел, или кто тебя научил такому?
а че там не так.
в этот массив больше 5 символов не залазит.
что за бред?
А у меня залазит
const char* const DaysString[] = { "воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота" }; const uint8_t DAYS_COUNT = 7; void PrintDays() { for (uint8_t i = 0; i < DAYS_COUNT; ++i) { Serial.println(DaysString[i]); } }выдает ошибку, слишком длинная строка.
initializer-string for array of chars is too long [-fpermissive]
тогда тебе надо чонить за UTF-8 почитать
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
2. ....<тут было матом>...
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
2. ....<тут было матом>...
Спасибо, давно так не ржал. :)))))
1. Это раздел "Проекты", а не "Творчество душевнобольных", поэтому нужно перенести в "Песочницу", и уже там заниматься "коррекционной педагогикой" если кому-то требуется соответствующий скилл-ап.
2. ....<тут было матом>...
Спасибо, давно так не ржал. :)))))
Над тем, что я запятую перед "если" пропустил? ;))
Над тем, что я запятую перед "если" пропустил? ;))
Нет, над меткими характеристиками происходящего
Спасибо злой кот. почитал, не чего не понял кроме здрасти.На забугорном форуме написали что не хватает памяти для каких то там переменных и предложили несколько вариантов для решения этой проблемы. реализовал как смог.А на счет той строчки над которой ты потешался они написали что все ОК.
#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <Adafruit_BMP280.h> #include "RTClib.h" RTC_DS1307 rtc; char daysOfTheWeek[7][24] = {"воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "субота"}; //char monthe[12][24] = { "Декабрь","январь","Февраль", "Март", "апрель", "Май", "Июнь", "июль", "Август", "Сентябрь", "Октябрь", "Ноябрь"}; Adafruit_BMP280 bmp280; int mm; int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK) int numberOfHorizontalDisplays = 1; int numberOfVerticalDisplays = 7; Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = ""; int wait = 15; // скорость int spacer = 2; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина шрифта 5 пикселей /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ //Serial.print(c,HEX); Serial.print(" "); Serial.print(c); if (c == '\n') { // Если это конец строки return Serial_string; // Возвращаем строку } if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ if (c >= 0xBF && c <= 0xFF) c = c - 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } String chas; String myn; //String mesyc = ""; int stroka = 0;//переменая строки void setup() { Serial.begin(9600); Serial.println(F("BMP280")); //==================================== часы if (! rtc.begin()) { Serial.println("Couldn't find RTC"); Serial.flush(); abort(); } if (! rtc.isrunning()) { Serial.println("RTC is NOT running, let's set the time!"); // When time needs to be set on a new device, or after a power loss, the // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } //==================================== while (!bmp280.begin(BMP280_ADDRESS - 1)) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); delay(2000); } matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270 //a=a+1; } void loop() { DateTime now = rtc.now(); float temperature = bmp280.readTemperature(); float pressure = bmp280.readPressure(); float altitude = bmp280.readAltitude(1014.7); mm = pressure/133.322; //======================================= корекция цыфр времени ноль перед числом chas =""; myn = ""; if (now.hour() < 10) { chas = '0'; } if (now.minute() < 10) { myn = ('0'); } //======================================= if (stroka == 0) { tape = utf8rus((String)" "+daysOfTheWeek[now.dayOfTheWeek()]+""); } if (stroka == 1) { tape = utf8rus((String)" время "+chas +now.hour()+":"+myn+now.minute()+" температура = "+temperature +"^С давление = "+ mm +" мм/рт.ст."); } stroka += 1; if (stroka == 2) { stroka = 0; } if (Serial.available()){ tape=Serial_Read(); } for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape[letter], HIGH, LOW,1); } letter--; x -= width; } matrix.write(); // Отправить картинку для отображения delay(wait); } }Спасибо злой кот. почитал, не чего не понял кроме здрасти.На забугорном форуме написали что не хватает памяти для каких то там переменных и предложили несколько вариантов для решения этой проблемы. реализовал как смог.А на счет той строчки над которой ты потешался они написали что все ОК.
так я и не потешался, я хотел шаг за шагом тебя по твоему же коду провести за ручку (заняться от неча делать коррекционной педагогикой). Но, если ты это так воспринимаешь, я этова делать не буду.
кстати, массив дней недели, так как он у тебя обьявлен, жрёть 168 байт ОЗУ, а так как у меня - меньше, 117 всего. Чуешь разность на ровном месте?
кому интересно посмотреть как работает. вот видео.
https://www.youtube.com/watch?v=zJDg0822uLs
А чо даты полной нету ?
А как на счёт датчика BME280?
ты устанавливаешь температуру и давление среды, совершаешь побитовые операции с температурой и миллиметры делишь на ртутный столб))
и т.д...
но это дело личное, кому как нравится)
ЗЫ: я кодер, но воспитывали меня дизайнеры)) шутка)