26

Re: Измерение температуры (18B20) с записью данных на MicroSD

Тестируйте, в железе не проверял.

//    Подключение
 
//  CD       MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
//  18B20    OUT A1, +5V VCC // все датчики подключаются к одному входу
//  DS1307   SDA A4, SCL A5, VCC +5V
 
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <iarduino_RTC.h> // http://rcl-radio.ru/wp-content/uploads/2020/01/iarduino_RTC.zip
OneWire oneWire(A1);
DallasTemperature t(&oneWire);
iarduino_RTC time(RTC_DS1307);
File myFile; 
float temp1,temp2,temp3,temp4;
unsigned 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);
  time.begin();
  // УСТАНОВКА ВРЕМЕНИ
  //  time.settime(0,5,11,30,1,20,4);  // 0  сек, 5 мин, 11 час, 30, января, 2020 года, четверг
  //  time.settime(-1, -1, -1, 30, 1, 20); // Установить дату 30.01.2020, а время и день недели оставить без изменений
}
 
void loop(){
   time.gettime();
   Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
   Serial.print(" ");
   t.requestTemperatures();
   Serial.println(temp1 = t.getTempCByIndex(0));//считываем температуру
   Serial.println(temp2 = t.getTempCByIndex(1));//считываем температуру
   Serial.println(temp3 = t.getTempCByIndex(2));//считываем температуру
   Serial.println(temp4 = t.getTempCByIndex(3));//считываем температуру
   nomer++;
 
   myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
   myFile.print(nomer);// запись
   myFile.print(" ");// запись

   myFile.print(time.day/10);myFile.print(time.day%10);myFile.print("-");
   myFile.print(time.month/10);myFile.print(time.month%10);myFile.print("-");
   myFile.print(time.year);myFile.print(" ");

   myFile.print(time.Hours/10);myFile.print(time.Hours%10);myFile.print("-");
   myFile.print(time.minutes/10);myFile.print(time.minutes%10);myFile.print("-");
   myFile.print(time.seconds/10);myFile.print(time.seconds%10);
   
   myFile.print(" t1 = ");myFile.println(temp1);
   myFile.print(" t2 = ");myFile.println(temp2);
   myFile.print(" t3 = ");myFile.println(temp3);
   myFile.print(" t4 = ");myFile.println(temp4);
   myFile.close();// закрываем файл
   delay(60000); // 10 мин
   delay(60000);
   delay(60000);
   delay(60000);
   delay(60000);
   delay(60000);
}

Re: Измерение температуры (18B20) с записью данных на MicroSD

Спасибо, шустро как у Вас!!! И библиотека  зашла как по маслу, вот загрузил, весь в ожидании... Через полчаса карту выну и обследую ее  на девственность, уверен, что все будет ок. Огромное спасибо.

28

Re: Измерение температуры (18B20) с записью данных на MicroSD

Поменяйте:
   delay(60000); // 10 мин
   delay(60000);
   delay(60000);
   delay(60000);
   delay(60000);
   delay(60000);
на
for(int i=0;i<60;i++){delay(60000);}

Я ошибся 60000 это не 10 минут, а 1 минута

Для тестирования i<60 исправьте на i<2 что бы получать данные каждые 2 минуты, потом вернете все обратно.

Re: Измерение температуры (18B20) с записью данных на MicroSD

Править не стал,  ибо если работает, то не чини! Огромное спасибо, конечно  все буду продолжать тестировать и пробывать улучшать, надо же учиться!! В планах не только  замер температуры и влажности, но и   так же вес улья,  микрофон для  контроля, а если овладею ESP8266 , то смогу регулировать  задвижку летковую, регулировку  вентиляции , и по ВайФаю.)),  Все эти электронные примочки , конечно же  не заменят живое общение с пчелками и их ужалениями, но  как помошники  весьма удобны  и  пока зима- будут изучать  эту увлекательную науку.Спасибо вам друзья.

Re: Измерение температуры (18B20) с записью данных на MicroSD

Добрый день, liman324! Обращаюсь к Вам с просьбой  еще  раз поправить Ваш скетч, а именно : вместо записи на MicroSD , производить вывод с датчиков в ексель через программу PLX-DAQ , да и часы  тоже не потребуются , ибо    DATA,TIME  можно взять  прямо с компа. И еще ..  а можно ли   брать данные с двух входов , где на каждом по четыре датчика. Буду признателен и чрезвычайно благодарен если сможете помочь.

