Помогите поправить код.

mkvmaks
Offline
Зарегистрирован: 07.07.2013
#include <SPI.h>
#include <String.h>
#include <Ethernet.h>
#include "dht.h"
#include "Wire.h"
#include "Adafruit_BMP085.h"
#include <DS1307.h>
#include <LiquidCrystal_I2C.h>


// ====================================================================================
// ========================Задаем данные сети========================================== 
byte mac[] = { 0xCA, 0xAF, 0x78, 0x1C, 0x13, 0x77 }; //mac - адрес ethernet shielda
byte ip[] = { 192, 168, 0, 107 };        // ip адрес ethernet shielda
byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
EthernetServer server(58798); //порт сервера
int ledPin = 4; // указываем что светодиод будет управляться через 4 Pin 
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //изначальный статус светодиода - выключен
// ====================================================================================
LiquidCrystal_I2C lcd(0x27,16,2); 

//#define DHTPIN A0    // пин для датчика DHT22
 const unsigned char OSS = 0;  // Oversampling Setting
// ====================================================================================
DHT sensor = DHT();
Adafruit_BMP085 bmp;

// ========================СТАРТУЕМ===================================================
// ========================Управляем св.диодом на 4-м пине============================

// Init the DS1307
DS1307 rtc(A2, A3);

//States for the menu.
int currentMenuItem = 0;
int lastState = 0;

void setup() {
   //Set the characters and column numbers.
   lcd.begin(16, 2);
   //Print default title.
   clearPrintTitle();
   
    // Set the clock to run-mode
  rtc.halt(false);
  
  // Setup LCD to 16x2 characters
  lcd.begin(16, 2);

  // The following lines can be commented out to use the values already stored in the DS1307
//  rtc.setDOW(TUESDAY);        // Set Day-of-Week to SUNDAY
//  rtc.setTime(23, 16, 0);     // Set the time to 12:00:00 (24hr format)
//  rtc.setDate(27, 5, 2014);   // Set the date to October 3th, 2010

  // Set SQW/Out rate to 1Hz, and enable SQW
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
  
  //запускаем Ethernet
  Ethernet.begin(mac, ip, subnet);
  //устанавливаем pin 4 на выход
  pinMode(ledPin, OUTPUT);
  
  
 
  //enable serial datada print
  Serial.begin(9600); 
      Serial.println("Port Test!"); // Тестовые строки для отображения в мониторе порта
      Serial.println("GO!");// Тестовые строки для отображения в мониторе порта
      
      sensor.attach(3); // подключаем датчик температуры  к 3 пину, барометр к A4, A5 и прочее
      bmp.begin(); 
      delay(1000);
       
       lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  
}


