esp32 - изучаем и попутно сравниваем датчики пыли

  • Цена: $29.87 (за 3 штуки)

В обзоре я пробегусь по основным преимуществам esp32 над Ардуино и расскажу о своем первом проекте на этой платформе — программе сравнения двух наиболее популярных датчиков пыли — SDS-011 и PMSA003.

esp32 — совершенно новое поколение микроконтроллеров, пришедшее на смену Ардуино.
Поначалу меня отпугивали заморочки с переходом. Если полистать сайт производителя espressif, прямо руки опускаются: надо ставить кучу всякого софта, пайтон изучать. все конфигурировать. А после еще наверняка придется вытряхивать баги из своего кода, чтобы обеспечить совместимость скриптов для ATMega328 и ESP32.

А может овчинка и не стоит выделки? Смотрим

Архитектура — у esp — 32 бита, у Ардуино — 8.

Процессор совершенно новый, двухъядерный. Одно ядро занимается только связью, второе крутит пользовательский код.
Частота — 240 МГц, что в 15 раз выше, чем в Ардуино. И есть еще один ULP (ультра-маломощный) процессор, который работает на частоте всего 32 КИЛОгерца в режиме сна. У него есть своя небольшая (16 Кб) память, свой набор команд, многого он не умеет, но если что — разбудит основной проц. Полезная штука.

Оперативной памяти — 520 Кб, что в 260 раз больше, чем на Ардуино и почти дотягивает до сакраментального «640K ought to be enough for anybody!».

Энергонезависмая программная память — 448 Кб что тоже выгодно отличается от Ардуино, там 32 кб.
(Честно говоря, именно память и стала последней каплей, после которой для некоторых своих проектов я решил перебираться на esp32.)

Да, есть флеш в 4Мб, до 16 в некоторых версиях, и по слухам, там тоже можно размещать программный код.

Еще на борту есть WiFi, блютус с поддержкой BLE, поддерживаются всякие криптографические функции. В Ардуино всего этого нет, разумеется.

По входам-выходам тоже хороший привес: 36 штук, вместо 14 на Ардуино, а аналоговых — 18 вместо 6. Да, и оцифровка входящего сигнала 12-битным АЦП, а не 10-битным, что дает 4096 уровней, вместо 1024.

А еще ЦАП, чего в ардуине нет вовсе. И 4 SPI, 2 I2C, 2 I2S и 2 UART. Интерфейс для тачскрина и даже зачем-то датчик Холла. А вот датчика температуры в моих экземплярах нет, хотя по датшиту он предусмотрен. Скрипт выдает неизменные 53,33 градуса.

Схема модулей выглядит так:



Вот как выглядит краткое описание выводов этого контроллера:



Как выяснилось, перенастроить Arduino IDE для прошивки esp32 проще простого: Надо добавить в настойки адрес, где искать информацию о контроллерах:
dl.espressif.com/dl/package_esp32_index.json

Выглядит это вот так:



Потом запустить менеджер контроллеров и найти в нем esp32. Нажать кнопку «установить».



Все. Отныне ваша IDE поддерживает esp32. Только из списка плат надо выбрать ESP 32 Dev Module.



А в меню примеров появятся встроенные примеры скриптов для esp.

Все сложные инструкции, которые можно найти в сети, относятся к более старым версиям Arduino IDE. В новых названных мной шагов вполне достаточно.

С теорией понятно, можно переходить к практической части. Я заказал сразу три esp32.
Пришли они в стандартных антистатических пакетах.



Сделаны с адекватным качеством. Флюс кое-где не смыт, шелкография читается не идеально, но это не беда. Пайка хорошая.



На плате кроме собственно чипа esp32 есть пара светодиодов, степдаун на 3,3 вольта на ams1117, микросхема последовательного порта cp2102. Имеются две кнопки.





Обратная сторона занята только надписью «DoIt ESP32 DEVKIT V1 doit.am».



Заходил я на этот армянский сайт. Там все по-китайски.

Для теста можно залить очень мощную программу AMS, которая предоставляет роскошный веб интерфес для всех ваших проектов. При загрузке она выдает некоторую информацию о esp.

AMS for ESP32 SD started…
Module Random… started
Module EEPROM (NVS)…
Name: ESP32 SD
ID: W25D1-F08MJ-3KWLF
Address: 217
===========
Module Hardware…
Arduino IDE: 1.8.9
SDK version: v3.2.3
Chip revision: 1
Chip ID: 50BEC4BF713C
CPU freq: 240 MHz
Free memory: 313228 (109%)
Flash mode: 2
Flash speed: 80 MHz
Flash size: 4194304
Self temp: 53.3 C
===========
Module Wi-Fi…
Connecting to xxxxxxxx.
WiFi: connected
IP address: 192.168.1.70
===========
Module SD…
Init: OK
Type: SDSC
Size: 1947 MB
Check:…
Files: 138
Total: 2065241 B
Empty: 1
Index: found
===========
Module NTP…
Server: 129.6.15.30
Port: 123
===========


К вайфаю, к слову, подкдючились мгоновенно и на скорости 150 мб.

Затем я решил оценить прирост скорости. Контроллер этот будет использоваться в основном для создания отностельно серьезных подлок, разные там включения-выключения света и воды останутся для Ардуино. Стало быть, новому esp32 придется иметь дело с экраном. Я подключил ардуину и esp32 к двум экранам. У них разный физический размер, но размеры в пикселях и контроллеры одинаковые. Одинаковая и программная часть тест библиотеки Ucg. Запускаются совершенно синхронно, от одного блока питания.

Вот результат — ролик полторы минуты:



esp примерно в 2,5 раза быстрее Ардуины. И еще важный момент: выводы esp на 3,3 вольта, а у Ардуины 5. Таким образом, для сопряжения уровней для ардуины нужен либо конвертор уровней, либо батарея резисторов. А esp напрямую подключается ко входам экрана.

Но для настощего тестирования нужен проект поинтересней. Я недавно опубликовал сравнительный обзор четырех датчиков СО2.

И теперь хотелось бы сравнить два бытовых датчика пыли. — PMSA003 и SDS-011. О последнем я уже писал обзор (https://mysku.me/blog/china-stores/72041.html). Была написана программа, которая рисовала на экранчике вот такой график:



Да, SDS-011 — хороший датчик. Но вот беда — написанная программа для него занимала в ПЗУ 20 кб из 30 и 1,5 кб из 2 ОЗУ. Перенести ее на более просторный экран и добавить поддержку второго датчика не предсталялось возможным. С появлением esp32 мечты стали сбываться.

И вот теперь я решил ни в чем себе не отказывать. Подключил датчики и экран к esp32. Взял более мощную графическую библиотеку. Крупнее экран. Особенно не заморачиваясь с оптимизацией, написал код. Сделал так, чтобы статистики накапливалось втрое больше, чем в предыдущей версии программы. И вот что у меня получилось:

Несколько экранов скучного кода, не открывайте

//////////////////////////////////////////////////////////////////////////////////////
//////////////              © tykhon, 2019        ////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
#include <SPI.h>
#include "Ucglib.h"
#include "HardwareSerial.h"

#define PMSSerial Serial2
#define SDSSerial Serial1

unsigned int SDS_Pm25;
unsigned int SDS_Pm100;
float SDS_Pm25mean;
float SDS_Pm100mean;
float SDS_Pm25f;
float SDS_Pm100f;
float PMS_Pm10mean;
float PMS_Pm25mean;
float PMS_Pm100mean;

float smoothing_factor = 0.3;   // coeff for Kalman 0.01 - 0.99. Higher for less smoothing. 

uint32_t start = millis();
uint32_t now = millis();  
uint32_t nextrun = 0;
boolean PMSrun = false;

const int period = 180;  // period of sensor poll, sec 
const int sds_period = period/60;

int line_sds_25[200] = {};  
int line_sds_100[200] = {};  
int line_pms_10[200] = {};  
int line_pms_25[200] = {};  
int line_pms_100[200] = {};  
byte lineIndex_pms;
byte lineIndex_sds;
unsigned int line_sds_100sum = 0;
unsigned int line_sds_25sum = 0;

Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 16, /*cs=*/ 17, /*reset=*/ 5);

//////////////////////////////////////////////////////////////////////////
/////////                      SDS 011                     ///////////////
//////////////////////////////////////////////////////////////////////////

void SDSworkmode(byte mode)
{
  byte cs = 7 + mode;
  uint8_t sleep_command[] = {0xAA, 0xB4, 0x08, 0x01, mode, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, cs, 0xAB};      
//                                                     ^^ 0 for continuous, 1-30 for 1-30 min delay between turns on.              ^^ checksum: 07 for 0x00, 08 for 0x01 and so on
  for (uint8_t i = 0; i < 19; i++) {
    SDSSerial.write(sleep_command[i]);
  }
}

void SDSwakeup()
{
  uint8_t wakeup_command[] = {0xAA, 0xB4, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x06, 0xAB};

  for (uint8_t i = 0; i < 19; i++) {
    SDSSerial.write(wakeup_command[i]);
  }
}  

boolean ProcessSerialData()
{
  uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[10] = {0};
  uint8_t mCheck = 0;
  while (SDSSerial.available() > 0)
  {
    mData = SDSSerial.read();     delay(2);//wait until packet is received
    if (mData == 0xAA) //head1 ok
    {
      mPkt[0] =  mData;
      mData = SDSSerial.read();
      if (mData == 0xc0) //head2 ok
      {
        mPkt[1] =  mData;
        mCheck = 0;
        for (i = 0; i < 6; i++) //data recv and crc calc
        {
          mPkt[i + 2] = SDSSerial.read();
          delay(2);
          mCheck += mPkt[i + 2];
        }
        mPkt[8] = SDSSerial.read();
        delay(1);
        mPkt[9] = SDSSerial.read();
        if (mCheck == mPkt[8]) //crc ok
        {
          SDSSerial.flush();
          SDS_Pm25 = (uint16_t)mPkt[2] | (uint16_t)(mPkt[3] << 8);
          SDS_Pm100 = (uint16_t)mPkt[4] | (uint16_t)(mPkt[5] << 8);
          if (SDS_Pm25 > 9999)
            SDS_Pm25 = 9999;
          if (SDS_Pm100 > 9999)
            SDS_Pm100 = 9999;
          return true;
        } else {Serial.println('crc not ok');};
      } else {Serial.println('head not ok');};
    }
  }
}



