Публікації

NodeMCU 1.0 ESP8266 та запити до Google Spreadsheets

опубліковано 2 квіт. 2017 р., 07:40 Максим Петренко   [ оновлено 7 квіт. 2017 р., 15:18 ]

Для початку створіть таблицю у своєму аккаунті Google.
Потрібно скопіювати URL з рядку адреси, та отримати від нього токен (код, за яким можна отримати доступ до таблиці). У цьому рядку на його місці зірочки:
https://docs.google.com/spreadsheets/d/************/edit
Далі потрібно зайти у «Інструменти – Редактор скриптів».
Коли завантажиться редактор, потрібно замінити його вміст на код, що наведений нижче:
function doGet(e){
 var tag = "";
 var value = "";
 try {
    tag = e.parameters.tag;
    value = e.parameters.value;
    return ContentService.createTextOutput(save_data(tag, value));
 } catch(error) { 
    Logger.log(error);    
    return ContentService.createTextOutput("Error" + error.message);
 }  
}

function save_data(tag, value){
  try {
    var dateTime = new Date();
    //замінити на токен від cвоєї таблиці
    var ss = SpreadsheetApp.openByUrl( "https://docs.google.com/spreadsheets/d/************************************/edit");
    var dataLoggerSheet = ss.getSheetByName("DataLogger");
    var row = dataLoggerSheet.getLastRow() + 1;
    dataLoggerSheet.getRange("A" + row).setValue(row -1);
    dataLoggerSheet.getRange("B" + row).setValue(dateTime);
    dataLoggerSheet.getRange("C" + row).setValue(tag);
    dataLoggerSheet.getRange("D" + row).setValue(value);
    return row - 1;// Count 
  } catch(error) {
    Logger.log(JSON.stringify(error));
  }
}
Далі збережіть його, натиснувши на дискету, та давши ім’я.
Після цього необхідно опублікувати його:
Публікація-Розгорнути як веб-додаток
Відкриється діалогове вікно.
Тут одразу можна скопіювати URL скрипту, оскільки він нам знадобиться при розробці додатку для мікроконтролера.
Не забувайте після кожного редагування обирати зі списку версію продукту «Новий». Інакше працюватиме стара версія.
Тепер модна відкрити Arduino IDE і вставити туди наступний скетч, у який необхідно буде внести відповідні зміни, щоб він працював через ваш WiFi з вашим скриптом (див.  коментарі у коді).

#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"

int i = 0;
//замінити на свій ідентифікатор мережі
const char* ssid = "**********";
//замінити на свій пароль до мережі
const char* password = "**********";
//інтервал у мілісекундах між з'єднаннями
const int dataPostDelay = 30000;
const char* host = "script.google.com";
const char* redirHost = "script.googleusercontent.com";
const int httpsPort = 443;
//замінити на токен від свого скрипта
const char* GScriptId = "....";
String url = String("/macros/s/") + GScriptId + "/exec?";
HTTPSRedirect client(httpsPort);

void setup() {
  Serial.begin(115200);
  Serial.println("Connecting to wifi: ");
  Serial.println(ssid);
  Serial.flush();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print(String("Connecting to "));
  Serial.println(host);
  bool flag = false;
  for (int i = 0; i < 5; i++) {
    int retval = client.connect(host, httpsPort);
    if (retval == 1) {
      flag = true;
      break;
    }
    else
      Serial.println("Connection failed. Retrying…");
  }

  // 1 - є з'єднання
  Serial.println("CStatus: " + String(client.connected()));
  Serial.flush();

  if (!flag) {
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    Serial.println("Exiting…");
    Serial.flush();
    return;
  }
}

void postData(String tag, float value) {
  if (!client.connected()) {
    Serial.println("Connecting to client again…");
    client.connect(host, httpsPort);
  }
  String urlFinal=url+"tag="+tag+"&value="+String(value);
Serial.println(client.printRedir(urlFinal,host,redirHost));
}

