Ардуино сервер
- Войдите на сайт для отправки комментариев
Это мой первый проект. Цель данного проекта - изучение основ конструирования и программирования контроллеров, а также знакомство с php и mysql.
Что может данная железка:
- Часы с датой
- Чтение сообщений отосланных пользователями с сайта.
- Чтение напоминаний в зависимости от даты.
- Погода, а также прогноз погоды на следующий день (с яндекса).
- Температура и влажность в помещении (передача показаний на сервер).
- Радио с ПДУ.
Используемые комплектующие
- MEGA 2560
- LCD20x4 (без поддержки кириллицы )
- Интернет плата ENC28J60
- DHT11
- TEA5767, TDA7056A, REM , динамик и т.п. с разборки
Данный проект имеет центральную консоль, к которой планируется подключать дополнительные датчики и устройства управления.
Работает все просто. Каждую минуту контроллер запрашивает “свою страничку” GET запросом, в который входит его индекс для авторизации и передается текущая температура и влажность, которые записываются в БД. На сервере проверяется, есть ли текущие напоминания или непрочитанные сообщения. Парсится погода с яндекса. Все полученные данные формируются в удобный формат для контроллера (с разделителями) и отправляются клиенту обратно. Контроллер принимает сообщение и по разделителям формирует вывод на lcd, если нет сообщений или напоминаний, то подмешивается текущая температура.
Если смс написана на русском, то она автоматически переводится транслитом и записывается в БД.
Каждый пользователь может создать напоминание (повторяющееся каждый год или однократное).
Если пришла смс или напоминание, то выводится информация об этом (количество смс, логин юзера первой в очереди на чтение) и загорается светодиод.
Если нажать на кнопку чтения смс, формируется внеочередной специальный GET запрос с чтением первой в очереди смс. В ответ сервер отсылает подготовленный текст и помечает смс (или напоминание) прочитанной .
Пользователь может посмотреть во вкладке home текущую температуру и влажность. В этой вкладке планируется продолжение проекта управления домом.
Также в устройстве есть радио с аналоговым усилителем. Управляется радио с ПДУ (регулировка громкости, переключение каналов, power, mute). Частота текущей станции подмешивается и выводится на lcd.
Без доступа к интернету устройство показывает только температуру и влажность, работает радио.
Основная нагрузка на обработку строк ложится на php, что уменьшает код программы МК.
#include "LiquidCrystal.h" #include "EtherCard.h" #include "DHT.h" #include "IRremote.h" #include "Wire.h" double fm_radio[]={99.6,100.0,100.4,100.9,101.4,101.8,103.0,104.3,105.5,107.4};//радио нашего региона String fm_radio_str[]={"99.60","100.0","100.4","100.9","101.4","101.8","103.0","104.3","105.5","107.4"};//масcив для вывода на lcd текущей радиостанции int fm_radio_n=0,fm_radio_max=9; byte vol=20;//громкость усилителя unsigned char frequencyH=0; unsigned char frequencyL=0; unsigned int frequencyB; double frequency=0; int h_dht11, t_dht11;//влажность, температура int dht_11=7;// пин подключения датчика температуры и влажности int vol_pin=8;//пин подключения регулировки громкости int RECV_PIN = 4;//пин подключения фотоприемника int ledpin=5,swpin=6;//пины подключения светодиода и кнопки int flag=0;//флаг определения режимов работы boolean radio_flag=0;//флаг определения работы радио boolean mute=0;//mute усилителя IRrecv irrecv(RECV_PIN); decode_results results; DHT dht(dht_11, DHT11); LiquidCrystal lcd(31, 30, 28, 26, 24, 22); static byte mymac[] = {0x70,0x69,0x69,0x2D,0x30,0x31 }; byte Ethernet::buffer[700]; static uint32_t timer; char website[] PROGMEM = "www.*****"; //функция приема текстовой строки сетевой карты static void my_callback (byte status, word off, word len) { Ethernet::buffer[off+300] = 0; Serial.print((const char*) Ethernet::buffer + off); lcd_print((const char*) Ethernet::buffer + off); } //функция записи в TEA5767 (радио) void fm_write(double frequency){ frequencyB=4*(frequency*1000000+225000)/32768; frequencyH=frequencyB>>8; frequencyL=frequencyB&0XFF; delay(100); Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xBC);//включить режим моно Wire.write(0x10); Wire.write(0x00); Wire.endTransmission(); delay(100); lcd.setCursor(0,3); String str_lcd=String(t_dht11)+"C "+String(h_dht11)+"% "; str_lcd=str_lcd+"Radio "+fm_radio_str[fm_radio_n]; lcd.print(str_lcd); } //Функция вывода на lcd void lcd_print(String str){ lcd.clear(); String str_lcd; int a,b; //Вывод времени, погоды и температуры if (flag==0){ a=str.indexOf("|"); a++; b=str.indexOf("Orel"); str_lcd=str.substring(a,b); lcd.setCursor(0,0); lcd.print(str_lcd); a=str.indexOf("Tomorrow"); lcd.setCursor(0,1); str_lcd=str.substring(b,a); lcd.print(str_lcd); lcd.setCursor(0,2); b=str.indexOf("|",a); if (b<0){ str_lcd=str.substring(a); lcd.print(str_lcd); lcd.setCursor(0,3); str_lcd=String(t_dht11)+"C "+String(h_dht11)+"% "; if (radio_flag==1) str_lcd=str_lcd+"Radio "+fm_radio_str[fm_radio_n]; lcd.print(str_lcd); digitalWrite(ledpin,LOW); return; } str_lcd=str.substring(a,b); lcd.print(str_lcd); b++; lcd.setCursor(0,3); str_lcd=str.substring(b); lcd.print(str_lcd); digitalWrite(ledpin,HIGH);//светодиодная индикация - пришла смс return; } //Вывод принятой смс if (flag==1){ digitalWrite(ledpin,LOW); //проверка пустого перезапроса, если нет смс, вывести время, погоду и температуру if (str.indexOf("Orel")>0){ flag=0; lcd_print(str); return; } a=str.indexOf("|"); a++; b=a+20; lcd.setCursor(0,0); str_lcd=str.substring(a,b); lcd.print(str_lcd); a=b+20; lcd.setCursor(0,1); str_lcd=str.substring(b,a); lcd.print(str_lcd); b=a+20; lcd.setCursor(0,2); str_lcd=str.substring(a,b); lcd.print(str_lcd); a=b+20; lcd.setCursor(0,3); str_lcd=str.substring(b,a); lcd.print(str_lcd); timer = millis() + 20000;//время для прочтения смс } } void setup () { pinMode(vol_pin, OUTPUT); Wire.begin(); irrecv.enableIRIn(); pinMode(ledpin, OUTPUT); pinMode(swpin, INPUT); dht.begin(); Serial.begin(9600); lcd.begin(20,4); if (ether.begin(sizeof Ethernet::buffer, mymac,53) == 0) Serial.println( "Failed to access Ethernet controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("SRV: ", ether.hisip); } void loop () { //Обработка команд ПДУ if (irrecv.decode(&results)){ irrecv.resume(); } //power if (results.value==284111055){ if (radio_flag==0){ frequency=fm_radio[fm_radio_n]; fm_write(frequency); analogWrite(vol_pin,vol); radio_flag=1; } else { analogWrite(vol_pin,0);// mute усилителя Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xBC); Wire.write(0x50);//power off Wire.write(0x00); Wire.endTransmission(); delay(100); lcd.setCursor(0,3); String str_lcd=String(t_dht11)+"C "+String(h_dht11)+"% Radio off "; lcd.print(str_lcd); radio_flag=0; } results.value=0; } //ch+ if (results.value==284117175 && radio_flag==1){ fm_radio_n++; if (fm_radio_n>fm_radio_max) fm_radio_n=0; frequency=fm_radio[fm_radio_n]; fm_write(frequency); results.value=0; } //ch- if (results.value==284149815 && radio_flag==1){ fm_radio_n--; if (fm_radio_n<0) fm_radio_n=fm_radio_max; frequency=fm_radio[fm_radio_n]; fm_write(frequency); results.value=0; } //vol+ if (results.value==284100855 && radio_flag==1){ if (vol<70) vol=vol+5;//проверка max громкости else vol=70; analogWrite(vol_pin,vol); results.value=0; } //vol- if (results.value==284133495 && radio_flag==1){ if (vol>0) vol=vol-5; else vol=0; analogWrite(vol_pin,vol); results.value=0; } //mute if (results.value==284127375 && radio_flag==1){ if (mute==0){ analogWrite(vol_pin,0); mute=1; } else{ analogWrite(vol_pin,vol); mute=0; } results.value=0; } ether.packetLoop(ether.packetReceive()); //обработка нажатия кнопки чтения смс if (!digitalRead(swpin)){ delay (50); while (!digitalRead(swpin)) flag=1; ether.browseUrl(PSTR("/"), "*****?*****", website, my_callback); } //перезапрос страницы, и запись на сервер if (millis() > timer){ h_dht11 = dht.readHumidity();//влажност t_dht11 = dht.readTemperature();//температура timer = millis() + 60000; flag=0; String ard_get="*****?*****&t_home="; ard_get=ard_get+t_dht11+"&rh_home="+h_dht11; char buf[100]; ard_get.toCharArray(buf, 100); ether.browseUrl(PSTR("/"),buf , website, my_callback); } }
Ну вот! Ну кто так делает? Взял и ....
.....всё сделал! Всё! И что теперь с этим делать? Я так долго, так мучительно думал, ну как мне это все делать?! Это же надо столько узнать, изучить... а через год забыть... О-оо!
А он взял, прискакал на белом...эээ.... голубом вертолете. Все желания выполнил...
Но вот этот DHCP... Не могу взять в толк почему не статичный IP?
И ардуино больше ничем кроме этого не занимается? Или все еще впереди?
:) Спасибо. Искал пример для ИК управления.
По поводу DHCP даже не задумывался, в принципе у меня дома все приборы так работают, а если работает, то лучше не трогать. По поводу продолжения проекта это центральная консоль и скорее всего оно получит продолжение, а пока утром смотрю погоду и слушаю радио.
У меня Ардуино UNO стоит контроллером отопления. Имеется граф. дисплей 128х64. Пара DS18b20 наружняя и домашняя температура воздуха, часы DS1307. Контроллер работает автономно. Хочу заставить его писать на старую ММСку лог по температуре, пока безуспешно. Комплектная либа не понимает FAT, а ММСку невозможно отформатировать иначе.
gmv_tft, Вы когда будите на связи?
Проект получил небольшое продолжение.
К старым функциям добавилось:
Снял ролик работы устройства http://www.youtube.com/watch?v=BIcRCZdWJk4&feature=youtu.be
Здравствуйте! не могли бы вы мне помочь, у меня проблема, с часами ds1307 и экраном st 7920 я ни как не могу понять ка написать код часов чтобы они отображались корректно на данном экране и как сделать меню настройки для этих часов заранее спасибо!