Автор Тема: Удаленный выключатель (Умный сервер)  (Прочитано 5026 раз)

Оффлайн Salomatin

  • Модератор
  • *****
  • Сообщений: 981
    • Пошаговые инструкции
    • Email
Удаленный выключатель (Умный сервер)

В развитии темы Включать большую красную лампочку рассмотрим пример выключения нагрузки 220 вольт при помощи  ALT Linux сервера.

На практике удалось применить и опробовать в торговом центре:
Освещение стоянки на светодиодных светильниках. Сервер включает вечером, выключает утром. А после закрытия фонари начинают по разному всю ночь мигать. Минимальные затраты и заметный эффект для окружающих. Смотрится неплохо, особенно было на Новогодние праздники.
В рекламных целях работает и до сих пор. С учетом темы  Тщеславный вопрос можно смотреть через сайт камеры, о которых думаю написать следующую тему Умный сервер.
Короче Удаленный выключатель управляет не только парковкой. Ночью можно удаленно включить любую группу светильников внутри Центра. А через сайт камеры детально рассмотреть что происходит внутри. Качество идеальное. Таким образом осуществлять виртуальный обход. 

Также как в примере Звуковой сервер предлагается полностью исключить человеческий фактор в  управлении освещением любого помещения или стоянки. Все может делать ALT Linux сервер.

Лабораторная работа № 1: Маячок

Видеоролик можно скачать по адресу:
https://youtu.be/8nVqwv6815Y

Нам понадобится:
Iskra Neo (аналог Arduino)

Для выполнения лабораторной работы паять ничего не обязательно. На arduino уже есть сигнальный светодиод № 13, которым мы научимся управлять при помощи ALT Linux сервера.

Шаг № 1
Опробовать можно на базе Virtualbox, но там могут быть проблемы с пробросом USB порта. А так берем обыкновенный системный блок. Устанавливаем ALT Linux 7.0 Server.
Ставим
[root@server ~]#apt-get update
[root@server ~]#apt-get install arduino java-1.6.0-sun

Шаг № 2

От имени обыкновенного пользователя заходим в графику
[vova@server ~]$ startxДальше: Start - Терминалы - XTerm даем команду
[vova@server ~]$arduinoОткрывается графический интерфейс arduino

Шаг № 3
Через USB подключаем модуль Iskra Neo. Светодиод должен загореться.
Заходим 
Файл - Сервис - Плата - Arduino Leonardo
Файл - Сервис - Последовательный порт - /dev/ttyACMO
Файл - Примеры - Basics - Blink - Загрузить
Светодиод на плате начинает мигать.
Если с первого раза не получилось, проверяем кабель, отсоединяем его и снова подключаем, повторяем Шаг № 3  с самого начала.

Изменяем скетч на

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
}
Загружем. Светодиод мигает в 10 раз быстрее.
Сохраняем скетч под именем lab1. У нас  в "Папка со скетчами" появился пример lab1, и файл /home/vova/sketchbook/lab1/lab.ino

Шаг № 4
Собираем схемку
Эксперимент 1. Маячок
Проверяем работу.
Хочешь понять сам, объясни другому.
"Если уже все испробовал и ничего не помогает - почитай инструкцию"

Оффлайн Salomatin

  • Модератор
  • *****
  • Сообщений: 981
    • Пошаговые инструкции
    • Email
Лабораторная работа № 2: Включаем, выключаем, опрашиваем.
Видеоролик можно скачать по адресу:
https://youtu.be/9sh2H_89WLI

Шаг № 1
Записываем скетч

int ledPin13 = 13;
int incomingByte;     
void setup() {
  Serial.begin(115200);
  pinMode(ledPin13, OUTPUT);
}
void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if (incomingByte == 'Q') {
      digitalWrite(13, HIGH);
    }
    if (incomingByte == 'q') {
      digitalWrite(13, LOW);
    }
    if (incomingByte == 'a') {
      int val;
  val = digitalRead(13); 
 Serial.print(val);Serial.print(val);
Serial.print("qqq");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("qqq");
Serial.println();
    }
  }
}
 
Загружаем. Светодиод мигать перестал.

Шаг № 2
Управление через монитор порта
arduino снабжен собственным монитором порта.
Открываем интерфейс и справа в верхнем углу находим Монитор порта.
Посылаем символ Q ,светодиод загорается
Посылаем символ q , светодиод гаснет
Посылаем символ a , получаем сообщение
00qqq
00qqq
00 это означает светодиод погас, qqq - принадлежность к 13 пину.
Посылаем символ Q ,светодиод загорается
Посылаем символ a , получаем сообщение
11qqq
11qqq
11 это означает светодиод горит, qqq - принадлежность к 13 пину.