void loop() {
  postData("Text", i++);
  delay (dataPostDelay);
}
Для роботи коду вам знадобиться моя версія бібліотеки HTTPSRedirect.h, яку ви можете завантажити тут у архіві.
На момент початку роботи над цим завданням код цієї бібліотеки не дозволяв повертати відповідь на Get запит у програму, а лише виводив її через послідовний порт, що унеможливлювало обробку відповіді у програмі. Сае тому я й вніс невеликі зміни.
Як тільки код зальється, можете відкривати свою таблицю та слідкувати, як усе працює)

Використання кардрідерів RC-522 з мікроконтролером NodeMCU 1.0 ESP8266

опубліковано 2 квіт. 2017 р., 07:31 Максим Петренко

Існує безліч матеріалів щодо підключення зчитувачів карток RC-522 до різних моделей контролерів Arduino, проте щодо підключення зчитувачів до ESP8266 інформація відсутня. Навіть бібліотека зчитувача сумнівається, що щось вийде на уьому мікроконтролері.

Справа ще ускладнюється тим фактом, що підписи портів на NodeMCU 1.0 геть не відповідають тому, що потрібно вказувати у програмі.

На наступному малюнку наведені обидва варіанта підписів (у дужках – написи на платі, перед дужками те, що потрібно вказувати у програмі):

Контролер

Зчитувач

Порт для програми

Напис

Тип

Напис

на вибір (для кожного з пристроїв інший)

SDA

14

D5

SCK

SCK

13

D7

MOSI

MOSI

12

D6

MISO

MISO

-

IRQ

-

GND

GND

GND

на вибір (один для усіх пристроїв)

RST

-

3.3V

3.3V

3.3V

Інтерфейс SPI передбачає, що при підключенні кожного додаткового пристрою, він підключатиметься до тих самих портів, окрім вивиоду SS. SS для кожного з притсроїв має бути підключений до свого порту.

Для Arduino IDE можна скористатися бібліотекою MFRC522 (https://github.com/ljos/MFRC522)

Ось адаптований приклад з цієї бібліотеки:

#include <SPI.h>

#include <MFRC522.h>

#define RST_PIN         5

#define SS_0_PIN        15

#define SS_1_PIN        4

MFRC522 mfrc522[2];

void setup() {

  Serial.begin(9600);

  SPI.begin();

  mfrc522[0].PCD_Init(SS_0_PIN, RST_PIN);

  mfrc522[1].PCD_Init(SS_1_PIN, RST_PIN);

}

void loop() {

 if (mfrc522[0].PICC_IsNewCardPresent() && mfrc522[0].PICC_ReadCardSerial()) {

    Serial.print("Reader 0 ");

    Serial.println(dump_byte_array(mfrc522[0].uid.uidByte, mfrc522[0].uid.size));

    mfrc522[0].PICC_HaltA();

    mfrc522[0].PCD_StopCrypto1();

  }

 if (mfrc522[1].PICC_IsNewCardPresent() && mfrc522[1].PICC_ReadCardSerial()) {

    Serial.print("Reader 1 ");

    Serial.println(dump_byte_array(mfrc522[1].uid.uidByte, mfrc522[1].uid.size));

    mfrc522[1].PICC_HaltA();

    mfrc522[1].PCD_StopCrypto1();

  }

}

 

String dump_byte_array(byte *buffer, byte bufferSize) {

  String tmp = "";

  for (byte i = 0; i < bufferSize; i++) {

    tmp += buffer[i] < 0x100 ? "0" : "";

    tmp += buffer[i] < 0x10 ? "0" : "";

    tmp += buffer[i];

  }

  return tmp;

}

Схема підключення для обох зчитувачів:

Контролер

Зчитувач 0

Порт для програми

Напис

Напис

15

D8

SDA

14

D5

SCK

13

D7

MOSI

12

D6

MISO

-

 

IRQ

-

GND

GND

5

D1

RST

-

3.3V

3.3V


Контролер

Зчитувач 1

Порт для програми

Напис

Напис

4

D2

SDA

14

D5

SCK

13

D7

MOSI

12

D6

MISO

-

 

IRQ

-

GND

GND

5

D1

RST

-

3.3V

3.3V

Програма виводитиме вирівняні "0"-ми ID, з вказанням рідера, до якого було піднесено картку.

Петренко М.В.

1-2 of 2