//////////////////////////////////////////////////////////////////////////
/////////                      PMSA003                     ///////////////
//////////////////////////////////////////////////////////////////////////

void PMSworkmode(byte mode)
{
  byte cs = 70 + mode;
  uint8_t mode_command[] = {0x42, 0x4D, 0xE1, 0x00, mode, 0x01, cs};      
//                                                   ^^ 0 for passive, 1 for active. The last byte - checksum: 70 for 0x00, 71 for 0x01 and so on
  for (uint8_t i = 0; i < 7; i++) {
    PMSSerial.write(mode_command[i]);
  }
  delay(100);
}

void PMSwakeup()
{
  uint8_t wakeup_command[] = {0x42, 0x4D, 0xE4, 0x00, 0x01, 0x01, 0x74};

  for (uint8_t i = 0; i < 7; i++) {
    PMSSerial.write(wakeup_command[i]);
  }
  delay(100);
}  

void PMSsleep()
{
  uint8_t sleep_command[] = {0x42, 0x4D, 0xE4, 0x00, 0x00, 0x01, 0x73};

  for (uint8_t i = 0; i < 7; i++) {
    PMSSerial.write(sleep_command[i]);
  }
  delay(100);
}  

void PMSpassive_mode_read()
{
  uint8_t read_command[] = {0x42, 0x4D, 0xE2, 0x00, 0x00, 0x01, 0x71};

  for (uint8_t i = 0; i < 7; i++) {
    PMSSerial.write(read_command[i]);
  }
  delay(100);
}  

///////////////////////////////////////////////////////////////////

struct pms5003data {
  uint16_t framelen;
  uint16_t pm10_standard, pm25_standard, pm100_standard;
  uint16_t pm10_env, pm25_env, pm100_env;
  uint16_t particles_03um, particles_05um, particles_10um, particles_25um, particles_50um, particles_100um;
  uint16_t unused;
  uint16_t checksum;
};
 
struct pms5003data data;

boolean readPMSdata(Stream *s) {
  if (! s->available()) {
    Serial.println("data not available");
    return false;
  }
  
  // Read a byte at a time until we get to the special '0x42' start-byte
  if (s->peek() != 0x42) {
    s->read();
    Serial.println("no 42");
    return false;
  }
 
  // Now read all 32 bytes
  if (s->available() < 32) {
    Serial.println("less than 32");
    return false;
  }
    
  uint8_t buffer[32];    
  uint16_t sum = 0;
  s->readBytes(buffer, 32);
 
  // get checksum ready
  for (uint8_t i=0; i<30; i++) {
    sum += buffer[i];
  }
 
  /* debugging
  Serial.println();
  for (uint8_t i=0; i<32; i++) {
    // was i=2
    Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
  }
  Serial.println();
  */
  
  // The data comes in endian'd, this solves it so it works on all platforms
  uint16_t buffer_u16[15];
  for (uint8_t i=0; i<15; i++) {
    buffer_u16[i] = buffer[2 + i*2 + 1];
    buffer_u16[i] += (buffer[2 + i*2] << 8);
  }
 
  // put it into a nice struct :)
  memcpy((void *)&data, (void *)buffer_u16, 30);
 
  while (s->available()) {s->read();};
  if (sum != data.checksum) {
    Serial.println("Checksum failure");
    Serial.print(" sum = ");
    Serial.print(sum, HEX);
    Serial.print(" data.checksum = ");
    Serial.println(data.checksum, HEX);
    return false;
  }
  // success!
  return true;
}

//////////////////////////////////////////////////////////////////////////////////

void math_PMS(){
  if (!PMS_Pm10mean) PMS_Pm10mean = data.pm10_standard;
  if (!PMS_Pm25mean) PMS_Pm25mean = data.pm25_standard;
  if (!PMS_Pm100mean) PMS_Pm100mean = data.pm100_standard;
  PMS_Pm10mean = PMS_Pm10mean - smoothing_factor*(PMS_Pm10mean - data.pm10_standard);
  PMS_Pm25mean = PMS_Pm25mean - smoothing_factor*(PMS_Pm25mean - data.pm25_standard);
  PMS_Pm100mean = PMS_Pm100mean - smoothing_factor*(PMS_Pm100mean - data.pm100_standard);

  line_pms_10[lineIndex_pms] = int(PMS_Pm10mean*10.0);
  line_pms_25[lineIndex_pms] = int(PMS_Pm25mean*10.0);
  line_pms_100[lineIndex_pms] = int(PMS_Pm100mean*10.0);
  lineIndex_pms++;
  if (lineIndex_pms >= sizeof(line_pms_100)/sizeof(int)) {lineIndex_pms = 0;};
}

void math_SDS(){
  if (!SDS_Pm25mean) SDS_Pm25mean = SDS_Pm25/10.0;
  SDS_Pm25mean = SDS_Pm25mean - smoothing_factor*(SDS_Pm25mean - SDS_Pm25/10.0);
  if (!SDS_Pm100mean) SDS_Pm100mean = SDS_Pm100/10.0;
  SDS_Pm100mean = SDS_Pm100mean - smoothing_factor*(SDS_Pm100mean - SDS_Pm100/10.0);

  line_sds_25[lineIndex_sds] = int(SDS_Pm25mean*10.0);
  line_sds_100[lineIndex_sds] = int(SDS_Pm100mean*10.0);
  lineIndex_sds++;
  if (lineIndex_sds >= sizeof(line_sds_100)/sizeof(int)) {lineIndex_sds = 0;};

}

//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////          graph           ///////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

void main_graph_sds(){
  ucg.setColor(0, 0, 0);                                        // clear field
  ucg.drawBox(1, 1, 220, 119);

  ucg.setColor(255, 255, 255);                                  // half line
  ucg.drawHLine(0, (ucg.getHeight()/2), ucg.getWidth());            
  
  ucg.setColor(250, 255, 10);
  ucg.drawVLine(20, 5, 90);                                     //  y line
  ucg.drawHLine(20, 95, 200);                                   //  x line

  int maxvalue = 1;                                             // y scale
  for (int i = 0; i < (sizeof(line_sds_100)/sizeof(int)); i++){
    maxvalue = max(maxvalue, line_sds_100[i]);
    maxvalue = max(maxvalue, line_sds_25[i]);
  };
  maxvalue = int(ceil(float(maxvalue)/50.0)*50);
  ucg.setFont(ucg_font_helvB12_hr);
  ucg.setColor(255,255,255);
  ucg.setPrintPos(1,20);
  ucg.print(maxvalue/10);
  int hours_count = sizeof(line_sds_100)/sizeof(int);             // x scale
  int step_in_min = sds_period;
  hours_count = hours_count * step_in_min;
  hours_count = hours_count / (-60);
  int onestep = 1;
  if (hours_count < -5) {onestep = 2;};
  for (int i = 0; i >= hours_count; i = i - onestep) {
    int posx = 20 +(sizeof(line_sds_100)/sizeof(int)) + i*(60/step_in_min);
    ucg.setColor(250,255,10);
    ucg.drawVLine(posx, 95, 5);
    int shift = posx+1;
    if (shift > 200) {shift = shift-10;};
    ucg.setPrintPos(shift, 114);
    ucg.setColor(255,255,255);
    ucg.print(i);
  };

  int g = 20+(sizeof(line_sds_100)/sizeof(int));                  // plot draw
  for (int i = lineIndex_sds-1; i >= 0; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_sds_100[i], 0, maxvalue, 0, 92);
    int y2 = map(line_sds_25[i], 0, maxvalue, 0, 92);
    ucg.setColor(10, 80, 250);
    ucg.drawVLine(x1, 95-y1, y1);
    ucg.setColor(250, 10, 80);
    ucg.drawVLine(x1, 95-y2, y2);
  };

  for (int i = (sizeof(line_sds_100)/sizeof(int))-1; i >= lineIndex_sds; i--){ 
    int x1 = g;
    g--;
    int y1 = map(line_sds_100[i], 0, maxvalue, 0, 92);
    int y2 = map(line_sds_25[i], 0, maxvalue, 0, 92);
    ucg.setColor(10, 80, 250);
    ucg.drawVLine(x1, 95-y1, y1);
    ucg.setColor(250, 10, 80);
    ucg.drawVLine(x1, 95-y2, y2);
  };  
 
}


void main_graph_pms(){
  ucg.setColor(0, 0, 0);                                          // clear field
  ucg.drawBox(1, 124, 220, 119);

  ucg.setColor(255, 255, 255);                                    //  half line
  ucg.drawHLine(0, (ucg.getHeight()/2), ucg.getWidth());          

  ucg.setColor(250, 255, 10);
  ucg.drawVLine(20, 128, 90);                                     //  y line
  ucg.drawHLine(20, 218, 200);                                    //  x line

  int maxvalue = 1;                                               // y scale
  for (int i = 0; i < (sizeof(line_pms_100)/sizeof(int)); i++){
    maxvalue = max(maxvalue, line_pms_100[i]);
    maxvalue = max(maxvalue, line_pms_25[i]);
    maxvalue = max(maxvalue, line_pms_10[i]);
  };
  maxvalue = int(ceil(float(maxvalue)/50.0)*50);

  ucg.setFont(ucg_font_helvB12_hr);
  ucg.setColor(255,255,255);
  ucg.setPrintPos(1,143);
  ucg.print(maxvalue/10);
  int hours_count = sizeof(line_pms_100)/sizeof(int);
  int step_in_min = sds_period;
  hours_count = hours_count * step_in_min;
  hours_count = hours_count / (-60);
  int onestep = 1;
  if (hours_count < -5) {onestep = 2;};
  for (int i = 0; i >= hours_count; i = i - onestep) {
    int posx = 20 +(sizeof(line_pms_100)/sizeof(int)) + i*(60/step_in_min);
    ucg.setColor(250,255,10);
    ucg.drawVLine(posx, 218, 5);
    int shift = posx+1;
    if (shift > 200) {shift = shift-10;};
    ucg.setPrintPos(shift, 237);
    ucg.setColor(255,255,255);
    ucg.print(i);
  };

  int g = 20+(sizeof(line_pms_100)/sizeof(int));                  // plot draw
  for (int i = lineIndex_pms-1; i >= 0; i--){ 
    int x = g;
    g--;
    int y1 = map(line_pms_100[i], 0, maxvalue, 0, 92);
    int y2 = map(line_pms_25[i], 0, maxvalue, 0, 92);
    int y3 = map(line_pms_10[i], 0, maxvalue, 0, 92);
    ucg.setColor(10, 80, 250);
    ucg.drawVLine(x, 218-y1, y1);
    ucg.setColor(250, 10, 80);
    ucg.drawVLine(x, 218-y2, y2);
    ucg.setColor(80, 250, 10);
    ucg.drawVLine(x, 218-y3, y3);
  };

  for (int i = (sizeof(line_pms_100)/sizeof(int))-1; i >= lineIndex_pms; i--){ 
    int x = g;
    g--;
    int y1 = map(line_pms_100[i], 0, maxvalue, 0, 92);
    int y2 = map(line_pms_25[i], 0, maxvalue, 0, 92);
    int y3 = map(line_pms_10[i], 0, maxvalue, 0, 92);
    ucg.setColor(10, 80, 250);
    ucg.drawVLine(x, 218-y1, y1);
    ucg.setColor(250, 10, 80);
    ucg.drawVLine(x, 218-y2, y2);
    ucg.setColor(80, 250, 10);
    ucg.drawVLine(x, 218-y3, y3);
  };  
 
}