Эти символы взяты произвольно. Можете предложить более изящное решение. В таком сочетании чтобы вывод записывать в текстовый файл и можно было отфильтровать командой grep при выполнении скриптов.

Таким образом мы включаем, выключаем, получаем информацию о состоянии.

Шаг № 3
Видеоролик можно скачать по адресу:
 https://youtu.be/nJLAm87K5wY

Управляем командами
Перегружаем сервер. После графического интерфейса arduino, команды выполняются, а вот опрашивать не получилось. Пришлось перегрузиться. Поэтому два видеоролика.
Открываем терминал. 
Посылаем символ Q
[vova@server ~]$echo Q > /dev/ttyACM0Светодиод загорается
Посылаем символ q
[vova@server ~]$echo q > /dev/ttyACM0Светодиод гаснет


Iskra Neo в командной строке работает сразу, поэтому и выбрано для лабораторной работы.
Другие изделия arduino могут ругаться и не выполнять команду
Для этого подгружаем:
picocom - Пикоком есть крошечная терминалка
[root@server ~]#apt-get install picocomзатем уже простым пользователем
[vova@server ~]$nohup picocom /dev/ttyACM0 -b 115200 -l
и все будет работать
В одном терминале открываем
[vova@server ~]$cat /dev/ttyACM0В другом терминале посылаем символ a
[vova@server ~]$echo a > /dev/ttyACM0в первом терминале видим
00qqq
00qqq
« Последнее редактирование: 25.03.2016 05:18:35 от Salomatin »
Хочешь понять сам, объясни другому.
"Если уже все испробовал и ничего не помогает - почитай инструкцию"

Оффлайн Salomatin

  • Модератор
  • *****
  • Сообщений: 981
    • Пошаговые инструкции
    • Email
Лабораторная работа № 3: Управляем десятью каналами через монитор порта.
Видеоролик можно скачать по адресу:
https://youtu.be/U5kFvxeByYQ

Шаг № 1
Записываем скетч

int ledPin13 = 13;
int ledPin12 = 12;
int ledPin11 = 11;
int ledPin10 = 10;
int ledPin9 = 9;
int ledPin8 = 8;
int ledPin7 = 7;
int ledPin6 = 6;
int ledPin5 = 5;
int ledPin4 = 4;
int ledPin3 = 3;
int ledPin2 = 2;


// the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(115200);
  // initialize the LED pin as an output:
  //pinMode(ledPin, OUTPUT);
  pinMode(ledPin13, OUTPUT);
  pinMode(ledPin12, OUTPUT);
  pinMode(ledPin11, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin2, OUTPUT);
 
 
}

void loop() {
 
  if (Serial.available() > 0) {
   
    incomingByte = Serial.read();
   
    int iii;
   
    iii = 2;
           
    if (incomingByte == 'Q') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'q') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'a') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("qqq");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("qqq");
Serial.println();
    }
   
   
     
   
    iii = 3;
           
    if (incomingByte == 'W') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'w') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 's') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("www");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("www");
Serial.println();
    }
   
     
     
     iii = 4;
           
    if (incomingByte == 'E') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'e') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'd') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("eee");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("eee");
Serial.println();
    }
   
       
       
       iii = 5;
           
    if (incomingByte == 'R') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'r') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'd') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("rrr");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("rrr");
Serial.println();
    }
   
     
   iii = 6;
           
    if (incomingByte == 'T') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 't') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'g') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("ttt");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("ttt");
Serial.println();
    }
   
   iii = 7;
           
    if (incomingByte == 'Y') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'y') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'h') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("yyy");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("yyy");
Serial.println();
    } 
   
   
    iii = 8;
           
    if (incomingByte == 'U') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'u') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'j') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("uuu");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("uuu");
Serial.println();
    } 
   
iii = 9;
           
    if (incomingByte == 'I') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'i') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'k') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("iii");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("iii");
Serial.println();
    } 
     
       
       iii = 10;
           
    if (incomingByte == 'O') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'o') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'l') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("ooo");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("ooo");
Serial.println();
    } 
     
     iii = 11;
           
    if (incomingByte == 'P') {
      digitalWrite(iii, HIGH);
    }
    if (incomingByte == 'p') {
      digitalWrite(iii, LOW);
    }
   
       
    if (incomingByte == 'L') {
      int val;
  val = digitalRead(iii); 
 Serial.print(val);Serial.print(val);
Serial.print("ppp");
Serial.println();
Serial.print(val);Serial.print(val);
Serial.print("ppp");
Serial.println();
    } 
       
   
  }


