Архив метки: arduino

Управление питанием при помощи Arduino. Часть третья.

В продолжение части 1 и части 2. выкладываю электрическую схему по подключению. Любезно предоставлено Фёдоровым Александром, далее текст и схемы — его.

Для осуществления развязки по питанию блока релле и основной платы Arduino, а также возможности прошивки через USB без включения внешнего питания рекомендуется подача рабочего питания +5V во внутреннюю линию 5V после преобразователя IC1 через внешний диод (чтобы при питании от USB питание не попадало на блок релле и внешний блок питания). Блок релле также желательно подключать через диод для предотвращения проникновения обратных бросков с блока релле в цепь питания Arduino, при этом перемычка питания блока релле должны быть снята. Небольшое занижение питания за счет диодного перехода до 4.5V не влияет на работу блоков Arduino т.к. сам CPU этих плат запитывается через преобразователь «3.3V» (IC6) имеющий низки параметр минимального падения напряжения около 0.28V, что позволяет запитывать плату даже от 3.7 V

 

 

 

 

Запитка обмоток блока релле непосредственно с контактов питания Arduino не рекомендуется, т.к. встроенные преобразователи напряжения слаботочные (ток не более 1А) и их с натяжкой хватает для запитки самих плат Arduino! Также в цепи штатного разъема под внешнее питание присутствует слаботочный защитный диод D1, который также не расчитан на большие токи!

Arduino+EthernetShield+реле управления питанием

Для решения задачи управления розетками было принято решение разработать сиё на основе Arduino.  Самый простой способ = самый надежный. Будем управлять по протоколу http. Для этого на ардулине придется «поднять» мини web сервер, который единственно на что способен : 1) принимать запрос и выполнять его 2) Отправлять в json формате информацию о статусе реле. Дополнительно в скетче использовалась библиотека TextFinder, для выделения параметров запроса GET.

Скетч:

#include <SPI.h>
#include <Ethernet.h>
#include <TextFinder.h>

//назначаем МАС и IP
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
EthernetServer server(80);
//на каких ногах переключатели
int pinscount=8;
int pins[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
int pins_status[]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};

int command = 0;
int setpin=0;
int setpinstatus=0;

void setup() {
  Serial.begin(9600);
   // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  for (int i=0; i < pinscount; i++){
    pinMode(pins[i], OUTPUT);    
  };  
}

void loop(){
 EthernetClient client = server.available();
 if (client)  {
  while (client.connected()) {
   if (client.available()) {
           TextFinder response(client);
           
           if(response.find("GET /")) {
         
             if (response.find("command=")) {
               command = response.getValue();
               Serial.println(command);
               }
           };
            
              if (command==1) {
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");                
                client.println("Connection: close");  
                client.println();
                client.print("<!DOCTYPE HTML>");                
                  //Выводим информацию об устройстве
                 client.print("{\"ip\":\"");
                 client.print(Ethernet.localIP());
                 client.print("\",\"pins\":[");
                 for (int i=0; i < pinscount; i++){
                    client.print(pins[i]);                   
                    if (i<pinscount-1){client.print(",");};
                 };
                 client.print("],\"pinsstatus\":[");
                 for (int i=0; i < pinscount; i++){
                    client.print(pins_status[i]);                   
                    if (i<pinscount-1){client.print(",");};
                 };                 
                 client.print("]}\n");                 
              };
              if (command==99){
                  client.println("HTTP/1.1 200 OK");
                  client.println("Content-Type: text/html");                                
                  client.println("Connection: close");
                  client.println();
                  client.print("<!DOCTYPE HTML>");                  
                 if (response.find("setpin=")) {
                   setpin = response.getValue();
                   Serial.println(setpin);
                   }                
                 if (response.find("setpinstatus=")) {
                   setpinstatus = response.getValue();
                   Serial.println(setpinstatus);
                   }                
                   
                 digitalWrite(pins[setpin], setpinstatus);
                 pins_status[setpin]=setpinstatus;
                 client.print("{\"status\":\"ok\"}\n");
                 
              };

         client.stop();   
   }
  }
  
    delay(1);    
    client.stop();
    Serial.println("client disonnected");  
  
 }
}

Пример запроса на получение статуса розеток:

http://192.168.1.177/?command=1

Пример запроса на переключение реле:

http://192.168.1.177/?command=99&setpin=3&setpinstatus=1

Таким образом, т.к. на выходе JSOIN, легко нарисовать «Веб морду».

 

Прогноз погоды на arduino.

Продолжаю героически пилить «Умный дом». На текущий момент сделано:  вывод времени, даты, дня недели, погоды на сегодня и завтра, текущей температуры, включение/выключение дисплея по датчику движения.

Не удалось: подружить плату точного времени ds3231 работающую по шине i2C и Ethernet плату ENC28J60 работающую по шине SPI, Пошел какой-то конфликт между платами, разобраться как разрулить не смог. Пришлось время тоже брать с интернета.

11.09.15 - 1Ниже приведен скетч на текущий момент. Читать далее Прогноз погоды на arduino.

Arduino Mega и шина SPI

Теоретически шина SPI на Arduino  позволяет подключать к ней одновременно несколько устройств. Причем активным устройством на текущий момент, для работы скетча будет считаться то устройство, у которого низкий уровень сигнала на пине Cabel Select.

Например, подключаем два устройства к ардуине :  SD картридер и сетевой интерфейс на микросхеме enc28j60, по следующей схеме:

Arduino Mega enc28j60 SD
49 (SS, nCS, CS, CSB, CSN, nSS, STE) CS
50 (SCLK, SCK, CLK) SO SPI_CLK
51 (MOSI, SDI, DI, SI) SI SPI_MOSI
52 (MISO, SDO, DO, SO) SCK SPI_MISO
53 (SS, nCS, CS, CSB, CSN, nSS, STE) SD_CS
GND GND GND
5V VCC 5V

Или может быть понятнее рисунок:

 

 

схема подключения по шине spi двух устройств: enc28j60 и sd реадер
схема подключения по шине spi двух устройств: enc28j60 и sd реадер

Т.е. как мы видим, часть пинов используется совместно, но пины 49 и 53 выделены для управления, для того чтобы скетч и «железка» знали, какое именно устройство в данный момент может передавать данные по общим пинам. Если на управляющем пине низкий уровень напряжения, то скетч и железка считает, что может передавать данные именно та железка, которая подведена к данному пину. Например по моей схеме: если на 49 пине низкий уровень, а на 53 высокий, то работает сетевая карта. И наоборот.

На деле как оказалось конечному пользователю не нужно заморачиватся выставлением уровней на управляющих пинах…если конечно драйвера железок написаны правильно…

Например мой скетч по работе одновременно и с SD и с сетевой картой заработал с полпинка..

Пример скетча: Читать далее Arduino Mega и шина SPI