Помогите поправить код.
- Войдите на сайт для отправки комментариев
Ср, 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 вставте вот это:
// Для отладки опроса кнопок 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"); // ----------------------------------------Если кнопки корректно опрашиваются, на дисплее будет соотв. надписи.
Спасибо. Попробую