void loop() {
  //Call the main menu.
  mainMenu();
  
   // ========================ДАТЧИКИ==================================================
  sensor.update();
    float t = sensor.getTemperatureInt(); 
    float h = sensor.getHumidityInt();
    Serial.println(t);
    Serial.println(h);
    float tdpa = bmp.readTemperature();
    float Pa0 = (bmp.readPressure());
    float Pa = (bmp.readPressure()/133.33);// переводим в мм.рт.ст.
    float Pa2 = (bmp.readPressure()/3386.582);// переводим в дм.рт.ст.
    
    delay(2000);
	
	// =============Создаем клиентское соединение====================================
  EthernetClient client = server.available(); 
  if (client) {
    while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      //read char by char HTTP request
      if (readString.length() < 30) {
        //store characters to string
        readString.concat( c); }
        //output chars to serial port
        Serial.print( c);
        //if HTTP request has ended
        if (c == '\n') {
        //Проверяем включили ли светодиод?
        //Level=1 - включен
        //Level=0 - выключен
          if(readString.indexOf("Level=1") >=0) {
            //Включаем светодиод
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }else{
            //Выключаем светодиод
            digitalWrite(ledPin, LOW); // set the LED OFF
            LEDON = false; 
          }     
   // =============Формируем HTML-страницу=================================================
         client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head> ");
          client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
          client.println("<title> ::Arduino:: V1.1</title>");
          client.println("</head> ");
          client.println("<body");
          client.println("<hr />");
          client.println("<h1> ::Упр.Arduino:: </h1>");
          if (LEDON){
            client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить<input type=radio name=Level value=0>Выключить<input type=submit value=OK></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Вкл.");
          }else{
            client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить<input type=radio name=Level value=0 CHECKED>Выключить<input type=submit value=OK></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Выкл");
          } 
         //==============Вывод значений на web-страницу============================
              client.println("<hr />");//линия=====================================
            client.println("Tемпература = ");    //Температура с DHT 22
            client.println(t);
            client.println(" *C");
              client.println("<br> "); //перенос на след. строчку
            client.println("Влажность = ");    //Влажность с DHT 22
            client.println(h);
            client.println(" %\t");
              client.println("<br> "); //перенос на след. строчку 
              client.println("<hr />");//линия=====================================
            client.println("Давление = ");    //давление с BMP 085
           client.println(Pa);
            client.println(" mm.рт.ст.");
               client.println("<br> "); //перенос на след. строчку
            client.println("<hr />");  //линия=====================================
            client.println("Давление = ");    //давление с BMP 085
            client.println(Pa2);
            client.println(" in Hg");
               client.println("<br> "); //перенос на след. строчку
              client.println("<hr />");  //линия=====================================
            client.println("Tемпература внутреняя = ");//температура с BMP 085
       client.println(tdpa);
           client.println(" *C");
             client.println("<br> "); //перенос на след. строчку
              client.println("<hr />");  //линия=====================================
            //====================================================================         
           client.println("</body></html>");
            //очищаем строку для следующего считывания      
            //==============Останавливаем web-client===============================
            readString="";
            client.stop();
           //====================================================================
          }
        
    }
}}}

void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (A1);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);

  //Check analog values from LCD Keypad Shield
  if (x < 100) {
    //Right
  } else if (x < 170) {
   //Up
    state = 1;
  } else if (x < 290){
   //Down
    state = 2;
  } else if (x < 600){
    //Left
  } else if (x < 390){
    //Select
    state = 3;
  }

  //If we are out of bounds on the menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0; 
  }

   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          currentMenuItem = currentMenuItem - 1; 
          displayMenu(currentMenuItem);
      } else if (state == 2) {
         //If Down
          currentMenuItem = currentMenuItem + 1;  
          displayMenu(currentMenuItem);
      } else if (state == 3) {
         //If Selected
         selectMenu(currentMenuItem); 
      }
      //Save the last State to compare.
      lastState = state;
   } 
   //Small delay
  delay(5);
}

//Display Menu Option based on Index.
void displayMenu(int x) {
     switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("-> Data/Clock");
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("-> Temp./Davlenie");
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("-> Hud");
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("-> Full info");
        break;
    }
}

//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Menu");
  lcd.setCursor(0,1); 
}