////////////////////////////////////////////////////////////////////////////

void print_SDS(){
  SDS_Pm25f = SDS_Pm25/10.0;
  SDS_Pm100f = SDS_Pm100/10.0;
  String dataString = "SDS_2.5:\t"+String(SDS_Pm25f,0)+"\tSDS_10:\t"+String(SDS_Pm100f,0)+"\tSDS_2.5~:\t"+String(SDS_Pm25mean,1)+"\tSDS_10~:\t"+String(SDS_Pm100mean,1);
  dataString.replace(".",",");
  Serial.print(dataString);
}

void print_PMS(){
  /*
  Serial.print("\tPMS_1:\t"); Serial.print(data.pm10_standard);
  Serial.print("\tPMS_2.5:\t"); Serial.print(data.pm25_standard);
  Serial.print("\tPMS_10:\t"); Serial.print(data.pm100_standard);
  Serial.print("\tPMS_1~:\t"); Serial.print(PMS_Pm10mean,1);
  Serial.print("\tPMS_2.5~:\t"); Serial.print(PMS_Pm25mean,1);
  Serial.print("\tPMS_10~:\t"); Serial.println(PMS_Pm100mean,1);
  */
  String dataString = "\tPMS_1:\t"+String(data.pm10_standard)+"\tPMS_2.5:\t"+String(data.pm25_standard)+"\tPMS_10:\t"+String(data.pm100_standard)+"\tPMS_1~:\t"+String(PMS_Pm10mean,1)+"\tPMS_2.5~:\t"+String(PMS_Pm25mean,1)+"\tPMS_10~:\t"+String(PMS_Pm100mean,1);
  dataString.replace(".",",");
  Serial.println(dataString);
}

void print_PMS_full(){
  Serial.println();
  Serial.println("---------------------------------------");
  Serial.println("Concentration Units (standard)");
  Serial.print("PM 1.0: "); Serial.print(data.pm10_standard);
  Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_standard);
  Serial.print("\t\tPM 10: "); Serial.println(data.pm100_standard);
  Serial.println("---------------------------------------");
  Serial.println("Concentration Units (environmental)");
  Serial.print("PM 1.0: "); Serial.print(data.pm10_env);
  Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_env);
  Serial.print("\t\tPM 10: "); Serial.println(data.pm100_env);
  Serial.println("---------------------------------------");
  Serial.print("Particles > 0.3um / 0.1L air:"); Serial.println(data.particles_03um);
  Serial.print("Particles > 0.5um / 0.1L air:"); Serial.println(data.particles_05um);
  Serial.print("Particles > 1.0um / 0.1L air:"); Serial.println(data.particles_10um);
  Serial.print("Particles > 2.5um / 0.1L air:"); Serial.println(data.particles_25um);
  Serial.print("Particles > 5.0um / 0.1L air:"); Serial.println(data.particles_50um);
  Serial.print("Particles > 10.0 um / 0.1L air:"); Serial.println(data.particles_100um);
  Serial.println("---------------------------------------");
}

void lcd_print(){
  ucg.setColor(0, 0, 0);
  ucg.drawBox(270, 0, 80, 119);
  ucg.drawBox(270, 121, 80, 240);
  ucg.setFont(ucg_font_fub20_hf);
  ucg.setColor(255, 255, 255);
  ucg.setPrintPos(270,35);
  ucg.print(SDS_Pm100f,0);
  ucg.setPrintPos(270,90);
  ucg.print(SDS_Pm25f,0);
  ucg.setPrintPos(270,160);
  ucg.print(data.pm100_standard);
  ucg.setPrintPos(270,195);
  ucg.print(data.pm25_standard);
  ucg.setPrintPos(270,230);
  ucg.print(data.pm10_standard);
}

void setup() {
  Serial.begin(115200);
  PMSSerial.begin(9600, SERIAL_8N1, 32, 33);
  SDSSerial.begin(9600, SERIAL_8N1, 34, 35);

  SDSwakeup();
  delay(10);
  SDSwakeup();
  SDSworkmode(sds_period);
  
  PMSwakeup();
  PMSworkmode(0);
  PMSwakeup();

  ucg.begin(UCG_FONT_MODE_SOLID);
  ucg.clearScreen();
  ucg.setRotate270();
  ucg.setFont(ucg_font_fub14_hf);
  ucg.setColor(255, 255, 155);
  ucg.setPrintPos(234,35);
  ucg.print("10");
  ucg.setPrintPos(234,90);
  ucg.print("2.5");
  ucg.setPrintPos(234,160);
  ucg.print("10");
  ucg.setPrintPos(234,195);
  ucg.print("2.5");
  ucg.setPrintPos(234,228);
  ucg.print("1.0");
}

   
void loop() {
  now = millis();
  if ((now > nextrun)&(!PMSrun)) {
    PMSwakeup();
    PMSrun = true;
  }
  if (now > (nextrun + 30000)) {
    if (ProcessSerialData()){
      math_SDS();
      print_SDS();
    };
    while (PMSSerial.available()) { PMSSerial.read(); };
    PMSpassive_mode_read();
    delay(1000);
    if (readPMSdata(&PMSSerial)) {
      math_PMS();
      print_PMS();
    };
    PMSsleep();
    PMSrun = false;
    lcd_print();
    main_graph_sds();
    main_graph_pms();
    nextrun = now + period*1000 - 30000;
  };
    
  delay(10);
}
 



И все эти мигом скомпилировалось для esp.

Sketch uses 231536 bytes (17%) of program storage space. Maximum is 1310720 bytes.
Global variables use 17868 bytes (5%) of dynamic memory, leaving 309812 bytes for local variables. Maximum is 327680 bytes.


Запускаем — работает!



Программа позволила сравнить два датчика. Оба оказались неплохими, показания обоих релевантны ситуации в квартире. SDS-011 более чутко реагирует на любой взмах тряпки. PMSA003 выдает больше информации и работает практически неслышно. И он компактнее раза в четыре.





Но вернемся к esp. При всех его достоинствах, один недостаток я все-таки обнаружил. Дело в том, что для заливания программы в контроллер требуется нажать на кнопку EN и удерживать ее несколько секунд. При частых сменах кода это начинает подбешивать. Кроме того, блокируется возможность обновления прошивки удаленно. Порывшись в интернете, я нашел простой рецепт избавления от этого недостатка. Надо всего лишь



припаять конденсатор между выводами кнопки EN. Одного микрофарада будет достаточно. У меня получилось.

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

Что в итоге?
Платы однозначно рекомендую к покупке. Программируются так же просто как Ардуино, но нет лишних ограничений, больше встроенных возможностей, больше потенциал интеграции с другими устройствами и масштабируемость. Хороший компромисс между примитивными задачами для Ардуины и совсем уж почти компьютером Raspberry PI.

Вы прочли обзор, который я писал дольше всех остальных моих обзоров.Самая большая трудность — выбрать из огромного моря информации в документации и на форумах то, о чем стоит упомянуть в кратком обзоре. Потому что если писать все, то никакой жизни не хватит, особенно если возможности esp проверять и иллюстрировать.

Основная мысль, которую я хотел донести — это то, что с появлением документации, библиотек и примеров, программировать esp32 стало так же просто, как и ардуино. А возможностей у esp в разы больше.

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.
Планирую купить +87 Добавить в избранное +108 +185
+
avatar
  • Samaron
  • 22 сентября 2019, 10:27
+25
Цена абсолютно не адекватная
Одна ESP32 стоит в районе 4$

aliexpress.com/item/32928267626.html

PS. Датчика температуры там нет, его выпилили в поздних версиях.
+
avatar
  • Zynq
  • 22 сентября 2019, 10:34
-1
Кит на stm32f\h серии мне представляется гораздо интереснее. В первую очередь за счет полностью открытой документации, а не огрызков доя esp
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:02
+5
А мне нет. В stm32 wifi и Bluetooth нет.
А h серия имеет конский ценник
+
avatar
  • darkbyte
  • 22 сентября 2019, 20:08
+1
А в sdk esp32 уже допилили поддержку классического блутуза, или там всё так же только BLE?
+
avatar
  • ssurneed
  • 22 сентября 2019, 20:24
0
Вот не знаю. Мне в основном wifi нужен.
+
avatar
0
В Arduino — BLE только. Обещают-обещают, да все никак…
+
avatar
+3
Далеко не в каждом устройстве (поделке) нужен wi-fi. А уж bluetoth и подавно. При этом прикрутить к stm32 сетевушку (что lan, что wi-fi) — не проблема. Да, это будет отдельный модуль, но покупать его нужно будет лишь для тех вещей, в которых в нём есть реальная необходимость
+
avatar
  • ssurneed
  • 23 сентября 2019, 13:53
+2
Так я не спорю. Я вполне себе юзаю стм32 с usb если надо.
Просто коммент что кит на основе stm32 интереснее звучит странно
Тем более что документациия на esp открыта

Кроме того, далеко не в каждой поделке нужен stm32 ;) Тут вот ниже за атмегу топят)
+
avatar
0
Да, далеко не в каждой. Тут (ИМХО) всё зависит от двух вещей:
-реально необходимая физическая мощность (сюда я включаю объёмы памяти, частоту камня, наборы поддерживаемых инструкций, интерфейсы и т.п.)
-привычки и личных предпочтений (если не планируется массовый выпуск устройства, то на разницу в стоимости можно и не обращать внимания в некоторых случаях, особенно если привык к какой-то платформе и лень смотреть, как с другой работать).

