Проблемы при разделении скетча на файлы.

Нет ответов
wenom86
Offline
Зарегистрирован: 04.11.2012

Здравствуйте. Вернулся в своему проекту спустя полгода. Проект мой был нацелен на написание некоторой погодной станции, с датчиками, пид-регуляторами и т.д. Все работало, когда он находился в 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)не отображаются на дисплее, но в сериале они видны.