Re: Измерение температуры (18B20) с записью данных на MicroSD

Сергей из Сибири пишет:

Добрый день, liman324! Обращаюсь к Вам с просьбой  еще  раз поправить Ваш скетч, а именно : вместо записи на MicroSD , производить вывод с датчиков в ексель через программу PLX-DAQ , да и часы  тоже не потребуются , ибо    DATA,TIME  можно взять  прямо с компа. И еще ..  а можно ли   брать данные с двух входов , где на каждом по четыре датчика. Буду признателен и чрезвычайно благодарен если сможете помочь.

Просто провожу  эксперимент, в одном улье разместил сразу две пчелинные семьи, через , так называемую ганемановскую решетку, которая позволяет рабочим пчелам переходить из отсека в отсек, а матки не могут пройти  изза своих габаритов. Я разместил в каждом отделении по 4 Dallasовских датчика , и от улья по четырех проводному кабелю  данные  принимаю в избушке. т.е. использую  два провода как + и -, а два провода  для передачи самих данных, подтягивающие резисторы  стоят на монтажной плате у Ардуино.

32

Re: Измерение температуры (18B20) с записью данных на MicroSD

К сожалению я не могу использовать PLX-DAQ, для нее требуется Windows, я использую другую ОС.

Re: Измерение температуры (18B20) с записью данных на MicroSD

liman324 пишет:

К сожалению я не могу использовать PLX-DAQ, для нее требуется Windows, я использую другую ОС.

А вывод просто на монитор через ком порт возможен, что б я мог просто смотреть?

34

Re: Измерение температуры (18B20) с записью данных на MicroSD

Это уже предусмотрено в скетче.

Re: Измерение температуры (18B20) с записью данных на MicroSD

liman324 пишет:

Это уже предусмотрено в скетче.

Я даже не пробывал, сегодня же проверю! А   второй вопрос , можно ли   брать данные с двух входов , где на каждом по четыре датчика. Что нужно  изменить в программе?

36

Re: Измерение температуры (18B20) с записью данных на MicroSD

OneWire oneWire0(A1);
DallasTemperature t0(&oneWire0);

OneWire oneWire1(A2);
DallasTemperature t1(&oneWire1);

чтение

   Serial.println(temp1 = t0.getTempCByIndex(0));//считываем температуру
   Serial.println(temp2 = t0.getTempCByIndex(1));//считываем температуру
   Serial.println(temp3 = t0.getTempCByIndex(2));//считываем температуру
   Serial.println(temp4 = t0.getTempCByIndex(3));//считываем температуру

   Serial.println(temp5 = t1.getTempCByIndex(0));//считываем температуру
   Serial.println(temp6 = t1.getTempCByIndex(1));//считываем температуру
   Serial.println(temp7 = t1.getTempCByIndex(2));//считываем температуру
   Serial.println(temp8 = t1.getTempCByIndex(3));//считываем температуру

Re: Измерение температуры (18B20) с записью данных на MicroSD

Огромное спасибо, сегодня же проверю и доложу!

Re: Измерение температуры (18B20) с записью данных на MicroSD

//  CD       MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
//  18B20    OUT A1, +5V VCC // все датчики подключаются к одному входу
//  DS1307   SDA A4, SCL A5, VCC +5V

#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <iarduino_RTC.h> // http://rcl-radio.ru/wp-content/uploads/ … no_RTC.zip
OneWire oneWire(A1);
DallasTemperature t(&oneWire);
iarduino_RTC time(RTC_DS1307);
File myFile;
float temp1,temp2,temp3,temp4;//float служит для хранения чисел с плавающей запятой где зпт. Точкой , если целые то можно int.
unsigned long nomer;
int row_excel = 0; // количество строк





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);
  time.begin();
  // УСТАНОВКА ВРЕМЕНИ
   time.settime(0,43,00,30,10,22,7);  // 0  сек, 5 мин, 11 час, 30, января, 2020 года, четверг
  //  time.settime(-1, -1, -1, 30, 1, 20); // Установить дату 30.01.2020, а время и день недели оставить без изменений

  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,temp1,temp2,temp3,temp4, Num Rows"); // заголовки столбцов


}