Если же речь идёт о чём-то тиражируемом, чему достаточно мощности атмеги, то ясен пень — разница в цене, помноженная на объём, будет очень ощутимой.
+
avatar
  • alex323
  • 23 сентября 2019, 18:51
0
Кроме того, далеко не в каждой поделке нужен stm32 ;) Тут вот ниже за атмегу топят)
Чем таким не угодил stm32, что он не в каждой поделке нужен? Цена ниже, чем за атмегу. Возможностей минимум на порядок больше. STM32F030F4P6 в можно чуть не даром взять.

Или STM32F103CBT6 за доллар.
А теперь сравните цены на атмеги.
+
avatar
  • ssurneed
  • 23 сентября 2019, 19:04
0
Давайте для примера возьмём stm32f030+ws2812b и атмегу328+ws2812b
И сравним время когда у вас и там и там замигает ws2812b
+
avatar
  • Zynq
  • 23 сентября 2019, 19:23
0
у меня на STM32F405 замигали через полчаса, правда циклы пришлось развернуть и HAL выкинуть — времянка больно быстрая для них нужна. На мегу бы вспоминал час что там и как-там. Мигалка светодиодов — мастер в VisualGDB делает одним кликом, дальше — легко. Весь код запуска PLL — генерит STMCube одним кликом. А у это меги JTAG-SWD есть? Без него — это тыканье вслепую, отвык давно уже, с авр 20 лет работаю — с AT90S1200 начиная.
+
avatar
  • ssurneed
  • 23 сентября 2019, 19:28
0
Ну не поверю в пол часа с hal.
На атмегу за 3 минуты скачивается либа и правится только пин.
+
avatar
0
Если писать либу самому, то вообще никакой разницы. Если использовать готовую либу, то некоторая разница есть в плане времени поиска этой либы в интернете. Но в целом не критично.
+
avatar
  • ssurneed
  • 23 сентября 2019, 19:45
0
Если использовать готовые либы то тут есть большой сурприз. В Ардуино они ищутся прям из среды, что очень здорово.
А под стм32 либ с свободном доступе не так и много и они часто не работают без правок
+
avatar
  • alex323
  • 24 сентября 2019, 20:18
+1
Если использовать готовые либы то тут есть большой сурприз. В Ардуино они ищутся прям из среды, что очень здорово.
Так мы сравниваем среды разработки или процессоры? На STM32 тоже можно залить ардуино загрузчик, получим всё то же самое плюс гораздо больше памяти и АЦП большей разрядности. Только зачем лишать себя огромных возможностей STM32?
+
avatar
  • Zynq
  • 23 сентября 2019, 20:25
+1
не, для такого примитива я либы не ищу, по даташиту пишу. Либы — это для сложного и кропотливого.
+
avatar
  • Lex1981
  • 22 сентября 2019, 10:35
+4
согласен. За 3 штуки дороговато.
+
avatar
  • UWU
  • 22 сентября 2019, 10:44
+29
Не всё так однозначно:
1. Arduino (ATmega328P) реально раза в три дешевле
2. Есть огромное количество проектов, для которого ресурсов Arduino более чем достаточно (количество ног, объём RAM и ROM, скорость работы, потребляемая энергия)
3. Arduino плата значительно компактнее. Что часто имеет весьма важное значение.
4. ESP32 во много раз прожорливее Arduino. Требования по питанию для ESP32 гораздо серьёзнее. Кроме того, требуется гораздо более высокий уровень программирования для ESP32, чтобы заставить ESP32 бережливее расходовать энергию.
5. У Arduino выводы не обязательно 5v. Есть версия с выводами и 3.3v.
6. Arduino ГОРАЗДО более дружественна по аппаратной части. Для Arduino совершенно не обязательно притягивать к земле не используемые ноги. Arduino реально практические не боится статики и даже низковольтная версия поддерживает гораздо более высокие напряжения без последствий. В общем, ATmega328P по надёжности это практически как автомат Калашникова. А вот всякие ESP8266, ESP32, STM32 часто глючат, дохнут и вообще гораздо более нежные девайсы.
7. Готовых библиотек для ESP32 мало. Если кто-то планируется на ESP32 цеплять какие-то устройства, то нужно сразу готовиться к тому, что для ESP32 придётся для многих внешних устройств писать самостоятельно драйвер/библиотеку. Это, на самом деле, не так уж и сложно. Но это точно требует гораздо более высокий уровень знаний.

В общем для меня вывод один. Автор обзора не слишком хорошо разбирается в программировании, и считает, что чем оптимизировать программу проще купить более мощный компьютер.
+
avatar
  • Samaron
  • 22 сентября 2019, 10:58
+3
4. Если смотреть по энергопотреблению, то в стоковом варианте обе платы жрут немеряно, там стоит преобразователь на 3.3В у которого потребление без нагрузки ~ 7мА, то есть аккумулятор на 1000мА плата выест за 6 дней, даже если процессор будет в DeepSleep режиме, а так как там еще висит FTDI, резисторы подтяжки и светодиоды то хорошо если сутки проживет.
+
avatar
  • UWU
  • 22 сентября 2019, 11:04
+1
ATmega328P может работать в широком диапазоне напряжений, реально до 6v. Поэтому можно питать Arduino напрямую от аккумулятора. Другое дело, что не все i2c девайсы так тоже могут, но это легко решаемая проблема. Так что для Arduino вообще выпаиваем преобразователь и получаем даже не микроамперы, а нано амперы.

А вообще нормальный LDO линейник реально потребляем где-то 0.5mA и меньше. Но никак не 7mA.
+
avatar
  • tykhon
  • 22 сентября 2019, 12:34
+1
Вы три ячейки свинцово-кислотного аккумулятора подразумеваете под источником напряжения 6 вольт? Мне такое решение не очень удобно, а 3,2 — 4,2 В не вписываются ни в потребности ардуины 3,3 в, ни в 5в.
Конечно, сделать микро-потребление — непростая задача, но не всегда оно и нужно. Чтобы измерять раз в 15 минут температуру на улице, достаточно Ардуино. А esp — это все-таки для более сложных задач. У меня вот она экраном рулит, два датчика вентиляторами крутят. Тут уж не важно, сколько там esp потребляет.
+
avatar
  • UWU
  • 22 сентября 2019, 12:39
+10
3,2 — 4,2 В не вписываются ни в потребности ардуины 3,3 в, ни в 5в.
3.0v — 4.2v идеально вписывается в потребление ATmega328P.
+
avatar
  • tykhon
  • 22 сентября 2019, 12:40
0
Не знал, спасибо за науку.
+
avatar
  • X3Shim
  • 22 сентября 2019, 18:47
+2
у меня метеостанция до 2.8 вольта норм данные передает (арду+NRF).
+
avatar
+4
если не разгоняешь на максимальную частоту и не пишешь в еепром то 328p и до 2 вольт работает.
+
avatar
0
А не подскажете, что почитать, чтоб прошить Atmega128, выпаяную с чего-то, под Arduino?
А то у 328й слишком мало ног, чтоб управлять 6 разрядным, 7 сегментным LED дисплеем.
+
avatar
  • MaDerer
  • 22 сентября 2019, 17:29
0
2,7 — 4,2 В также хорошо вписываются в питание esp8266
+
avatar
  • Onibi
  • 22 сентября 2019, 17:41
+2
Нет, у esp8266 согласно даташиту диапазон напряжений 2,5-3,6. И 3,3в всё равно откуда-то надо брать, иначе не один датчик не заработает
+
avatar
  • UWU
  • 22 сентября 2019, 18:41
0
И 3,3в всё равно откуда-то надо брать, иначе не один датчик не заработает
А зачем датчики держать постоянно включёнными? Надо датчик, включил 3.3v для датчика, снял показания, отключил питание.
+
avatar
  • Onibi
  • 22 сентября 2019, 21:21
0
Брать то его откуда?
+
avatar
  • UWU
  • 22 сентября 2019, 21:24
0
Есть разные варианты. Например из связки MT3608 + XC6206
+
avatar
  • Onibi
  • 23 сентября 2019, 11:13
0
Собственно что и требовалось доказать, запитать напрямую от 18650 esp8266 будет плохой идеей
+
avatar
  • MaDerer
  • 23 сентября 2019, 16:57
0
Эта «плохая идея» уже более полугода нормально работает. Сперва схема была собрана на NodeMCU и запитывал через пины 3V3 и GND, сейчас на ESP12.
+
avatar
  • MaDerer
  • 23 сентября 2019, 01:06
0
Это по даташиту. А по факту esp нормально запитывается и работает от 18650.
+
avatar
  • CuMr
  • 23 сентября 2019, 02:59
0
А вот за это руки оторвать. По самую шею.
+
avatar
  • Samaron
  • 22 сентября 2019, 14:50
0
Нормальный LDO денег больше стоит, а на этот в даташите пишут
Quiescent Current AMS1117-3.3 5-11 mA,
+
avatar
  • CuMr
  • 22 сентября 2019, 17:09
+2
XC6206 стоит 3 цента ($1.35@50pcs), собственное потребление 6мкА. И это скорее всего левая 6206, т.к. у настоящей в даташите заявлено 1мкА.
+
avatar
  • UWU
  • 22 сентября 2019, 18:46
0
XC6206 стоит 3 цента ($1.35@50pcs)
Какие три цента??? Это ещё надо постараться найти по такой дорогой цене. Вот реальная цена за XC6206:
+
avatar
  • CuMr
  • 22 сентября 2019, 19:06
0
да, точно. это я последний раз на 3,0В их брал… а на 3,3 они и правда сильно дешевле
+
avatar
-2
Слать безтреком нужную вещь, за которую уплачные настоящие деньги — не очень хорошее развлечение.
+
avatar
  • rx3apf
  • 22 сентября 2019, 22:47
+3
Она (XC6206 с ali) не то чтобы совсем «левая», но другого производителя (на lcsc.com есть даташиты на ее два варианта, с указанием производителя), и у них да, потребление без нагрузки где-то 6 uA, о чем честно написано в даташите. Но, что радует, в отличии от продукции Torex, нет резкого подскока потребления при входном вблизи выходного. Ну и много дешевле.
+
avatar
  • CuMr
  • 23 сентября 2019, 01:00
0
о, а вот это крайне полезно, даже не возникла мысль что может быть другой производитель… спасибо.
+
avatar
  • alex323
  • 22 сентября 2019, 11:01