//Show the selection on Screen.
void selectMenu(int x) {
   switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("-> Data/Clock");
		// Display time centered on the upper line
			lcd.setCursor(4, 0);
			lcd.print(rtc.getTimeStr());
  
  // Display abbreviated Day-of-Week in the lower left corner
			lcd.setCursor(0, 1);
			lcd.print(rtc.getDOWStr(FORMAT_SHORT));
  
  // Display date in the lower right corner
			lcd.setCursor(6, 1);
			lcd.print(rtc.getDateStr());

  // Wait one second before repeating :)
  delay (1000);
        //Call the function that belongs to Option 1
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("-> Temp./Davlenie");
		lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 2 строки
        lcd.print("C=");
        lcd.setCursor(2, 0); 
        lcd.print(bmp.readTemperature());
		
		  lcd.setCursor(0, 1); 
          lcd.print("Davlenie="); 
          lcd.print(bmp.readPressure()/133.33);  
        //Call the function that belongs to Option 2
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("-> Hud");
			lcd.setCursor(8, 0); 
			lcd.print("H="); 
			lcd.print(sensor.getHumidityInt());  
			lcd.setCursor(12, 0); 
			lcd.print("%"); 
        //Call the function that belongs to Option 3
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("-> Full info");
        //Call the function that belongs to Option 4
        break;
    }
}

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Использую ардуино уно. Датчики отдельно все работают все ОК. Но решил сделать менюшку и встрял. ((( Меню отображается, но не переключаются. Если залить скетч отдельно менюшки все ОК . Помогите. 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Идея - подключаться к погодной станции через браузер (работает), и через отдельную менюшку на дисплей выводить инфу

Looka
Offline
Зарегистрирован: 24.04.2012

Не вдоваясь в детали Вашего кода. 
 

Проверьте память.   Думаю в этом проблема (в ее нехватке)

mkvmaks
Offline
Зарегистрирован: 07.07.2013

C памятью точно все ОК. 

SuperXL
Offline
Зарегистрирован: 30.12.2011

А в шильде с дисплеем точно вход А1 используется ?

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Arduino uno v3. Порт A1(кнопки)

SuperXL
Offline
Зарегистрирован: 30.12.2011

Видать у нас разные шильды, т.к. у распространенного в инете за кнопки отвечает именно А0.

Вот например: http://www.ebay.com/itm/SainSmart-LCD-1602-Keypad-Shield-For-Arduino-Duemilanove-Due-UNO-Mega2560-R3-/121361208157?pt=LH_DefaultDomain_0&hash=item1c41b1135d

Как видите, вывод А0 даже не "продублирован".

mkvmaks
Offline
Зарегистрирован: 07.07.2013

На ардуино нано на порту A1 все работает норм, а вот на uno нет. Тогда в чем может быть разница между к примеруA0? и остальными ???  Может есть, где почитать ?. Спасибо

SuperXL
Offline
Зарегистрирован: 30.12.2011

Вас не затруднит сделать фотку Вашего шильда?

Я конечно сильно могу ошибаться, но может по воле судьбы нулевая нога шильда (А0) попадает в отверстие нано с А1 ? ))

И еще просьба, ради эксперемента, поменяйте в скетче (строка 186 в выше представленом коде) А1 на А0, или даже просто на цифру 0, залейте в UNO и проверте.

ОФФ. Вы уже спросили про дисплей в соседней ветке, там в примере на сайте тоже А0 нога опрашивается.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Это не шильд, а еще пока, что только макет  - http://zelectro.com.ua/LCD_Keypad_Shield_DIY - делал по схеме сборку из снопок к одному пину. Шильд спаять это в реале. 

SuperXL
Offline
Зарегистрирован: 30.12.2011

ОК, тогда вместо А1 попробуйте прописать просто цифру 1 (в 186 строке). И для того, чтобы определиться - вообще кнопки опрашиваются конкретно в УНО, накидайте отладочных строк кода.

Между строками 195 и 196 вставте вот это:

// Для отладки опроса кнопок
lcd.setCursor(0,0);
lcd.print("x= ");
lcd.print(x);
lcd.setCursor(1,1);
lcd.print("state 1 UP");
// ----------------------------------------

Между строками 198 и 199 вставте вот это:

// Для отладки опроса кнопок
lcd.setCursor(0,0);
lcd.print("x= ");
lcd.print(x);
lcd.setCursor(1,1);
lcd.print("state 2 DOWN");
// ----------------------------------------

Между строками 203 и 204 вставте вот это:

// Для отладки опроса кнопок
lcd.setCursor(0,0);
lcd.print("x= ");
lcd.print(x);
lcd.setCursor(1,1);
lcd.print("state 3 SELECT");
// ----------------------------------------

Если кнопки корректно опрашиваются, на дисплее будет соотв. надписи.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Спасибо. Попробую