Шаг № 2

Открываем монитор порта и последовательно посылаем:
Включаем
Q W E R T Y U I O P
опрашиваем
a s d f g h j k l L
выключаем
q w e r t y u i o p
опрашиваем
a s d f g h j k l L
Хочешь понять сам, объясни другому.
"Если уже все испробовал и ничего не помогает - почитай инструкцию"

Оффлайн Salomatin

  • Модератор
  • *****
  • Сообщений: 981
    • Пошаговые инструкции
    • Email
Лабораторная работа № 4: Управляет Сервер.

Видеоролик можно скачать по адресу:
https://youtu.be/8p_YxaUzfQk

Шаг № 1
Создаем скрипт
[vova@server ~]$mcedit /home/vova/scr
#!/bin/bash
#Включаем
echo Q > /dev/ttyACM0
sleep 1
echo W > /dev/ttyACM0
sleep 1
echo E > /dev/ttyACM0
sleep 1
echo R > /dev/ttyACM0
sleep 1
echo T > /dev/ttyACM0
sleep 1
echo Y > /dev/ttyACM0
sleep 1
echo U > /dev/ttyACM0
sleep 1
echo I > /dev/ttyACM0
sleep 1
echo O > /dev/ttyACM0
sleep 1
echo P > /dev/ttyACM0

sleep 2

#Выключаем
echo q > /dev/ttyACM0
sleep 1
echo w > /dev/ttyACM0
sleep 1
echo e > /dev/ttyACM0
sleep 1
echo r > /dev/ttyACM0
sleep 1
echo t > /dev/ttyACM0
sleep 1
echo y > /dev/ttyACM0
sleep 1
echo u > /dev/ttyACM0
sleep 1
echo i > /dev/ttyACM0
sleep 1
echo o > /dev/ttyACM0
sleep 1
echo p > /dev/ttyACM0

sleep 2

i=1;

while [ $i -le 10 ];
do
#Включаем
echo Q > /dev/ttyACM0
echo W > /dev/ttyACM0
echo E > /dev/ttyACM0
echo R > /dev/ttyACM0
echo T > /dev/ttyACM0
echo Y > /dev/ttyACM0
echo U > /dev/ttyACM0
echo I > /dev/ttyACM0
echo O > /dev/ttyACM0
echo P > /dev/ttyACM0

sleep 1

#Выключаем
echo q > /dev/ttyACM0
echo w > /dev/ttyACM0
echo e > /dev/ttyACM0
echo r > /dev/ttyACM0
echo t > /dev/ttyACM0
echo y > /dev/ttyACM0
echo u > /dev/ttyACM0
echo i > /dev/ttyACM0
echo o > /dev/ttyACM0
echo p > /dev/ttyACM0

i=$[$i+1];
done
делаем исполняемым
[vova@zvyk ~]$chmod uga+x /home/vova/scr
Шаг № 2
Запускаем скрипт
[vova@server ~]$/home/vova/scrи смотрим как теперь Сервер все делает за нас.
Последовательно включает и выключает. Мигает всеми вместе.
« Последнее редактирование: 26.03.2016 21:14:46 от Salomatin »
Хочешь понять сам, объясни другому.
"Если уже все испробовал и ничего не помогает - почитай инструкцию"

Оффлайн Salomatin

  • Модератор
  • *****
  • Сообщений: 981
    • Пошаговые инструкции
    • Email
Лабораторная работа № 5: Коммутируем большую нагрузку.

Для этого нам понадобятся исполнительные устройства.

Можно использовать Реле
Специальную плату расширения
либо
Твердотельное реле
Твердотельное реле на входе имеет светодиод, который надо также подключать через сопротивление.
Схема подключения показана в Эксперимент 1. Маячок

В видеоролике
https://youtu.be/Z3TT7wcmlEE
показано, как при помощи команд

[vova@server ~]$ echo Q > /dev/ttyACM0
[vova@server ~]$ echo q > /dev/ttyACM0
[vova@server ~]$ echo Q > /dev/ttyACM0
[vova@server ~]$ echo q > /dev/ttyACM0

Сервер может управлять нагрузкой через твердотельное реле.



Хочешь понять сам, объясни другому.
"Если уже все испробовал и ничего не помогает - почитай инструкцию"