+5
А вот всякие ESP8266, ESP32, STM32 часто глючат, дохнут и вообще гораздо более нежные девайсы.
Ох не знаю… Насчет ESP8266 и ESP32 ничего не скажу, а STM32 у меня ни один не сдох и не заглючил. В том числе работая в промышленном оборудовании целыми днями.
+
avatar
  • UWU
  • 22 сентября 2019, 11:07
0
STM32 у меня ни один не сдох и не заглючил. В том числе работая в промышленном оборудовании целыми днями
Это потому-то их никто руками не трогает :) Простой пример из жизни, программатор для Atmel практически не убиваем. А программаторы для STM32, ST-Link дохнут просто как мухи, из-за того, что китайская версия не содержит защитных цепей для контроллера от статики. Обычная статика жгёт STM32 просто влёт.
+
avatar
  • Lex1981
  • 22 сентября 2019, 11:16
+3
Может мне пока везет, но в рабочем состоянии не раз ESP32 руками трогал. Ничего пока не сгорело.
+
avatar
  • UWU
  • 22 сентября 2019, 11:19
0
ESP не так сильно статику боятся как STM32. Но у них болезнь — это зависания. Именно поэтому и делаются подтягивания ног и прочее.
+
avatar
  • bulyga
  • 22 сентября 2019, 13:14
+18
Сам проектировал, паял и писал программу для метеостанции на ESP8266, месяцами работает без зависания, также ещё часы есть та том же чипе с синхоронизацией времени по SMTP, тоже работают практически без выключения и ничего не виснет. Что я делаю не так? Есть другие поделки и на ESP, и на STM32, и на Атмеге: если без ошибок спроектировать схему и написать прошивку работать будет надёжно.
PS Выбор контроллера, я считаю, во многом определеется привычкой. Архитектуре AVR уже четверть века. Несомненным преимуществом контроллеров ATmega является проста, существует огромное кол-во обучающего материала, порог вхождения достаточно низкий. А использование абстракций платформы Arduino опускает его практически на детский уровень (в буквальном смысле дети могут писать программы).
STM32 и ESP это чипы другого поколения: более сложные но и более мощные и гибкие, но их уже нужно «уметь правильно готовить». (в этом плане, Arduino, в обмен на простоту, обычно приносит в жертву гибкость и оптимальность решений.) Это конечно не повод вычёркивать ATmeg-и из своих проектов, очень много простых задач, которые успешно ими решаются.
С Arduino, я считаю, можно стартовать, но если тема программирования МК «зацепила», засиживаться на этой платформе не стоит.
+
avatar
  • UWU
  • 22 сентября 2019, 13:23
-4
тоже работают практически без выключения и ничего не виснет. Что я делаю не так?
Советую ознакомиться с отзывами других юзеров ESP8266. Не у всех так гладко с ESP8266. Очень много негатива.

В этом плане, Arduino, в обмен за простоту, забирает гибкость.
Насчёт гибкости утверждение ну очень спорное.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:25
+20
отзывами других юзеров
очень большой процент этих юзеров страдает нижней диспозицией верхних конечностей, зачем с ними ознакамливаться?
+
avatar
  • ssurneed
  • 22 сентября 2019, 14:34
+6
У меня тоже esp8266 работает уже несколько лет в часах ни разу не повисло. С мая 2017 года
m.habr.com/ru/post/404075/
И у друга такие же часы работают

Вы хоть представляете какой тираж у esp8266?
Почти все умные розетки на этом чипе
+
avatar
  • Zynq
  • 22 сентября 2019, 11:26
+2
как раз слет прошивки на амтельском — обычное явление. А вот убитых ст-линков не видел (три на работе отдельных и штук 5 китов с ним распаянным
+
avatar
  • UWU
  • 22 сентября 2019, 11:27
-1
Значит статики в помещении мало. Повезло.
+
avatar
  • Zynq
  • 22 сентября 2019, 11:32
+1
статики очень много, даже когда с коллегами здороваюсь бывает искра проскакивает от рук. Но ст линки у нас не китайские это раз, и есть понимание того, как их включать, что сначала земли, а потом сигнальные.
+
avatar
  • UWU
  • 22 сентября 2019, 11:34
+2
Не китайские ST-Link имеют цепи защиты от статики. Я же сказал, что от статики горят именно китайские ST-Link.
+
avatar
  • Zynq
  • 22 сентября 2019, 11:41
+1
да я больше не за стлинки, а вообще за надежность стм. У нас большие партии (десятки тысяч) и устройства эти — сетевые с конденсаторным БП, то есть без развязки от сети. И никакой «глючности и ненадежности» не наблюдаем
+
avatar
  • UWU
  • 22 сентября 2019, 11:49
+1
И никакой «глючности и ненадежности» не наблюдаем
Повторю ещё раз. Проблема STM32 не в стабильности и надёжности, а в отсутствии защиты от статики. При промышленном производстве это не существенно, а для домашних экспериментов очень даже существенно.
+
avatar
  • Zynq
  • 22 сентября 2019, 11:52
+1
какой «еще раз»? Все что вы написали это
А вот всякие ESP8266, ESP32, STM32 часто глючат, дохнут
+
avatar
  • UWU
  • 22 сентября 2019, 11:55
0
А позднее я уточнил, что ESP — глючат, а STM32 — дохнут. Не нужно придираться к конкретному предложению.
+
avatar
+1
Мыши кололись, плакали, но продолжали есть кактус.
Проблема ST-Link давным давно известна и уже много лет как решена, для сложных условий эксплуатации производитель настоятельно рекомендует использовать ISOL версию.
+
avatar
  • Blambik
  • 26 сентября 2019, 19:40
+1
Проблема STM32 не в стабильности и надёжности, а в отсутствии защиты от статики.
Защита от статики там присутствует, читаем спеку.
а для домашних экспериментов очень даже существенно.
Может нужно дома что то изменить? а не валить на контроллер, и учиться работать с микропроцессорной техникой. Я за свои 25+ работой с электроникой не припомню, что бы что то статикой прибил.
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:56
+3
Программаторы китайские st-link действительно дохнут. Однако можно купить нормальный китайский j-link и забыть про эти проблемы. И заодно поиметь плюшки j-link
+
avatar
  • UWU
  • 22 сентября 2019, 13:01
+2
А можно купить китайский ST-Link в пять раз дешевле j-link и спаять к нему недостающую защиту от статики.
+
avatar
  • ssurneed
  • 22 сентября 2019, 13:05
0
Можно, но как же плюшки jlink?
Например rtt.
Кроме того jlink подходит для многих микроконтроллеров
+
avatar
  • UWU
  • 22 сентября 2019, 13:09
0
Можно, но как же плюшки jlink?
Неоправданно завышенная цена этих плюшек.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:24
0
на 400 рублей?
+
avatar
  • UWU
  • 22 сентября 2019, 13:30
0
на 400 рублей?
Пятикратная переплата.
+
avatar
  • ssurneed
  • 22 сентября 2019, 14:12
+1
Так 5 раз же сгорит st-link;)
+
avatar
  • CuMr
  • 22 сентября 2019, 17:14
-1
… и перешить этот стлинк в жлинк-об.
+
avatar
  • ssurneed
  • 22 сентября 2019, 17:22
0
Я пробовал, не вышло
+
avatar
  • CuMr
  • 22 сентября 2019, 17:24
0
adelectronics.ru/2016/11/20/%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0-st-link-%D0%B2-j-link/
хотя я в итоге на пилюле заменил проц на 072 — уж больно удобно с уартом в одном флаконе…
+
avatar
  • ssurneed
  • 22 сентября 2019, 17:34
0
Ага, именно по этой статье и не вышло.
+
avatar
  • CuMr
  • 22 сентября 2019, 17:38
0
Странно. Именно по этой статье у меня и получилось…
+
avatar
  • kalobyte
  • 22 сентября 2019, 19:05
+2
я китайский жлинк купил за 30 евров где-то
там все защиты есть и софтом он опознается и обновляется

зачем что-то напаивать на китайский ст линк, если можно купить нормальный 1 раз
+
avatar
  • ssurneed
  • 23 сентября 2019, 10:48
0
не знаю, но людям нравится видимо
+
avatar
  • CuMr
  • 22 сентября 2019, 17:12
+1
Постоянно лапаю стм32 в макетках — еще ни один не сдох. И это при том, что у меня два кота которые любят во время работы запрыгнуть на колени/стол и походить-улечься прям на столе, на котором эти самые макетки с «нежными» стмками лапаются руками.
+
avatar
  • wwest
  • 22 сентября 2019, 19:23
0
Коты не аргумент.Они чуют электрические поля и обходят их.Вы хоть раз видели чтобы кота током стукнуло?
Я видел как они меж сеткой эл проводов под током гуляют обходя их и не зацепив ни один!
+
avatar
  • CuMr
  • 23 сентября 2019, 01:02
0
Так речь ведь о статике. А зимой в отсутствие увлажнителя…
+
avatar
  • vismyk
  • 23 сентября 2019, 05:22
+9
Вы хоть раз видели чтобы кота током стукнуло
Видели. ;)
+
avatar
+3
У моего друга кот тоже стал обходить электрические поля, правда только после того как чуть не сдох при жевании проводов сетевого удлинителя — шандарахнуло так, что выбило коту два зуба и кусок верхней губы сожгло. Две недели его потом с пипетки кормили, т.к. поначалу самостоятельно не мог питаться.
+
avatar
  • Lex1981
  • 22 сентября 2019, 11:12
0
В проекте ka-radio остается много незадействованных ног, «висят в воздухе» и все работает.
Хотя заметил, что от прикосновения к проводу может зависнуть. Возможно та самая статика влият. Но для радио это не критично, лишь бы не сгорело.
+
avatar
  • UWU
  • 22 сентября 2019, 11:15
0
В проекте ka-radio остается много незадействованных ног, «висят в воздухе» и все работает.
Это зависит от конкретной платы. Каждая плата глючит уникально. Но обычно висящие ноги приводят к проблемам когда активно используется WiFi.
+
avatar
  • Knopaleo
  • 22 сентября 2019, 13:25
0
Это не статика. В ESP32 10 сенсорных входов.
+
avatar
  • MiG
  • 22 сентября 2019, 21:48
