Тема: DS18B20+ЖК-модуль HT1621, 2,4 дюйма (Arduino)
Основная статья - http://rcl-radio.ru/?p=132305
#define LCD_CS 6
#define LCD_WR 7
#define LCD_DATA 8
#define UP 2
#define DW 3
#define SET 4
#define HT1621_BIAS 0x52 // 1/3duty 4com
#define HT1621_SYS_DIS 0x00 // Turn off the oscillator system oscillator and LCD bias generator
#define HT1621_SYS_EN 0x02 // Turn on the system oscillator
#define HT1621_LCD_OFF 0x04 // Turn off LCD bias
#define HT1621_LCD_ON 0x06 // Turn on the LCE bias
#define HT1621_XTAL 0x28 // external clock
#define HT1621_RC256 0x30 // internal clock
#include <EEPROM.h>
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
OneWire ds(11); // Вход датчика 18b20
unsigned long times;
int temp;
void setup() {
pinMode(LCD_CS, OUTPUT);
pinMode(LCD_WR, OUTPUT);
pinMode(LCD_DATA, OUTPUT);
pinMode(UP,INPUT_PULLUP);
pinMode(DW,INPUT_PULLUP);
pinMode(SET,INPUT_PULLUP);
digitalWrite(LCD_CS,HIGH);
digitalWrite(LCD_WR,HIGH);
data_100(HT1621_SYS_EN); // Turn on the system oscillator
data_100(HT1621_BIAS); // BIAS 13 4 public ports
data_100(HT1621_RC256); // Use RC_256K system clock source, on-chip RC oscillator
data_100(HT1621_LCD_ON);
clear_lcd();
}
void loop(){
if(millis()-times>5000){temp=dsRead(0)*10;times=millis();}
print_lcd(5, 10,false);
print_lcd(4, temp/100%10,false);
print_lcd(3, temp/10%10,false);
print_lcd(2, temp%10,true);
print_lcd(1, 12,false);
print_lcd(0, 13,false);
delay(200);
}
void print_lcd(byte raz, byte num, bool dp){
switch(raz){
case 0: raz=0;break;
case 1: raz=2;break;
case 2: raz=4;break;
case 3: raz=6;break;
case 4: raz=8;break;
case 5: raz=10;break;
}
switch(num){
case 0: data_101(raz,0b1110+dp);data_101(raz+1,0b1011);break; // 0
case 1: data_101(raz,0b0110+dp);data_101(raz+1,0b0000);break; // 1
case 2: data_101(raz,0b1100+dp);data_101(raz+1,0b0111);break; // 2
case 3: data_101(raz,0b1110+dp);data_101(raz+1,0b0101);break; // 3
case 4: data_101(raz,0b0110+dp);data_101(raz+1,0b1100);break; // 4
case 5: data_101(raz,0b1010+dp);data_101(raz+1,0b1101);break; // 5
case 6: data_101(raz,0b1010+dp);data_101(raz+1,0b1111);break; // 6
case 7: data_101(raz,0b1110+dp);data_101(raz+1,0b0000);break; // 7
case 8: data_101(raz,0b1110+dp);data_101(raz+1,0b1111);break; // 8
case 9: data_101(raz,0b1110+dp);data_101(raz+1,0b1101);break; // 9
case 10: data_101(raz,0);data_101(raz+1,0);break; // пусто
case 11: data_101(raz,0b0000);data_101(raz+1,0b0100);break; // -
case 12: data_101(raz,0b1100);data_101(raz+1,0b1100);break; // градус
case 13: data_101(raz,0b1000);data_101(raz+1,0b1011);break; // C
}
}
void clear_lcd(){for(int a=0;a<=32;a++){data_101(a,0);}}
void data_100(int data){
digitalWrite(LCD_CS,LOW);
for(int i = 2; i >=0; i--){
digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
digitalWrite(LCD_DATA, (0b100 >> i) & 1);
digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
}
for(int i = 8; i >=0; i--){
digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
digitalWrite(LCD_DATA, (data >> i) & 1);
digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
}
delayMicroseconds(10);digitalWrite(LCD_CS,HIGH);
delayMicroseconds(10);digitalWrite(LCD_WR,LOW);
delayMicroseconds(10);
}
void data_101(int addr, int data){
digitalWrite(LCD_CS,LOW);
for(int i = 2; i >=0; i--){
digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
digitalWrite(LCD_DATA, (0b101 >> i) & 1);
digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
}
for(int i = 5; i >=0; i--){
digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
digitalWrite(LCD_DATA, (addr >> i) & 1);
digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
}
for(int i = 0; i <=3; i++){
digitalWrite(LCD_WR,LOW);delayMicroseconds(10);
digitalWrite(LCD_DATA, (data >> i) & 1);
digitalWrite(LCD_WR,HIGH);delayMicroseconds(10);
}
delayMicroseconds(10);digitalWrite(LCD_CS,HIGH);
delayMicroseconds(10);digitalWrite(LCD_WR,LOW);
}
float dsRead(byte x) {
byte data_[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data_[0] = ds.read();// Чтение памяти byte low
data_[1] = ds.read();// Чтение памяти byte high
float value = ((data_[1] << 8) | data_[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}