Главная » 2017 » Июль » 19 » Ардуино пишет письма. часть 1 ( Arduino, Processing, Serial, E-mail)
16:18
Ардуино пишет письма. часть 1 ( Arduino, Processing, Serial, E-mail)

 Немного забегая вперед. Здесь описано создание конечного продукта. Несложного софта для Win, который выполняет возложенные на него обязанности. Статья расскажет о реализации проекта от начала и до конца, до компиляции в исполняемый файл. Рассмотрит некоторые трудности, и затронет некоторые сложности реализации проекта.  В данном проекте Ардуино используется в качестве сенсора, а компьютер принимает и анализирует данные.

Статья рассчитана на читателей знакомых, в какой-либо степени, с микроконтроллерами и программированием. Как следует из названия, речь пойдет о том как Ардуино может нас уведомлять о разных событиях по E-mail. Мы не будем использовать ни каких плат для сетевого расширения возможностей Ардуино. На самом деле Ардуино будет уведомлять наш компьютер, а он нас.

**Описанные в статье действия нацелены на достижение конкретного, известного результата. И разъяснены в объеме необходимом для достижения цели. Основные и ключевые моменты будут описаны подробно. Это касается стороны конечного пользователя: интерфейс, обработка исключений (системных ошибок). Остальное будет прокомментировано. Части кода требующие дополнительных знаний и/или углубленного изучения описываться не будут. 

**Желающие помочь с описанием этих частей, или в написании следующих, могут связаться со мной.
    Замечания, пожелания, предложения по сотрудничеству принимаются в комментариях, либо на нашу
    почту prototype3dn@gmail.ru. 

Уточнение после выхода альфы. После проявленного интереса к проекту и просьбе подробнее описывать происходящее, данный цикл может быть понятен и безусловно полезен начинающим.  
     
    Начнем с постановки задачи. По легенде, которую придумал я, нам нужно что бы каждый час по E-mail нас уведомляли о температуре воздуха в помещении. И сообщали немедленно, если определенный температурный порог превышен. Для даже несложных проектов, вроде нашего, лучше составлять краткий план наших будущих действий. Это поможет сосредоточиться на конкретной промежуточной задаче и пошагово прийти к решению основной.

    Сторона Ардуино:
    1. Подключение датчика к Ардуино.
    2. Получение данных с датчика.
    3. Передача данных на последовательный порт (Serial port).
    
    Сторона компьютера:
    1. Получение данных по последовательному порту.
    2. Создание окна приложения.
    3. Создание интерфейса приложения.
    4. Функция E-mail.
    5. Отладка приложения (обработка ошибок-исключений и прочее).  
      
    Для реализации поставленной задачи нам понадобятся следующее оборудование и компоненты:
        -- Ардуино UNO \ NANO и пр. (или многочисленные их клоны).
        -- Температурный датчик.
        -- Компьютер с выходом  в интернет.
        -- Телефон \ смартфон \ планшет \ др. компьютер с почтовым клиентом (это не обязательно,
            просто не интересно получать письмо на компьютер с которого его только что отправили.)
        -- Для монтажа и соединения можно использовать макетную  плату и провода. 
        -- Конечно же нам понадобятся два адреса электронной почты, отправитель и получатель.
            Мы используем почту от Google.

Для начала подключим датчик температуры к Ардуино. Датчики температуры, как собственно почти все датчики, бывают умными и не очень. Умные датчики предоставляют микроконтроллеру требуемую информацию в готовом виде. Будь то температура, расстояние, высота, влажность и т.д. А не очень умные датчики передают в микроконтроллер просто значение их собственного сопротивления. Которое меняется в зависимости от температуры, расстояния, высоты, влажности и прочего. И вместо понятных нам 36.6 градусов, 100 метров, 62 метра УМ (над уровнем моря), 55 % влажности. Мы получаем промежуточные значения от 0 до 1023. Например: 762, 358, 901, 612. И те, и другие датчики используются. И те, и другие выполняют свои функции. И те, и другие имеют свои плюсы и минусы. 

Примеры подключения цифровых (слева) и аналоговых (справа) датчиков.

 

