Тема: Измерение температуры (18B20) с записью данных на MicroSD
1 скетч
// Подключение
// CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
// 18B20 OUT A1, +5V VCC
// DS3231 SDA A4, SCL A5, VCC +5V
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <DS3231.h>
OneWire oneWire(A1);
DallasTemperature t(&oneWire);
DS3231 clock;
RTCDateTime DateTime;
File myFile;
float temp;
long nomer;
void setup() {
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {Serial.println(" Error!!!"); return;}
else{Serial.println(" OK");}// проверка подключения
t.begin();
t.setResolution(12);// 12 bit 18b20
clock.begin();
// clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно
}
void loop() {
DateTime = clock.getDateTime();
Serial.print(clock.dateFormat("d-m-Y H:i:s", DateTime));
Serial.print(" ");
t.requestTemperatures();
Serial.println(temp = t.getTempCByIndex(0));//считываем температуру
delay(5000);// записывать данные на CD каждые 5 сек
nomer++;
myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
myFile.print(nomer);// запись
myFile.print(" ");// запись
myFile.print(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
myFile.print(DateTime.year);myFile.print(" ");
myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);
myFile.print(" ");// запись
myFile.println(temp);// запись
myFile.close();// закрываем файл
}
2 скетч
// Подключение
// CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
// 18B20 OUT A1, +5V VCC
// DS3231 SDA A4, SCL A5, VCC +5V
// TM1637 CLK D7, DIO D6, VCC +5V
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <EEPROM.h> //#include <EEPROM.h>// в новой версии ARDUINO IDE
#include <DS3231.h>
#include <TM1637Display.h>
OneWire oneWire(A1);
TM1637Display display(7, 6);// CLK,DIO
DallasTemperature t(&oneWire);
DS3231 clock;
RTCDateTime DateTime;
File myFile;
float temp1,temp2;
int t1,t2,n,t0,reg1,reg2,w,minus_reg1,minus_reg2;
unsigned long time;
uint8_t data[]{0,0,0,0};
const int gis = 1;// гистерезис
void setup() {
Serial.begin(9600);
pinMode(A3,INPUT);// кнопка выбора
pinMode(9,INPUT);// кнопка плюс
pinMode(3,INPUT);// кнопка минус
pinMode(5,OUTPUT);// выход управления реле 1 канал
pinMode(8,OUTPUT);// выход управления реле 2 канал
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {Serial.println(" Error!!!");}
else{Serial.println(" OK");}// проверка подключения
display.setBrightness(1);// яркость TM1637 0-7
t.begin();
t.setResolution(10);// 10 bit 18b20
clock.begin();
// clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно
reg1 = EEPROM.read(0);
minus_reg1 = EEPROM.read(1);
if(minus_reg1==1){reg1=reg1-2*reg1;}
reg2 = EEPROM.read(2);
minus_reg2 = EEPROM.read(3);
if(minus_reg2==1){reg2=reg2-2*reg2;}
}
void loop() {
DateTime = clock.getDateTime();
Serial.print(clock.dateFormat("d-m-Y H:i:s", DateTime));
t.requestTemperatures();
Serial.print(" t1 = ");
Serial.print(temp1 = t.getTempCByIndex(0));//считываем температуру 1 датчик
Serial.print(" t2 = ");
Serial.print(temp2 = t.getTempCByIndex(1));//считываем температуру 2 датчик
Serial.println(" ");
//////////////////////// запись SD /////////////////////////////////////
if(millis()-time>10000){
myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
myFile.print(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
myFile.print(DateTime.year);myFile.print(" ");
myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);
myFile.print(" t1 = ");// запись
myFile.print(temp1);// запись
myFile.print(" r1 = ");// запись
myFile.print(reg1);// запись
myFile.print(" t2 = ");// запись
myFile.print(temp2);// запись
myFile.print(" r2 = ");// запись
myFile.println(reg2);// запись
myFile.close();// закрываем файл
time=millis();
}
////////////////////////////////////////////////////////////////////////
t1 = temp1;t2 = temp2;
///////////////////////////// кнопки управления //////////////////////
if(analogRead(A3)>=900){n++;delay(200);if(n>3){n=0;}}// кнопка выбор
// терморегулятор 1
if(digitalRead(9)==HIGH && n==2){w=1;reg1++;delay(200);if(reg1>125){reg1=125;}}// плюс
if(digitalRead(3)==HIGH && n==2){w=1;reg1--;delay(200);if(reg1<-55){reg1=-55;}}// минус
// терморегулятор 2
if(digitalRead(9)==HIGH && n==3){w=1;reg2++;delay(200);if(reg2>125){reg2=125;}}//плюс
if(digitalRead(3)==HIGH && n==3){w=1;reg2--;delay(200);if(reg2<-55){reg2=-55;}}//минус
if(n==0 && w==1){ EEPROM.update(0,abs(reg1));
if(reg1<0){minus_reg1=1;}else{minus_reg1=0;}
EEPROM.update(1,minus_reg1);
EEPROM.update(2,abs(reg2));
if(reg2<0){minus_reg2=1;}else{minus_reg2=0;}
EEPROM.update(3,minus_reg2);w=0;}
/////////////////////////////////////////////////////////////////////
////////////////////////////// вывод на индикатор M1637 /////////////
if(n==0){t0=t1;data[0] = 0x10;}
if(n==1){t0=t2;data[0] = 0x14;}
if(n==2){t0=reg1;data[0] = 0x11;}
if(n==3){t0=reg2;data[0] = 0x15;}
if(t0 > 99){data[1] = display.encodeDigit((t0/100)%10);}
else{data[1] = 0x00;}
if(t0 < 0){t0=abs(t0);data[1] = 0x40;}
data[2] = display.encodeDigit((t0/10)%10);
data[3] = display.encodeDigit((t0%10)%10);
display.setSegments(data);
////////////////////////////////////////////////////////////////////
// выходы управления реле ///
if(reg1 >= temp1 + gis){digitalWrite(5,HIGH);}
if(reg1 <= temp1 - gis){digitalWrite(5,LOW);}
if(reg2 >= temp2 + gis){digitalWrite(8,HIGH);}
if(reg2 <= temp2 - gis){digitalWrite(8,LOW);}
}