void loop(){
   time.gettime();
   Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
   Serial.print(" ");
   t.requestTemperatures();
   Serial.println(temp1 = t.getTempCByIndex(0));//считываем температуру
   Serial.println(temp2 = t.getTempCByIndex(1));//считываем температуру
   Serial.println(temp3 = t.getTempCByIndex(2));//считываем температуру
   Serial.println(temp4 = t.getTempCByIndex(3));//считываем температуру
   nomer++;

   myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
   myFile.print(nomer);// запись
   myFile.print(" ");// запись

   myFile.print(time.day/10);myFile.print(time.day%10);myFile.print("-");
   myFile.print(time.month/10);myFile.print(time.month%10);myFile.print("-");
   myFile.print(time.year);myFile.print(" ");

   myFile.print(time.Hours/10);myFile.print(time.Hours%10);myFile.print("-");
   myFile.print(time.minutes/10);myFile.print(time.minutes%10);myFile.print("-");
   myFile.print(time.seconds/10);myFile.print(time.seconds%10);
   
   myFile.print(" t1 = ");myFile.println(temp1);
   myFile.print(" t2 = ");myFile.println(temp2);
   myFile.print(" t3 = ");myFile.println(temp3);
   myFile.print(" t4 = ");myFile.println(temp4);
   myFile.close();// закрываем файл


  row_excel++; // номер строки + 1
  Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
  Serial.print(temp1);
  Serial.print(",");
  Serial.print(temp2);
     Serial.print(",");
   Serial.print(temp3);
  Serial.print(",");
  Serial.print(temp4);
 
  Serial.print(",");
  Serial.println(row_excel);

  // если строк больше 50, то начинаем заполнять строки по новой
  if (row_excel > 50){
    row_excel = 0;
    Serial.println("ROW,SET,2");
  }
  delay(1000); // задержка

}

Чуть чуть отколхозил  скетч ,  теперь можно сохранять данные в Экселе.  Время задержки одна сек. просто для отладки и просмотра, а так как каждый выбирает свою судьбу и время сам. Спасибо уважаемый Админ.Жму руку!!!

39

Re: Измерение температуры (18B20) с записью данных на MicroSD

Попробуйте сделать так:

File myFile;

