Помогите поправить код.
- Войдите на сайт для отправки комментариев
Ср, 11/06/2014 - 00:28
#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; } }
Использую ардуино уно. Датчики отдельно все работают все ОК. Но решил сделать менюшку и встрял. ((( Меню отображается, но не переключаются. Если залить скетч отдельно менюшки все ОК . Помогите.
Идея - подключаться к погодной станции через браузер (работает), и через отдельную менюшку на дисплей выводить инфу
Не вдоваясь в детали Вашего кода.
Проверьте память. Думаю в этом проблема (в ее нехватке)
C памятью точно все ОК.
А в шильде с дисплеем точно вход А1 используется ?
Arduino uno v3. Порт A1(кнопки)
Видать у нас разные шильды, т.к. у распространенного в инете за кнопки отвечает именно А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 даже не "продублирован".
На ардуино нано на порту A1 все работает норм, а вот на uno нет. Тогда в чем может быть разница между к примеруA0? и остальными ??? Может есть, где почитать ?. Спасибо
Вас не затруднит сделать фотку Вашего шильда?
Я конечно сильно могу ошибаться, но может по воле судьбы нулевая нога шильда (А0) попадает в отверстие нано с А1 ? ))
И еще просьба, ради эксперемента, поменяйте в скетче (строка 186 в выше представленом коде) А1 на А0, или даже просто на цифру 0, залейте в UNO и проверте.
ОФФ. Вы уже спросили про дисплей в соседней ветке, там в примере на сайте тоже А0 нога опрашивается.
Это не шильд, а еще пока, что только макет - http://zelectro.com.ua/LCD_Keypad_Shield_DIY - делал по схеме сборку из снопок к одному пину. Шильд спаять это в реале.
ОК, тогда вместо А1 попробуйте прописать просто цифру 1 (в 186 строке). И для того, чтобы определиться - вообще кнопки опрашиваются конкретно в УНО, накидайте отладочных строк кода.
Между строками 195 и 196 вставте вот это:
Между строками 198 и 199 вставте вот это:
Между строками 203 и 204 вставте вот это:
Если кнопки корректно опрашиваются, на дисплее будет соотв. надписи.
Спасибо. Попробую