Так как мы предполагаем что вы знакомы с Ардуино, не будем на этом подробно останавливаться, так как количество видов датчиков велико и описывать подключение какого-то одного - нет смысла. А описывать подключение всех - нет желания. Подключите имеющийся у вас датчик согласно документации. И загрузите скетч в Arduino IDE. Самое главное в скетче - чтобы в последовательный порт отправлялись только данные температуры, то-есть данные одной переменной.

...

Serial.println( [переменная температуры в градусах] );

...

И именно командой Serial.println, так как терминал компьютера будет ждать команды "перевод строки" (новая строка).

Не имеет значения как выглядит ваш скетч.


ТАК... Скетч считывает с аналогового датчика и передает по последовательному порту значение температуры по Цельсию °С. 

#include <math.h>;
float volt;

void setup() {
  Serial.begin(9600);
}
void loop() {
  volt = analogRead(A0)*5.0/1023.0;
  float temperature = -14.46 * log((10000.0*temp) / (5.0-temp)/27074.0);
  Serial.println(temperature); 
}


ИЛИ ТАК... Скетч считывает с аналогового датчика и передает по последовательному порту значение температуры по Цельсию °С, Кельвину °K и Фаренгейту °F .

//Значения из даташита
#define RT0 10000   // Ом
#define B 3977      // K
//--------------------------------------
#define VCC 5    //Напр-е питания
#define R 10000  //R=10 КОм

//переменные
float RT, VR, ln, TX, T0, VRT;

void setup() {
  Serial.begin(9600);
  T0 = 25 + 273.15;                 //Температура T0 из даташита, преобразуем из цельсиев в кельвины
}

void loop() {
  VRT = analogRead(A0);              //Считываем аналоговое значение VRT
  VRT = (5.00 / 1023.00) * VRT;      //Преобразуем в напряжение
  VR = VCC - VRT;
  RT = VRT / (VR / R);               //Сопротивление RT

  ln = log(RT / RT0);
  TX = (1 / ((ln / B) + (1 / T0))); //Температура с термистора

  TX = TX - 273.15;                 //Преобразуем в цельсии

  Serial.print("Temperature:");
  Serial.print("\t");
  Serial.print(TX);
  Serial.print("C\t\t");
  Serial.print(TX + 273.15);        //Преобразуем в кельвины
  Serial.print("K\t\t");
  Serial.print((TX * 1.8) + 32);    //Преобразуем в фаренгейты
  Serial.println("F");
  delay(500);

}


ИЛИ ВООБЩЕ ТАК... Скетч считывает с цифрового датчика и передает по последовательному порту значение температуры по Цельсию °С и Фаренгейту °F. Кроме этого также передается модель датчика и прочая ненужная нам информация. Необходима библиотека <OneWire.h>.

#include <OneWire.h>

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.println(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}


Если вы опасаетесь что-либо удалять из скетча, сделайте не активными все строки Serial.print и Serial.println, кроме нужной. Поставьте перед ними знак комментария - двойного слеша ( // ). Они будут проигнорированы компилятором. Примерно так: 

 //Serial.print("  Temperature = ");
 Serial.println(celsius);
 //Serial.print(" Celsius, ");
 //Serial.print(fahrenheit);
 //Serial.println(" Fahrenheit");

После всех перечисленных действий заливаем скетч в Ардуино. Встроенный в Ардуино монитор порта ( кнопка в правом верхнем углу IDE или комбинация клавиш CTRL+SHIFT+M ) должен показывать примерно следующее:

 

Конечно, при условии что вы все правильно сделали.

На этом первая часть плана - Сторона Ардуино заканчивается. И начинается вторая, более интересная, часть - Сторона компьютера. В которой будет подробно рассмотрено соединение Ардуино с ПК по USB:

Автоматическое определение СОМ порта.

Автоматическое подключение к СОМ порту при подключении к USB.

Обработка ошибок, зависаний и вылетаний с этим связанных.

Продолжение следует...

 

 

Категория: ЖЕЛЕЗО/ПРОГРАММИРОВАНИЕ. | Просмотров: 1550 | Добавил: phom1 | Теги: электронная почта, Send Email, Email, программирование ардуино, ардуино, обработка ошибок в Processing, Processing
Всего комментариев: 1

27.07.2017 07:53 Четверг | №1 < /div> О хорошо, пока все и так понятно. ждем следующих частей
Добавить комментарий