Статьи

Arduino и Ruby: создание уведомителя Gmail

В этой статье мы создадим полную систему, которая позволит вам мигать светодиодом, когда вы получаете электронную почту или массу других подобных событий.

Чтобы запустить светодиод, мы будем использовать невероятно популярную платформу Arduino , а для получения данных из Gmail мы будем использовать всемогущий Ruby вместе с компьютером.

Давайте погрузимся прямо в!

Arduino

Прежде всего, если вы не знакомы с ними уже, Arduinos, возможно, самые крутые вещи со времен нарезанного хлеба (или были, пока Raspberry Pi не был выпущен).

Проверьте эту картину:

ArduinoDiecimilaComponents

На той плате, которую вы видите, есть что-то вроде «маленького компьютера». Но этот тип компьютера не настолько мощный, чтобы запускать что-то столь же огромное, как Linux – основная цель этого «компьютера» – управлять такими вещами, как светодиоды, двигатели, датчики и т. Д. Ну и какой в ​​этом смысл? Волшебство в том, что вы можете запрограммировать этот маленький компьютер для управления его ресурсами определенным образом. Это означает, что мы собираемся (как-то) запрограммировать его на мигание светодиода при получении нового письма.

Как же ты это программируешь? Итак, вы подключаете его к компьютеру и используете среду Arduino (которая основана на обработке), которая позволяет вам писать код для него.

Во-вторых, он управляет светодиодами, включая и отключая его «контакты». Если вы когда-либо видели «интегральную схему» или «микросхему», вы знаете, как они выглядят.

Arduino также может обмениваться данными через USB, поэтому ваш код на Arduino может отправлять сообщения назад и вперед с компьютера.

Это общая концепция. Проблема в том, что сам Arduino не может получить доступ к Интернету (да, да, я знаю, что есть экраны Ethernet, но они не являются частью Arduino). В результате мы должны каким-то образом передавать ему данные, которые мы должны получить от Gmail (или любой другой адрес электронной почты вы используете), чтобы он включил светодиод. Вот тут и появляется Ruby.

Рубин

Как мы все согласимся, Ruby – фантастический и невероятно универсальный язык. Но управлять светодиодом с его помощью очень сложно (особенно через USB, который является довольно высокоуровневым протоколом), поэтому здесь мы используем Arduino.

Мы будем использовать Ruby, чтобы сделать две вещи. Сначала получите данные из Gmail, включая количество непрочитанных писем. Во-вторых, передайте эту информацию как «мигать» или «не мигать» Arduino.

Руби нас охватила на обоих этих направлениях. Драгоценный камень «gmail» позволяет легко получить доступ к API Gmail, а гем «serialport» позволяет нам общаться с Arduino через USB. Теперь давайте погрузимся в код!

Arduino код

Код Arduino основан на обработке . Этот язык очень похож на Java, и если у вас есть опыт работы с «языками фигурных скобок», вы должны быстро его освоить. На самом деле, если вы знаете какой-либо язык программирования, обработка должна быть простой в изучении.

Вот минимальная программа Arduino:

void setup() { } void loop() { } 

Это довольно ясно. Есть два метода / процедуры, loop и setup . setup вызывается (обычно) только один раз, а loop вызывается повторно (до тех пор, пока Arduino получает питание). Очевидно, этот код ничего не делает. Давайте сделаем невероятно простой пример со светодиодом:

 void setup() { pinMode(11, OUTPUT); } void loop() { digitalWrite(11, HIGH); delay(500); digitalWrite(11, LOW); delay(500); } 

Чтобы это было успешным, вам нужно подключить светодиод с Arduino на выводе 11, с катодом (положительная сторона) на выводе 11 и анодом (отрицательная сторона) на земле.

Этот код предназначен для того, чтобы дать нам простой мигающий светодиод – он вызывает несколько функций, которые нам предоставляет среда Arduino ( pinMode , digitalWrite ) для достижения этой цели.