+3
Так теперь почти все «программисты» не любят заморачиваться над оптимизацией кода. Смотрю хотя бы по играм, раньше игрушкам с приличной физикой и графикой вполне хватало двухядерного компа с 2 Гиг оппертивной памяти. А на сегодня чуть просто покрасивше игрушка, с той же физикой, но нужен топовый 8-ми ядерный комп, 16Гиг опперативной памяти и чертизнает какая видео карта. Да видимо разрабы железяк наверное еще и приплачивают ррограммистам, чтоб они свой код никак не оптимизировали — в итоге всем хорошо, кроме конечного потребителя )))
+
avatar
+2
Почитайте на досуге интервью с разработчиками игр или книги про создание современных игр. Бизнес делает все, чтобы выкатить супер-графику + игру побыстрее и продать желательно под Рождество. Оптимизация — это ненужные затраты, и, пока сообщество бочку не катит, никто не шевелится.
Ну, и современные игры гораздо более сложные технически, чем предшественники, программистам есть чем заняться кроме оптимизаций.
+
avatar
  • rexen
  • 24 сентября 2019, 21:31
+1
Нет, тут всё гораздо проще. И никакого заговора. Оглянитесь вокруг — много где подобное прослеживается. Компы, электроника, телепередачи, книги, музыка, еда…
Это чисто рыночная «фишка»: то, что дешевле — то и уходит в массы.
Дешевле купить 8-ядерный комп, чем оплачивать работу квалифицированного программиста.
Дешевле плодить бесконечные ремейки франшиз, чем творить новые шедевры — кино, песни.
Дешевле замутить тортик из пальмового масла — пусть полгода на прилавке стоит.
И т.д.
+
avatar
  • Zynq
  • 24 сентября 2019, 21:52
0
ну так если действительно железо сильно опережает софт, а важнейшим свойством продукта сейчас является time to market — то что в этом плохого? Будет AI писать проги — тогда другое дело. Ведь никто не стонет, что одежду сейчас шьют отнюдь не в ручном режиме на каждого, мебель не делает плотник и тп — иначе так бы и были в средневековье.
+
avatar
  • drpepper
  • 22 сентября 2019, 11:39
0
Всё верно, ближе к $10 уже можно рассчитывать на контроллер батареи и microSD-слот, распаянные на той же плате.
+
avatar
  • tykhon
  • 22 сентября 2019, 12:52
0
Мой показывает 53 градуса, что правдоподобно.
+
avatar
  • Samaron
  • 22 сентября 2019, 13:39
+1
И показания меняются? если в холодильник например положить на 2 минуты?
+
avatar
  • tykhon
  • 22 сентября 2019, 14:08
+1
Нагреть мне было проше. Нагрел — все равно 53.33 показывает. Т.е. сырое значение сенсора — 128. Похоже действительно датчика нет. Увы. Текст сейчас поправлю.
+
avatar
  • darkbyte
  • 22 сентября 2019, 20:06
+3
Покупал недавно на али платки esp32-nodemcu как в обзоре, только дешевле. И не мог понять, почему при подаче питания сильно грелся линейный регулятор на входе, пока не подал 3.3В напрямую. Оказалось китайцы для удешевления вместо тантала поставили какую-то хрень перекрашенную под тантал, и работала она как резистор с не очень большим сопротивлением. В итоге каждую плату пришлось сначала подключать к 3.3В, ждать несколько секунд, пока обуглится «тантал», а потом можно уже пользоваться.
+
avatar
  • Zhenya88
  • 22 сентября 2019, 20:45
0
+
avatar
  • fundorin
  • 22 сентября 2019, 20:59
+2
Это тоже дорого. Тут дешевле — aliexpress.com/item/32800930387.html
+
avatar
  • Lex1981
  • 22 сентября 2019, 10:34
0
Я познакомился с esp32 благодаря Ka-Radio32. С Arduino поигрался с датчиком CO и на время забросил, дешевый датчик фигню всякую выдает. Но позже на Arduino собрал «Ambilight» для телевизора (использую при просмотре фильмов с компа), где Arduino живет уже года 3.
Но я толком ничего сам не программировал, все по инструкциям.
+
avatar
  • alex323
  • 22 сентября 2019, 11:03
+9
esp32 — совершенно новое поколение микроконтроллеров, пришедшее на смену Ардуино.
Позанудствую — пришло на смену ESP8266, а не Ардуино.
+
avatar
  • Z2K
  • 22 сентября 2019, 11:29
0
«пришло на смену ESP8266» — скорее дополнило линию ESP8266. esp32 — двухядерний чип, но что-то я ни разу не встречал проект с параллельним исполнением кода на обоих процессорах.
+
avatar
  • drpepper
  • 22 сентября 2019, 11:37
0
Скорее всего потому, что такие проекты пишут с использованием ESP-IDF.
+
avatar
  • UWU
  • 22 сентября 2019, 11:51
0
esp32 — двухядерний чип, но что-то я ни разу не встречал проект с параллельним исполнением кода на обоих процессорах.
Да потому что мощность esp32 избыточна для большинства существующих проектов.
+
avatar
  • Z2K
  • 22 сентября 2019, 11:54
0
И расспараллеливание процессов совсем другой уровень программирования. Или кто-то будет виртуализацию на нем делать :)
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:07
0
Там freertos сама парралелит
+
avatar
  • Zynq
  • 22 сентября 2019, 12:12
+2
само по себе ничего не параллелится. Какой код напишешь — так и будет. А фриртос — обычный вытесняющий планировщик по таймеру и прерываниям железа.
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:35
0
Процессы парралелит.
Как быстрее что посчитать тут уж самому решать
+
avatar
  • Zynq
  • 22 сентября 2019, 12:39
+2
ничего оно не параллелит сама вообще. Дает кванты времени каждому псевдопотоку и все. Многоядерные не поддерживает. Иначе — я вообще могу назвать обработчик любого прерывания «параллельным программированием»
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:45
+2
Многоядерный esp32 поддерживает. Соответственно таски раскидывает. Но можно и самому задавать на каком ядре какой таск
+
avatar
  • Zynq
  • 22 сентября 2019, 12:47
0
и правда, завезли SMP. OK, спасибо за инфу
+
avatar
  • Samaron
  • 22 сентября 2019, 12:09
0
Уже есть несколько операционок на этот чип — Mongoose OS, RTOS, RIOT-OS, возможно какая то из них уже использует оба ядра.
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:36
+1
Даже 3х ядерный. Там ulp сопроцессор есть, который тоже можно (а иногда и нужно) программировать
+
avatar
  • Zhmak
  • 25 сентября 2019, 22:05
0
А разве там не одно ядро под писанину пользователя, а второе обслуживает беспроводные интерфейсы?
+
avatar
+1
Исправьте, пожалуйста: кондер на 0,1мкФ (10^5 pF = 100 000 pF = 100nF = 0.1uF)
Не занудствую, просто глаз зацепился… )))
За обзор — спасибо! Присмотрюсь получше. Нужно будет поискать реализацию на ней поделок для Apple Home Kit. Для предыдущей ESP 8266 давно есть.
У меня «трудятся» кастомные пошивки для Sonoff-а в HomeKit отсюда.
+
avatar
  • 2000vif
  • 22 сентября 2019, 13:38
+8
На конденсаторе 105, это значит = 10*10^5 = 1 000 000 = 1мкФ
Не занудство, просто глаз зацепился. :)
+
avatar
  • CuMr
  • 22 сентября 2019, 17:18
0
удалено как ошибочное
+
avatar
  • Z2K
  • 22 сентября 2019, 11:46
+4
«в основном для создания отностельно серьезных подлок,» — теперь понятно зачем Вам — «сравнительный обзор четырех датчиков СО2. ». На esp32 подводные лодки получаются значительно более серйозные чем на ардуино.
+
avatar
  • wwest
  • 22 сентября 2019, 19:26
0
Датчикам СО2 на подлодке самое место.
А ещё О2 и водорода. И быстродействие жизненно необходимо.
А на ардуино производительности уже даже для паяльника не хватает для отработки формул.На лодке им делать нечего-утонет.
+
avatar
  • kven
  • 22 сентября 2019, 11:50
+2
это продолжение esp8266, а не Ардуино.
+
avatar
  • Z2K
  • 22 сентября 2019, 11:58
0
«Архитектура — у esp — 32 бита, у Ардуино — 8.» — спасибо кеп.
+
avatar
  • Z2K
  • 22 сентября 2019, 12:02
+3
И зачем сравнивать конкретный МК с каким-то «Ардуино» — ардуино условно говоря платформа — а конкретные реализации есть с некоторыми разными параметрами.
+
avatar
  • kven
  • 22 сентября 2019, 12:46
+2
подразумевается, что этот есп32 переплевывает все ардуины разом )
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:57
0
Даже Intel Galileo?
+
avatar
  • kven
  • 22 сентября 2019, 13:13
+3
им кто-то пользуется?
+
avatar
+4
конская цена, на алибабахе в три раза дешевле. Но понять и простить можно, т.к. автор получил их даром для рекламы.
+
avatar
  • tykhon
  • 22 сентября 2019, 12:48
+8
Соорудил схему, накатал скетч. Исправил, кстати, некоторые ошибки кода, который блуждает по инету. Выложил откомментированные исходники для свободного доступа. Видео очень показательное снял, фоточки. Научил как исправить багу с прошивкой.
А теперь поймите и простите меня.
+
avatar
0
Поэтому и простили, что не просто написали «во какая классная штука задёшево» :)
Кстати, вы уверены, что там присутствует датчик Холла (измерение магнитного поля)? Какой смысл в его существовании там, или просто, до кучи напихали, а дальше сами -всё сами?
+
avatar
  • tykhon
  • 22 сентября 2019, 13:17
0
Датчик Холла присутствует, проверял. Зачем он там — я тоже не понял, потому что даже для всяких тахометров его имеет смысл делать выносным. Но поставили и поставили, не мешает.
+
avatar
  • Z2K
  • 22 сентября 2019, 19:20
+5
Датчик вскрытия корпуса прибора или перемещения прибора. При изменении напряженности м.п. от магнита котрый крепится к крышке корпуса МК фиксирует это событие. Аппаратно выключить, удалить датчик нельзя.
+
avatar
  • tykhon
  • 22 сентября 2019, 19:36
0
Превосходная идея!
+
avatar
  • ssurneed
  • 22 сентября 2019, 21:01
0
Аппаратно достаточно выключить питание
+
avatar
  • Z2K
  • 22 сентября 2019, 21:17
