Проблемы при разделении скетча на файлы.
- Войдите на сайт для отправки комментариев
Вс, 06/11/2016 - 19:05
Здравствуйте. Вернулся в своему проекту спустя полгода. Проект мой был нацелен на написание некоторой погодной станции, с датчиками, пид-регуляторами и т.д. Все работало, когда он находился в 1 большом файле. Сегодня начал разделять его тем способом, который знаю и применял ранее на других скетчах. Столкнулся с проблемой, что часть функций работает, а часть нет.
Это код главного файла:
//=================================================================================================
// НАЗВАНИЕ ПРОГРАММЫ: Погодная станция new
// ВЕРСИЯ ПРОГРАММЫ: v2.0
// ВЕРСИЯ ARDUINO IDE: 1.0.5 r2
//=================================================================================================
#include <OneWire.h> // ...
#include <Wire.h> // I2C
#include <LiquidCrystal.h> // LCD
#include <PID_v1.h> // библиотека PID
#include <EEPROM.h> // работа с eeprom, встроенным в ардуину.
#include <SD.h> // работа с SD картой для сбора данных
#include <DHT.h> // для датчика темп-влажности.
#include <DS3231.h>
#include <BMP085.h>
unsigned long IntervalReadPressureSensorBMP085 = 2000;
unsigned long IntervalReadSensorDHT = 2000;
unsigned long IntervalReadButton = 300;
unsigned long IntervalPrintSerial = 5000;
unsigned long ValueMillisPreviousReadSensorBMP085 = 0, ValueMillisPreviousReadButton = 0, ValueMillisPreviousReadSensorDHT = 0, ValueMillisPreviousPrintSerial = 0;
#define DHTPIN 2
////#define DHTPIN2 3 // 2-й датчик температуры-влажности подключен к 3 цифр.пину. (датчик в помещении 1)
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // 1-й датчик температуры-влажности подключен к 2 цифр.пину. (датчик на улице)
DHT dht(DHTPIN, DHTTYPE); // Инициируем 1-датчик, в данном случае DHT22.
////DHT dht2(DHTPIN2, DHTTYPE); // Инициируем 1-датчик
int t1,h1,t2,h2,v1,v2; // вводим переменные для значений температуры, влажности, давления.
BMP085 dps = BMP085(); //для датчика давления.
long Temperature = 0, Pressure = 0, Altitude = 0;
Sd2Card card; // отображает переменные для SD карты, используя сервисные функции библиотеки SD:
SdVolume volume;
SdFile root;
const int chipSelect = 53; // подключение зависит от используемого модуля sd и ардуины: при использовании Arduino Mega 2560 подключение на 53 пин.
int ekran; //переменная для выбора экрана меню.
int m=0; //переменная для экранов меню.
File myFile; //???
long id; //???
int i=0; //переменная для мигания на экране изменяемых величин.
int b=0; //переменая для аналоговой клавиатуры.
int analogPin=2; //пин А2 для аналоговой клавиатуры.
// LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // для УНО. пины подключения к экрану 1602 или 2004 (A=5v/K=GND)(VSS+VO=GND/VDD=5v/RS=pin12/RW=pin11/E=pin10/D4=pin5/D5=pin4/D6=pin3/D7=pin2).
LiquidCrystal lcd(22, 28, 23, 24, 25, 26, 27); // для МЕГИ 2560. (A=5v/K=GND)(VSS=GND/VDD=5v/RS=pin22/RW=pin28/E=pin23/D4=pin24/D5=pin25/D6=pin26/D7=pin27).
DS3231 rtc(20, 21); //шина, на которую подключены часы (для ардуино нано на 328 чипе, это пины A4/A5)(для меги - пины 20/21).
void setup(){
Serial.begin(9600); // инициализация сериал-монитора, для вывода любой инф-ии в порт.
lcd.begin(20, 4); // инициализация экрана (20 символов в 4 строках).
dht.begin(); // инициализация датчика температуры-влажности.
rtc.begin(); // инициализация часов на DS3231.
Wire.begin();
dps.init();
read_sdcard(); // Передаем информацию о найденной SD-карте в сериал (вкладка Send_Serial)
privetstvie(); // Вывоим приветствие на экран при включении (название, версия и т.д.) (вкладка Read_LCD)
}
void loop(){
unsigned long currentMillis = millis(); //присваивание значения общей переменной отсчета времени.
if(currentMillis - ValueMillisPreviousReadSensorBMP085 > IntervalReadPressureSensorBMP085) //Если счетчик превысил интервал, то:
{ read_sensor_bmp085(); ValueMillisPreviousReadSensorBMP085 = currentMillis; } // выполняем считывание показаний датчика BMP085. (вкладка Read_Sensor).
if(currentMillis - ValueMillisPreviousReadSensorDHT > IntervalReadSensorDHT) //Если счетчик превысил интервал, то:
{ read_sensor_dht22(); ValueMillisPreviousReadSensorDHT = currentMillis; } // считываем температуру и влажность с датчиков DHT22.
if(currentMillis - ValueMillisPreviousPrintSerial > IntervalPrintSerial) //Если счетчик превысил интервал, то:
{ print_serial(); ValueMillisPreviousPrintSerial = currentMillis; } //........
ReadButton(); // Считываем нажатие клавиш на клавиатуре. (вкладка Read_Button)
NajatieUpDown(); // Обрабатываем нажатие клавиш Вверх/Вниз. (вкладка Read_Button)
Ekran(); // выбор № отображаемого экрана в зав-ти от переменной "m" (вкладка Read_LCD)
Read_ekran(); // Отображаем содержимое выбранного экрана (вкладка Read_LCD)
}
Это вкладка Read_Button
//=================================================================================================
// НАЧАЛО СЧИТЫВАНИЯ ЗНАЧЕНИЙ С КЛАВИАТУРЫ
void ReadButton()
{
int c;
c = analogRead(analogPin);
if (c>950) { b=0; } // ни одна клавиша не нажата.
else if (c>170 && c<200) { b=1; } // нажата кнопка 1 ВВЕРХ
else if (c<30) { b=2; } // нажата кнопка 2 ВПРАВО
else if (c>390 && c<420) { b=3; } // нажата кнопка 3 ВНИЗ
else if (c>300 && c<330) { b=4; } // нажата кнопка 4 ВЛЕВО
else if (c>465 && c<505) { b=5; } // нажата кнопка 5 ЦЕНТР
}
// КОНЕЦ СЧИТЫВАНИЯ ЗНАЧЕНИЙ С КЛАВИАТУРЫ
//=================================================================================================
//------------------------------------------------------------------------------------------------------------------------------
void NajatieUpDown()
{
//=================================================================================================
// НАЧАЛО ОБРАБОТКИ НАЖАТИЯ КЛАВИШ ВВЕРХ/ВНИЗ.
//Обработка нажатия NEXT (кнопка 3-вниз)
if (b==3)
{m++; //увеличиваем переменную уровня меню
delay (100);
lcd.clear();
if (m>2) {m=2;}} //если уровень больше 2, то оставаться на значении 2
//Обработка нажатия кнопки PREV (кнопка 1-вверх)
if (b==1)
{m--;
delay (100);
lcd.clear();
if (m<0) {m=0; }} //если уровень меньше 0, то оставаться на 0.
// КОНЕЦ ОБРАБОТКИ НАЖАТИЯ КЛАВИШ ВВЕРХ/ВНИЗ.
//=================================================================================================
}
//---------------------------------------------------------------------------------------------------------------------------------
Вкладка Read_LCD
void privetstvie()
{
// Вывод приветствия на экран при включении контроллера.
lcd.setCursor(0, 0);
lcd.print( " ---TEMPcontrol---" ); // ---TEMPcontrol---
// lcd.setCursor(0, 2); // *DATE: 08.08.1976*
// lcd.print("DATE: "); // *TIME: 22:08:54 *
// lcd.print(rtc.getDateStr());
// lcd.setCursor(0, 3);
// lcd.print("TIME: ");
// lcd.print(rtc.getTimeStr());
lcd.setCursor(16, 3);
lcd.print( "v2.0" );
delay (2000);
// Конец вывода приветствия+задержка.
}
//----------------------------------------------------------------------------------------------------------------------------
void Ekran()
{
//=================================================================================================
// НАЧАЛО ОБРАБОТКИ ВЫБОРА ОТОБРАЖАЕМОГО ЭКРАНА В ЗАВИСИМОСТИ ОТ ПЕРЕМЕННОЙ "m"
if (m==0){ ekran = 0; }
if (m==1){ ekran = 1; }
if (m==2){ ekran = 2; }
// КОНЕЦ ОБРАБОТКИ ВЫБОРА ОТОБРАЖАЕМОГО ЭКРАНА В ЗАВИСИМОСТИ ОТ ПЕРЕМЕННОЙ "m"
//=================================================================================================
}
//-----------------------------------------------------------------------------------------------------------------------------
void Read_ekran()
{
if (ekran==0) //переменная ekran=0 (+), главный экран.
{ //отображаем
lcd.setCursor(0, 0); lcd.print("Tul:"); lcd.print(t1, 0); lcd.print("C"); lcd.setCursor(9, 0); lcd.print("|Tp1:"); lcd.print(t2, 0); lcd.print("C");
lcd.setCursor(0, 1); lcd.print("Pul:"); lcd.print(h1, 0); lcd.print("%"); lcd.setCursor(9, 1); lcd.print("|Pp1:"); lcd.print(h2, 0); lcd.print("%");
lcd.setCursor(0, 2); lcd.print("Vul:"); lcd.print(v1, 0); lcd.print("mm"); lcd.setCursor(9, 2); lcd.print("|"); lcd.setCursor(12, 2); lcd.print(rtc.getTimeStr());
lcd.setCursor(9, 3); lcd.print("|"); lcd.setCursor(10, 3); lcd.print(rtc.getDateStr());
}
else if (ekran==1) //переменная ekran=1 (-), экран 1
{ //отображаем
lcd.setCursor(0, 0); //*******************
lcd.print("Tgar|Vgar|"); //*Tgar|Vgar| *
lcd.setCursor(0, 1); //*30C |99% | *
lcd.print(t1, 0); //*******************
}
else if (ekran==2) //переменная ekran=2 (-), экран 2
{ //отображаем
lcd.setCursor(0, 0); //*******************
lcd.print("Tgar|Vgar|"); //*Tgar|Vgar| *
lcd.setCursor(0, 1); //*30C |99% | *
lcd.print(t1, 0); //*******************
lcd.print("C");
lcd.setCursor(4, 1);
lcd.print("|");
lcd.print(t1, 0);
lcd.print("%");
lcd.setCursor(9, 1);
lcd.print("|");
}
}
Вкладка Read_sensor
void read_sensor_bmp085()
{
dps.getPressure(&Pressure);
dps.getAltitude(&Altitude);
dps.getTemperature(&Temperature);
}
//-----------------------------------------------------------------------------------------------------------------------------------
void read_sensor_dht22()
{
float h1 = dht.readHumidity(); //переменная h1 для датчика 1 температуры-влажности.
float t1 = dht.readTemperature(); //переменная t1 для датчика 1 температуры-влажности.
}
//-----------------------------------------------------------------------------------------------------------------------------------
Вкладка Read_Serial
void read_sdcard()
{
//=================================================================================================
// НАЧАЛО РАБОТЫ ОПРЕДЕЛЕНИЯ SD-карты и вывода информации о ней в сериал
Serial.print("\nInitializing SD card...");
pinMode(53, OUTPUT); // выберите пин53 для Меги, пин4 для Ethernet Shield, пин10 для лругих плат.
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is inserted?");
Serial.println("* Is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.print("\nCard type: ");
switch(card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// определение файловой системы FAT16 или FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
// вывод типа файловой системы
uint32_t volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster(); // количество блоков
volumesize *= volume.clusterCount(); //количество кластеров
volumesize *= 512; //обьем карты в мегабайтах.
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// вывод списка файлов на карте
root.ls(LS_R | LS_DATE | LS_SIZE);
// КОНЕЦ РАБОТЫ ОПРЕДЕЛЕНИЯ SD-карты и вывода информации о ней в сериал
//=================================================================================================
}
//-----------------------------------------------------------------------------------------------------------------------------
void print_serial()
{
Serial.print(" Alt(m):");
Serial.print(Altitude/100);
Serial.println();
Serial.print(" Pressure(mm Hg):");
Serial.print(Pressure/133.3);
Serial.print(" Temp:");
Serial.print(Temperature*0.1);
}
Единственная проблема во всем этом разделении в том, что данные с датчиков DHT22 (t1/h1)не отображаются на дисплее, но в сериале они видны.