В частности, вызов pinMode сообщает Arduino, что мы хотим, чтобы вывод 11 был выходным, а не входным (обычно используется для датчиков и т. Д.). Затем в методе loop мы вызываем digitalWrite для включения и выключения светодиода, устанавливая вывод на высокий и низкий уровень (около 5 В и около 0 В).

Но для того, чтобы наш общий проект (который опять-таки заключался в создании уведомителя GMail) работал, нам нужно общаться с компьютером. Мы делаем это с помощью Serial:

 void setup() { Serial.begin(9600); } void loop() { Serial.println("RubySource"); } 

Serial.begin строка может быть Serial.begin . По сути, он устанавливает так называемую «скорость передачи данных» на 9600 – это означает, что на самом деле это не так уж и важно, вам просто нужно знать, что и компьютер, и Arduino должны согласовать скорость передачи данных. Этот код повторно отправляет строку «RubySourcen» на компьютер через USB. Как вы просматриваете эти сообщения? Если вы загружаете код в Arduino, вы можете щелкнуть значок «последовательный монитор» в правом верхнем углу среды Arduino, чтобы увидеть, как Arduino разговаривает с вами!

Хорошо, вы можете отправить материал по USB на Arduino. Как насчет получения?

 void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0) { byte byte_read = Serial.read(); Serial.print("Got: "); Serial.print((char)byte_read); Serial.print("n"); } } 

На этот раз мы используем функции Serial.available и Serial.read . Они оба довольно просты; первый возвращает положительное число, если байты доступны для чтения, последний читает один байт (или обычно символ) из потока, поступающего в Arduino.