0
Если для ответственных применений то после этого придется вызывать сервисную службу, или хотя бы пароль просить если срочно надо. Вкл/выкл и так 100500 раз пока не сдохнет не получится.
+
avatar
  • ssurneed
  • 22 сентября 2019, 21:25
0
Да просто питание снять и разбирай. Не очень понимаю о чем вы
+
avatar
  • Z2K
  • 22 сентября 2019, 21:39
0
Разобрать всегда можно, только после разборки или снятия питания работать не будеть.
+
avatar
  • ssurneed
  • 22 сентября 2019, 22:47
+1
То есть устройство не может выдержать сбой по питанию?
Ведь они везде бывают
+
avatar
  • Z2K
  • 22 сентября 2019, 23:47
0
В ДЦ, ПОС и т.п. посколько там есть СБП, сбоев по питанию не должно быть и практически не бывает. При современных мощностях потребления электроники организовать и реализовать СБП нет проблем ни финансово ни технически.
+
avatar
  • ssurneed
  • 23 сентября 2019, 00:45
0
Очень узконаправленная защита, для бытовых устройств применение сомнительно.
По крайней мере я такие устройства не разрабатывал и вряд ли хочу)
+
avatar
  • Defender
  • 22 сентября 2019, 23:47
+2
Удаление, хранящейся на устройстве информации, в случае попытки физического доступа к носителю этой информации — это такое преднамеренное поведение устройства. И отключение питания устройство воспринимает как такую попытку.
+
avatar
  • Z2K
  • 22 сентября 2019, 23:53
0
Инфо зашифрованная (благо есть аппаратные реализации) даже уничтожать в принципе не очень надо. Просто ключи только в ОП. И это всего лишь счетчик ресурсов.
+
avatar
+2
Не вижу никаких причин не переходить сразу на ARM.
+
avatar
  • ssurneed
  • 22 сентября 2019, 12:58
0
А где здесь АРМ?
+
avatar
  • UWU
  • 22 сентября 2019, 12:59
0
Не вижу никаких причин не переходить сразу на ARM.
А что это за процессор такой, ARM? Я что-то не слышал о таком.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:01
0
Не нужно придираться к конкретному предложению
:-D
И это при том, что все поняли, речь о ядре АРМ в его бесчисленных исполнениях
+
avatar
  • UWU
  • 22 сентября 2019, 13:05
-4
И это при том, что все поняли, речь о ядре АРМ в его бесчисленных исполнениях
Чел написал глупость, потому как нельзя перейти на абстрактное ядро. Можно перейти только на реальный физически существуюший девайс.
+
avatar
+5
Наоборот. Ты переходишь на архитектуру, а потом уже к каждому конкретному проекту выбираешь какой-то конкретный подходящий девайс.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:12
+2
никакую он не глупость сказал. Речь о том, что ядра АРМ у всех одинаковы, М0… М7 — это покупное ядро. Есть отличия периферии и все. Речь о том, что не смысла заморачиваться с закрытыми сторонними ядрами одной фирмы.
+
avatar
  • UWU
  • 22 сентября 2019, 13:13
-3
Архитектура видна только на уровне ассемблера. На уровне языка высокого уровня нет никакой разницы, что там внутри: ARM или x86. Пожалуй только разрядность процессора заметна, и то только для тех, кто знает куда смотреть.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:16
+2
сказки. А попробуйте ка
void foo (uint8_t *ptr) {
*ptr =;
}
int32_t var;
foo ((uint8_t *)&var + 1);
И на М4 все пройдет на ура, а на M0 — hard fault
И такой код очень часто приходится писать в условиях сетевых протоколов побайтовых и т д.
А стеки задач для, например UCOS — надо выравнивать по 8 байтовой границе, и это тоже особенность архитектуры.И это надо знать, если претендуешь на что-то, особенно давать советы и говорить куда смотреть
+
avatar
  • UWU
  • 22 сентября 2019, 13:28
-3
сказки
Ну и причём тут архитектура, и в частности ARM? Это локальный косяк в реализации M0.
+
avatar
  • Zynq
  • 22 сентября 2019, 13:30
+3
это не косяк. Это особенность архитектуры именно. Документированная. Дальнейший спор прекращаю. Если вы не понимаете, что М0 и М4 например — разные архитектуры вообще — не буду терять времени.
• Unaligned memory accesses. In the Cortex-M0, all the data transfer operations must be aligned. This means a word-size data transfer must have an address value divisible by 4, and half-word data transfer must occur at even addresses. The Cortex-M3 processor allows many memory access instructions to generate unaligned transfers. On the Cortex-M0 processor, access of unaligned data has to be carried out by multiple instructions.
+
avatar
  • UWU
  • 22 сентября 2019, 13:35
-3
Это документированный косяк. Разработчик тупо забил на работу с отдельными байтами, Причём тут архитектура ARM в упор не понимаю.
+
avatar
+3
Любая архитектура, язык программирования, среда разработки или фреймворк — это набор документированных косяков. Если вы не понимаете, зачем даёте советы?
+
avatar
  • Z2K
  • 22 сентября 2019, 20:22
0
«это набор документированных косяков.» — недокументированных не бывает?
+
avatar
  • Zynq
  • 22 сентября 2019, 21:10
+1
Cortex M0 — это самое компактное из всех ядер у них. Многих вещей нет просто из экономии площади чипа. Так можно по 51- семейству пройтись, которое с позиций наших дней вообще недоразумение — 128 байт озу, все остально — адресуется криво через DPTR. Нет стекового фрейма. жалкие 32 регистра, побитые на 4 банки. Мрак. И тем не менее — наверное до сих пор 80 % промышленной электроники работают на 51 ядре и как-то оно не спешит уходить. Просто никакие это не косяки.
+
avatar
  • zztop68
  • 22 сентября 2019, 23:54
+3
Это документированный косяк.
Это архитектурная особенность, а не «косяк». Присуща RISC-ам.
Причём тут архитектура ARM в упор не понимаю.
Эта особенность свойственна некоторым архитектурам от ARM Holdings, причём не только микроконтроллерным, но и «взрослым».

Такое, кстати, было и у легендарного DEC Alpha.

Google: «Unaligned Memory Access».
+
avatar
  • Knopaleo
  • 22 сентября 2019, 13:14
0
Зачем так дорого? Три чипа, три монтажных платы и один UART значительно дешевле.
ru.aliexpress.com/i/32868241470.html
ru.aliexpress.com/i/32982100489.html
+
avatar
  • bretin
  • 22 сентября 2019, 13:19
+2
Про пыль. Раньше прокачивали допустим 10 м куб воздуха через прибор в котором стоял адсорбент который задерживал к примеру 99% частиц определенного диаметра. Затем этот адсорбент взвешивали /до и после/ и получали кол-во пыли в граммах на 1 м куб воэдуха. Также можно замерять радиоактивность пыли в воздухе
+
avatar
  • Siroc-co
  • 22 сентября 2019, 14:11
0
А я про датчики пыли хотел бы поговорить. Они вам зачем? Для чего используете? Ими можно померить пыль вылетающую из фильтра пылесоса? Или, например, оценить пыльность на улице и решить открыть или не открывать форточку?
+
avatar
  • tykhon
  • 22 сентября 2019, 14:18
0
Да, все это возможно. У sds забор воздуха из штуцера, к которому можно легко подключить трубочку, через которую забирать воздух откуда угодно. Датчики пока использую для того, чтобы отследить наиболее «пыльные» события и места дома, оценить качество пылесошения. У ребенка аллергия на пыль, надо вникнуть в тему. Потом возможно буду запускать робот пылесос по команде датчиков.
+
avatar
  • Z2K
  • 22 сентября 2019, 19:47
0
А какая долговечность, стабильность результатов и точность измерения этих датчиков.
+
avatar
  • tykhon
  • 22 сентября 2019, 21:07
0
Набираю статистику пока. Долговечность обещают два года при постоянной работе. Но у меня 1/6 времени работают.
+
avatar
  • wwest
  • 22 сентября 2019, 19:32
0
Тестирование фильтров и пылесосов.Управление воздухоочистителями.Автоматика воздухообмена и очистки воздуха, изоляции ядерных бункеров при ядерных ударах.
+
avatar
+3
Module Hardware…
...
Free memory: 313228 (109%)

Это как? :)
+
avatar
+4
Выбросьте вы уже этот Arduino IDE, поставьте нормальную мультиконтроллерную IDE с современным редактором.
Я про Atom + PlatformIO. Работает быстро, подсветка кода, автообновление библиотек со своим пакетным менеджером, подсказки, прошивает огромное количество микроконтроллеров, есть дебаг (нужно купить отдельную плату для ESP32).
+
avatar
  • Zynq
  • 22 сентября 2019, 21:12
+1
Есть вариант гораздо продвинутее — Visual Studio + VisualGDB
+
avatar
0
мне кажется сейчас ничего кроме Visual Studio и не поддерживается
+
avatar
  • Zynq
  • 22 сентября 2019, 23:43
0
не совсем понял (вернее вообще не понял) вашей мысли. В смысле разрабочиками поддерживается?
+
avatar
0
ну я про то, что новая версия там только поверх Visual Studio и работает, Atom не поддерживается больше на сколько я понял.
но вообще да, поражает, вроде есть интернет, куча людей занимается, а всё равно мается с этим дефолтным текстовым редактором
+
avatar
  • Zynq
  • 23 сентября 2019, 23:19
+1
версия чего? Я ни атом, ни платформ ио никогда не пользовал, не в курсе. Погуглил — не понял зачем оно нужно.
+
avatar
0
а, я не правильно прочитал тред. я про то, что новая версия platform io поддерживает только Visual Studio и строится вокруг неё. Зачем нужно? Visual Studio в голом виде не заточена под ардуины и т.д., понятия не имеет про пакеты ардуины, что есть там как-то репозиторий, что их можно себе выкачивать и добавлять в проект. Я уже не говорю что не надо ничего качать руками, типа avr либ или компилятора, учить Visual Studio компилировать проект для ардуины, есп и т.д., заливать. В общем всё для комфортной работы сразу
+
avatar
  • Zynq
  • 24 сентября 2019, 21:17
0
VisualGDB решает.
Дополнительная информация




+
avatar
0
ясно, но видимо библиотеки ардуиновские уже придётся качать и добавлять руками
+
avatar
  • Zynq
  • 24 сентября 2019, 21:53