void loop(){

myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
   myFile.print(nomer);// запись
   myFile.print(" ");// запись

   myFile.print(time.Hours/10);myFile.print(time.Hours%10);myFile.print("-");
   myFile.print(time.minutes/10);myFile.print(time.minutes%10);myFile.print("-");
   myFile.print(time.seconds/10);myFile.print(time.seconds%10);

   myFile.print("A1  = ");myFile.println(tA1);
   myFile.print(" A2= ");myFile.println(tA2);
   myFile.print("A3 = ");myFile.println(tA3);
   myFile.print(" A4= ");myFile.println(tA4);
   myFile.close();// закрываем файл
//////////////////////////////////////////////////////

myFile = SD.open("temp1.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
   myFile.print(nomer);// запись
   myFile.print(" ");// запись

   myFile.print(time.Hours/10);myFile.print(time.Hours%10);myFile.print("-");
   myFile.print(time.minutes/10);myFile.print(time.minutes%10);myFile.print("-");
   myFile.print(time.seconds/10);myFile.print(time.seconds%10);

   myFile.print("B1  = ");myFile.println(tB1);
   myFile.print(" B2= ");myFile.println(tB2);
   myFile.print("B3 = ");myFile.println(tB3);
   myFile.print(" B4= ");myFile.println(tB4);
   myFile.close();// закрываем файл

}

40 (2025-04-07 13:27:16 отредактировано MORO-1986)

Re: Измерение температуры (18B20) с записью данных на MicroSD

liman324 пишет:

Это уже предусмотрено в скетче.

Доброго дня, уважаемый Liman.
Пытаюсь на основе вашего скетча сделать измеритель температуры и влажности на девяти датчиках DHT22, каждый из которых подключен на отдельный вход на Mega2560.
Но поскольку я профан в области программирован, то не очень-то у меня и получается.
Взял за основу рабочий скетч для 9-ти датчиков. И попробовал скрестить с вашим.
Не могли-бы вы, пожалуйста, помочь допилить его...

#include <DHT.h>
#include <DHT_U.h>
#include <SD.h>
#include <DS3231.h>
// Подключение
// CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
// DS3231 SDA A4, SCL A5, VCC +5V
DS3231 clock;
RTCDateTime DateTime;

File myFile;
float h1,t1,h2,t2,h3,t3,h4,t4,h5,t5,h6,t6,h7,t7,h8,t8,h9,t9

#define DHTTYPE DHT11
DHT dht1 (1, DHTTYPE);
DHT dht2 (2, DHTTYPE);
DHT dht3 (3, DHTTYPE);
DHT dht4 (4, DHTTYPE);
DHT dht5 (5, DHTTYPE);
DHT dht6 (6, DHTTYPE);
DHT dht7 (7, DHTTYPE);
DHT dht8 (8, DHTTYPE);
DHT dht9 (9, DHTTYPE);

#define DHTPIN 1
#define DHTPIN 2
#define DHTPIN 3
#define DHTPIN 4
#define DHTPIN 5
#define DHTPIN 6
#define DHTPIN 7
#define DHTPIN 8
#define DHTPIN 9

void setup() {
Serial.begin(9600);
Serial.print(«Initializing SD card…»);
if (!SD.begin(4)) {Serial.println(» Error!!!»);}
else{Serial.println(» OK»);}// проверка подключения
dht1.begin();
dht2.begin();
dht3.begin();
dht4.begin();
dht5.begin();
dht6.begin();
dht7.begin();
dht8.begin();
dht9.begin();

clock.begin();
// clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно

}

void loop() {
DateTime = clock.getDateTime();
Serial.print(clock.dateFormat(«d-m-Y H:i:s», DateTime));

float h1 = dht1.readHumidity();
float t1 = dht1.readTemperature();
Serial.print(«H1: «);
Serial.print(h1);
Serial.print(» %\t»);
Serial.print(«T1: «);
Serial.print(t1);
Serial.print(» *C «);
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
Serial.print(«H2: «);
Serial.print(h2);
Serial.print(» %\t»);
Serial.print(«T2: «);
Serial.print(t2);
Serial.println(» *C»);
float h3 = dht3.readHumidity();
float t3 = dht3.readTemperature();
Serial.print(«H3: «);
Serial.print(h3);
Serial.print(» %\t»);
Serial.print(«T3: «);
Serial.print(t3);
Serial.print(» *C «);
float h4 = dht4.readHumidity();
float t4 = dht4.readTemperature();
Serial.print(«H4: «);
Serial.print(h4);
Serial.print(» %\t»);
Serial.print(«T4: «);
Serial.print(t4);
Serial.print(» *C «);
float h5 = dht5.readHumidity();
float t5 = dht5.readTemperature();
Serial.print(«H5: «);
Serial.print(h5);
Serial.print(» %\t»);
Serial.print(«T5: «);
Serial.print(t5);
Serial.print(» *C «);
float h6 = dht6.readHumidity();
float t6 = dht6.readTemperature();
Serial.print(«H6: «);
Serial.print(h6);
Serial.print(» %\t»);
Serial.print(«T6: «);
Serial.print(t6);
Serial.print(» *C «);
float h7 = dht7.readHumidity();
float t7 = dht7.readTemperature();
Serial.print(«H7: «);
Serial.print(h7);
Serial.print(» %\t»);
Serial.print(«T7: «);
Serial.print(t7);
Serial.print(» *C «);
float h8 = dht8.readHumidity();
float t8 = dht8.readTemperature();
Serial.print(«H8: «);
Serial.print(h8);
Serial.print(» %\t»);
Serial.print(«T8: «);
Serial.print(t8);
Serial.print(» *C «);
float h9 = dht9.readHumidity();
float t9 = dht9.readTemperature();
Serial.print(«H9: «);
Serial.print(h9);
Serial.print(» %\t»);
Serial.print(«T9: «);
Serial.print(t9);
Serial.print(» *C «);
delay (1000);
}

//////////////////////// запись SD /////////////////////////////////////
if(millis()-time>10000){
myFile = SD.open(«temp.txt», FILE_WRITE);// открываем файл для записи, если файла нет, то создаем его
myFile.print(clock.dateFormat(«d-m-Y H:i:s», DateTime));// запись
myFile.print(» t1 = «);// запись
myFile.print(temp1);// запись

myFile.print(» t2 = «);// запись
myFile.print(temp2);// запись

myFile.close();// закрываем файл
time=millis();
}