Отлично, теперь мы можем читать данные с последовательного порта и мигать светодиодом. У нас есть детали, давайте приведем в действие весь код Arduino:

 void setup() { Serial.begin(1200); //Set pin 11 to be output pin (connect LED here) pinMode(11, OUTPUT); //set pin 11 to be high initially; LED is usually on, but, not blinking digitalWrite(11, HIGH); } //this procedure is called if we need to blink the LED void blink_led() { //we can't just blink it once, because that wouldn't be noticeable //so, we blink it three times for(int i = 0; i<10; i++) { digitalWrite(11, HIGH); delay(100); digitalWrite(11, LOW); delay(100); } //reset the LED back to just on, not blinking digitalWrite(11, HIGH); } //this function is called when we get a character //over USB/Serial void got_char(char x) { //if we get b over Serial if(x == 'b') { //... blink the LED blink_led(); } } void loop() { //check if there's any data available on serial if(Serial.available() > 0) { //if there is, we read it byte byte_read = Serial.read(); //and call "got_char" got_char((char)byte_read); } } 

Вот и мы! Код очень простой, с несколькими интересными заметками. Прежде всего я решил, что по умолчанию светодиод должен гореть. Это означает, что мы можем определить, есть ли в системе питание или нет (не говоря уже о том, что в Arduino уже есть индикатор питания – светодиоды выглядят круто!), Поэтому мы включаем его во время настройки.

Во-вторых, в blink_led() мы не можем просто мигнуть один раз, потому что никто этого не заметит. Таким образом, мы моргнем десять раз!

Функция этого кода заключается в том, что когда Arduino получает букву «b» над последовательным, он мигает светодиодом десять раз.

Потрясающие! Теперь перейдем к коду Ruby, который общается с Интернетом!

Рубиновый код

Когда я впервые начал составлять план проекта, я думал, что Ruby будет раздражающе сложным, потому что большинство API всегда так или иначе раздражают.

Но потом я понял, что у нас есть потрясающая жемчужина “Gmail”! Загрузите его немедленно:

 gem install gmail 

Нам также понадобится что-то, с помощью чего мы можем получить доступ и общаться через порт USB с Arduino. Для этого мы можем использовать гем «serialport»:

 gem install serialport 

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

 #This code sends a "b" over Serial every 4 seconds #That means that the LED connected to the Arduino #will blink every four seconds. require 'serialport' #this *will* be different for you #You need to find out what port your arduino is on #and also what the corresponding file is on /dev #You can do this by looking at the bottom right of the Arduino #environment which tells you what the path. #this must be same as the baud rate set on the Arduino #with Serial.begin baud_rate = 9600 data_bits = 8 stop_bits = 1 parity = SerialPort::NONE #create a SerialPort object using each of the bits of information port = SerialPort.new(port_file, baud_rate, data_bits, stop_bits, parity) wait_time = 4 #for an infinite amount of time loop do port.write "b" #wait a little bit before we send the next one sleep wait_time end 

Мы устанавливаем несколько переменных (таких как скорость передачи данных и так называемые «биты данных» и «стоп-биты»), а затем мы можем общаться с Arduino.

Самый важный момент, на который следует обратить внимание, это то, что переменная port_file будет отличаться для вас – вы должны проверить, что она использует в среде Arduino. Если вы посмотрите в нижний левый угол, вы можете заметить путь, который начинается с «/ dev /», скопировать этот путь в файл_порта и вы должны быть готовы к работе!

Как только мы это сделаем, работающий код должен мигать светодиодом каждые 4 секунды. Потрясающие!

Теперь давайте добавим гем gmail, чтобы посмотреть, как все это собралось вместе:

 require 'serialport' require 'gmail' #plug in your username and password here gmail = Gmail.connect("username", "password") #count the number of unread messages prev_unread = gmail.inbox.count(:unread) #this *will* be different for you #You need to find out what port your arduino is on #and also what the corresponding file is on /dev #You can do this by looking at the bottom right of the Arduino #environment which tells you what the path. port_file = '/dev/cu.uart' #this must be same as the baud rate set on the Arduino #with Serial.begin baud_rate = 9600 data_bits = 8 stop_bits = 1 parity = SerialPort::NONE #create a SerialPort object using each of the bits of information port = SerialPort.new(port_file, baud_rate, data_bits, stop_bits, parity) wait_time = 4 #for an infinite amount of time loop do #get the number of unread messages in the inbox unread = gmail.inbox.count(:unread) #lets us know that we've checked the unread messages puts "Checked unread." #check if the number of unread messages has increased #if so, we have a new email! So, blink the LED. if unread > prev_unread port.write "b" end #reset the number of unread emails prev_unread = unread #wait before we make another request to the Gmail servers sleep wait_time end 

Код не самый элегантный, но он выполняет свою работу и делает это четко (особенно в учебнике, я думаю, ясность важнее краткости).

Если вы запустите это и отправите себе электронное письмо, вы должны увидеть мигающий светодиод! Как это работает? Он продолжает проверять количество непрочитанных писем, а если оно увеличивается, мигает светодиод. Круто, верно?

Расширяя это

Мы завершили наш проект. Мы создали уведомитель GMail со светодиодом. Но это все, что мы можем сделать с нашим кодом?

Точно нет. Прежде всего, GMail не должен быть нашим единственным источником данных. Может быть, вы можете мигать светодиодом (и продолжать мигать), если завтра будет дождь. Или, может быть, когда у вас есть сообщение на Reddit. Или, если есть новая статья на RubySource (мне нравится эта). Код Arduino вообще не нужно менять, и большая часть кода Ruby также остается неизменной, потому что все, что мы меняем, – это данные и наше их толкование!

Есть много других направлений, куда вы можете пойти отсюда. Вы можете создать систему уведомлений с несколькими светодиодами и различными источниками данных, которая отвлекает вас даже больше, чем уже делают Reddit и Hacker News! С помощью этой статьи вы теперь можете связать Arduino с Ruby, а, следовательно, и интернет с объектами реального мира. Есть буквально несколько миллиардов вещей, которые вы можете сделать (не просто переключаясь между источниками данных, конечно), и вам определенно стоит попробовать больше из них!

Завершение

Надеюсь, вам понравилась эта статья об использовании Arduino с Ruby. Если вы действительно создали уведомитель по электронной почте, похлопайте себя по спине – это довольно крутая вещь для достижения! Если у вас есть другие идеи, комментарии и предложения, оставьте комментарий!

Твиты очень ценятся 🙂