0
да ничего там не надо, кнопку жмешь — он и SDK скачает, и компилер, и примеры.
+
avatar
0
а если библиотека дисплея какого? а ардуино есть что-то вроде репозитория библиотек под разные модули, это отдельная система от sdk
+
avatar
  • alex_75
  • 29 сентября 2019, 21:31
0
Сжальтесь над убогим, подскажите ИДЕ которая структуру проекта умеет рисовать в виде дерева. Чтобы было видно, что откуда запускается.
Замаялся я уже по инклюдам елозить.
Эклипс показывает какие то моменты, но не наглядно. И idf не учитывает. Или настроить надо?
Интересует именно прошаренный текстовый редактор.
В качестве сборщика/компилятора мне и msys'a хватает
+
avatar
  • kalobyte
  • 22 сентября 2019, 16:38
-1
есть скомпилить блинк для авр и есп32, то в процентах сколько это будет занимать?
я пробовал для стм32 и получлось очень не в сторону стм32
+
avatar
  • Z2K
  • 22 сентября 2019, 19:32
0
Для таких задач если считать в байтах, а не в словах то иначе быть не может.
+
avatar
  • kalobyte
  • 22 сентября 2019, 21:19
0
надо считать в процентах
+
avatar
  • Z2K
  • 22 сентября 2019, 23:49
0
В процентах от чего? Программа в МК занимает N байт — сколько процентов?
+
avatar
  • kalobyte
  • 23 сентября 2019, 04:45
0
об объема пзу
компилятор же показывает эти проценты
+
avatar
0
Всем привет. Может кто помочь с реализацией простого проекта на ардуино ( часы с двумя датчиками температуры).
Сам не в состоянии сделать, убил кучу времени, так и не разобрался :( из железа ( ардуино нано, два датчика ds18b20, микросхема часов ds3231, дисплей oled 1.3, маленькая плата понижающая напряжение).
Буду безумно благодарен, если кто то откликнется, более детально расскажу, что я бы хотел реализовать
+
avatar
  • CuMr
  • 22 сентября 2019, 17:22
+2
Сколько денег?
+
avatar
  • ssurneed
  • 22 сентября 2019, 17:32
+1
не унесёшь)
+
avatar
  • Z2K
  • 22 сентября 2019, 19:39
0
Навалом
+
avatar
  • Zhenya88
  • 22 сентября 2019, 18:30
0
+
avatar
0
У меня другой дисплей :( oled 1.3
+
avatar
  • tykhon
  • 22 сентября 2019, 18:46
0
А вот oled для часов — не очень хороший вариант. Выгорает за год-два.
+
avatar
  • kalobyte
  • 22 сентября 2019, 19:07
0
flprog.ru
при помощи этого реализуется за 5 минут без строчки кода

насчет олед не знаю, вроде на форуме кто-то делал модули под разные индикаторы
+
avatar
  • Z2K
  • 22 сентября 2019, 19:43
0
А чем собсвенно Вас не устраивают сотни, если не тысячи вариантов реализаций подобных устройств? Жалко труд и интеллектуальные усилия людей, которые делают 100500 реализацию одного и того же.
+
avatar
0
Внешний вид
+
avatar
0

Это замена штатных часов, которые не удается восстановить. Купленный экран замечательно подходит вместо штатных. Я же Вас не заставляю помогать.
+
avatar
  • Z2K
  • 22 сентября 2019, 20:26
0
Понятно, кому-то вышивка ниткой мулине, кому-то цифры в готическом стиле. Красота, к ней стремятся. Картины маслом стоят десятки миллионов.
+
avatar
  • Zhenya88
  • 22 сентября 2019, 17:21
0
Ребят, подскажите, как проще всего простенькую веб- страницу сделать, для ввода данных в esp32. Может есть какие-то онлайн редакторы или т.п. для создания из блоков, а не через изучение web.
Кстати, сейчас удобно несложные вещи через Xod программировать, порог вхождения низкий и результат наглядно видно+отладка.
+
avatar
  • Irodenko
  • 22 сентября 2019, 20:10
0
Это aliexpress.com/item/33020838035.html тоже самое? цена вроде поменьше
+
avatar
  • MiG
  • 22 сентября 2019, 21:37
+2
выводы esp на 3,3 вольта, а у Ардуины 5.
У ардуины UNO точно есть вывод, как на 5V так и на 3.3V. Никаких там резисторов не нужно
P.S. Ваш код какой-то тяжелый, не осилил и 10-ой части (
+
avatar
  • fikus
  • 22 сентября 2019, 21:59
-3
Не одного микрофарада, а одной микрофарады.
+
avatar
  • Z2K
  • 22 сентября 2019, 22:22
+3
Как сказать. Единица измерения названа в честь ученого-физика Фарадея — это мужчина. Если считать — фарада — единица измерения — то она, но тогда и Вольт и Ампер должны быть женского рода. А если считать как фамилии ученых — то Кюри должна быть она, а один Фарадей, Вольт и Ампер должен быть он. ИМХО.
+
avatar
  • kven
  • 23 сентября 2019, 09:11
+1
чтобы не разводить спор на пустом месте, процитирую Вики:
«Фара́д (русское обозначение: Ф; международное обозначение: F; прежнее название — фара́да) — единица измерения электрической ёмкости в Международной системе единиц (СИ), названная в честь английского физика Майкла Фарадея[1].»
+
avatar
+1
Можно ли программировать ulp из среды Ардуино? Сколько оно жрёт при активном ulp и при спящем ulp?
+
avatar
  • al-s
  • 23 сентября 2019, 19:32
+1
Если не смущает, что программировать придётся на ассемблере — берите, изучайте:
ULP coprocessor programming
Programming ULP coprocessor using C macros
Слегка модифицированный пример из документации
#include <esp32/ulp.h>

void setup() {
  Serial.begin(115200);
  RTC_SLOW_MEM[16] = 0;
  RTC_SLOW_MEM[17] = 1;
  const ulp_insn_t program[] = {
      I_MOVI(R3, 16),         // R3 <- 16
      I_LD(R0, R3, 0),        // R0 <- RTC_SLOW_MEM[R3 + 0]
      I_LD(R1, R3, 1),        // R1 <- RTC_SLOW_MEM[R3 + 1]
      I_ADDR(R2, R0, R1),     // R2 <- R0 + R1
      I_ST(R2, R3, 0),        // R2 -> RTC_SLOW_MEM[R3 + 0]
      I_HALT()
  };
  size_t load_addr = 0;
  size_t size = sizeof(program)/sizeof(ulp_insn_t);
  ulp_process_macros_and_load(load_addr, program, &size);
  ulp_set_wakeup_period(0, 500000UL);
  ulp_run(load_addr);
}

void loop() {
  Serial.println(RTC_SLOW_MEM[16] & 0xffff);
  delay(1000);
}


Согласно даташиту, потребление в deep sleep без сопроцессора 10 мкА, с работающим сопроцессором — 150 мкА. Использовать сопроцессор без deep sleep особого смысла нет.
+
avatar
  • Lvenok
  • 23 сентября 2019, 01:49
+1
1. Клевая идея обойти кнопку конденсатором.
2. Мне понравилось как ребята делали генерацию звука на ESP32. Z не знаю на чем еще малогабаритном сделать такое с поддержкой BT и WiFi…
+
avatar
+1
Познавательный обзор, и, довольно грамотный и широкий спектр обсуждения(-без «песочницы»)...-плюсую!
Автору отдельный плюс за юмор:
Заходил я на этот армянский сайт. Там все по-китайски.
...;-)
+
avatar
+2
Приветствую всех! Автору спасибо и +. Есть вопрос: как подружить CJMCU-8128 и ESP32 описанную здесь. Пробовал такой вариант — работает, а как подружить с вышеуказанным — знаний не хватает. Подскажите если есть у кого мысли на эту тему. Заранее спасибо!
+
avatar
  • chmel
  • 23 сентября 2019, 23:20
0
Датчик вроде толковый соответствует моим требованиям, но за два дня ничего готового не нашел.
Если обнаружите решение, то обязательно напишите тут.
+
avatar
  • tykhon
  • 23 сентября 2019, 23:41
0
Вот тут написано, что это набор из трех датчиков: CCS811+SI7021+BMP280. Они просто установлены на одну плату и подключены к одной шине i2c. Т.е. мудрить ничего специфического не надо, просто опрашивать первый, второй и третий, библиотеки отдельно по каждому найти не проблема. Единственная возможная трудность — определить адреса на шине i2c, но для этого есть i2c сканер, который выдает адреса всех найденных устройств. Дальше методом подбора найти какой датчик на каком адресе.

Да, и css811 у меня показывал в основном погоду на марсе. Очухивался только если на него чем-то уж совсем химическим дунуть. Тогда мигом зашкаливал. А так — то потихоньку вверх уплывет. Перегрузишь — снова все чисто. То зависнет на одних показателях. Мутный датчик.
+
avatar
0
Если применительно к ссылке, что я указал — то лично для меня пока это тёмный лес. Поэтому помощи и попросил.
+
avatar
  • tykhon
  • 27 сентября 2019, 14:34
0
У меня ардуино IDE по запросу «CCS811» в менеджере библиотек находит четыре библиотеки. Поставить любую (или все), скомпилировать и залить в контроллер пример из комплекта библиотеки. Проверить, работает ли датчик ccs811. Аналогично с другими двумя датчиками. Потом из трех скриптов собрать один. Слепить пораздельно, чтоб задание переменных было с заданием переменных, настройки блока setup всех трех скриптов тоже вместе, ну в loop чтоб крутились все три кода. Потом написать на муське обзор датчика и рассказ о проделанной работе.
+
avatar
  • bvictor
  • 23 сентября 2019, 10:46
+2
Автор не упомянул, что рассматривает плату разработчика, а не сам модуль ESP32. Плат таких есть несколько вариантов. Например, такой


Здесь больше ног модуля выведено на штырьки — 38, а у автора — 32.
+
avatar
  • tykhon
  • 23 сентября 2019, 12:24
0
36
+
avatar
  • chmel
  • 23 сентября 2019, 23:44
0
Тут ссылка
есть много полезного по измерению качества воздуха.
+
avatar
  • m912
  • 28 сентября 2019, 13:40
+1
степдаун на 3,3 вольта на ams1117

Вы не ошиблись? Ведь ams1117 — линейный стабилизатор, да и дросселя на плате нет…
+
avatar
+1
Заинтересовало уже то, что комментариев море и то, что новое, надо осваивать…