Пользует ли кто WiFi-модули ESP8266 ? Поделитесь впечатлениями.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Эх,коллеги,выручайте!

Настраивал UART через АТ-команды, случайно выставил "рукопожатие" через RTS/CTS. Теперь модуль ни на что не отзывается, и хард резет АТ-командой сделать не могу( Как сбросить эти настройки?

MikSer
Offline
Зарегистрирован: 27.01.2012

Залей дефолтную прошивку.

Casper17
Offline
Зарегистрирован: 21.06.2013

Подскажите пожалуйста, можно ли этим модулям присвоить статический ip в ручную?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Смотря где, в какой прошивке или IDE. 

В SDK есть такая функция и у меня это реализовано.

Casper17
Offline
Зарегистрирован: 21.06.2013

В прошивка которая идёт по умолчанию в модулях. Работать буду с atmega8 в атмел студио.

Araris
Offline
Зарегистрирован: 09.11.2012

Возможность присваивать адрес начинается с версии 0.95.

kotwi
Offline
Зарегистрирован: 17.04.2015

Добрый день!

Подскажите плиз какой модуль лучше взять на алиекспрессе!

Хотел поработать с модулем, но вижу то много модификаций.

Araris
Offline
Зарегистрирован: 09.11.2012

Если нет особых требований к количеству разведенных пинов, посоветую ESP-01.

Если для исследований - ESP-201.

Появились также новые модификации с увеличенным размером памяти, ESD-12 (ESPD-12), WROOMы всякие, но я с ними еще не разбирался.

Здесь http://esp8266.ru/modules-esp8266/ подробнее.

wgaint
Offline
Зарегистрирован: 15.03.2015

Брал такую. Классическую. Похоже на 01. Стандартная схема подключения, ожидаемая реакция на стандартные команды. Работает. Питается от 3,3 леонарды, сигналы напрямую к РХ-ТХ.

http://www.aliexpress.com/item/1Pcs-ESP8266-Serial-WIFI-Wireless-Transce...

 

 

kotwi
Offline
Зарегистрирован: 17.04.2015

Спасибо!

NEGr
Offline
Зарегистрирован: 12.05.2014

Всем добрый день и всех с наступающими праздниками.

Возник вот такой вопрос(задача).

Есть устройство на arduino и esp8266 07. На нем поднят TCP сервер. Прошивка старая 0018000902.

Хочеться сделать переодичную проверку устройства на наличие подключения к сети (как пример перезагрузился роутер). И если его нет делать переподключение устройства к сети.

Как бы это лучше реализовать???

Если переодично дергать AT+CIPSTATUS, то оно не меняеться( роутер включен/ роутер выключен) . делать отправку сообщения и ловить ответ не хочется.

Может у кого есть мысли на этот счет???????

 

Araris
Offline
Зарегистрирован: 09.11.2012

1. AT+CIPSTATUS точно не поможет.

2. "делать отправку сообщения и ловить ответ не хочется" , а ведь придется ))) . Лучше пинга в данной ситуации придумать ничего не удастся.

morgun
Offline
Зарегистрирован: 09.05.2015

Подскажите пожалуйста, можно ли используя этот модуль:

1)Средствами wifi передать этому модулю к примеру число с компьютера.
2)Запрограммировать модуль так, чтобы после того, как он принял это число - он передал его Arduin'e.
3)Собственно запрограммировать Arduin'у, на прием данного числа от этого модуля?

Со стороны это так: нажал на кнопку на компьютере - загорелся светодиод.
(ПК > данный модуль > arduino зажигает нужный светодиод, в зависимости от нажатой кнопки)

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

morgun пишет:

Подскажите пожалуйста, можно ли используя этот модуль:

1)Средствами wifi передать этому модулю к примеру число с компьютера.
2)Запрограммировать модуль так, чтобы после того, как он принял это число - он передал его Arduin'e.
3)Собственно запрограммировать Arduin'у, на прием данного числа от этого модуля?

Со стороны это так: нажал на кнопку на компьютере - загорелся светодиод.
(ПК > данный модуль > arduino зажигает нужный светодиод, в зависимости от нажатой кнопки)

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

 

morgun
Offline
Зарегистрирован: 09.05.2015

Если я правильно понимаю, то нужно установить коннект пк с модулем(одно из них сервер, другое - клиент), и далее AT+CIPSEND отправлять цифру. А в модуле эта цифра будет обрабатываться, и выводить сигнал на нужный OUTPUT? 

Casper17
Offline
Зарегистрирован: 21.06.2013

День добрый форумчане! Есть задумка сделать объеденить все устройсва которые есть дома модулями esp8266 для обмена и сбора информации. Обмен планируется сделать через центральное устройство(малинка или роутер TP-Link MR3020 OpenWRT c php сервером и бд) Центральное устройство будет по времени слать запросы на различные датчики, а те ему отвечать или когда происходит какое-то событие на датчике(устройстве) то оно шлет центральному устройству сообщение. Как можно организовать такой метод обмена данными, если не прибегать к программированию ESP а ограничеться стандартной прошивкой и МК? Первое что приходит в голову это на каждом датчике ESP поднять TCP сервер. Центральное устройство как клиент подключается к датчику шлет запрос, датчик отвечает и центральное устройство отключается от датчика и так ко всем датчика в доме. А центральное устройство когда не опрашивает датчики находится в режиме TCP сервера, что бы если на датчике сработает какое-то событие, что бы этот датчик перешел в режим TCP клиента, подключился к центральному устройству и отправил данные и снова перешел в TCP сервер.. Что-то типо такого)) Направте на путь истиный) Еще как вариант рассматриваю написать отдельную прошивку для ESP через Arduino IDE для этих целей. Но ESP планируется использовать совместно с МК ATmega8 т.к. пока что его хватает для моих устройств))

Araris
Offline
Зарегистрирован: 09.11.2012

Casper17, описанная Вами схема вполне хороша и жизнеспособна. Но, может быть Вам это http://homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/62-besprovodnoj-datchik-na-baze-esp8266-dlya-servisa-narodmon-ru подойдет ?

IKIF
Offline
Зарегистрирован: 06.03.2015

День добрый,
Приобрел esp8266-01 и сейчас осваиваю с Ардоино Уно.
Так же имеются модули :RTC 3231 and Oled LCD Display 0.96''.
Пытался собрать такую схему : 
Время считывается и выводиться на 
LCD и так же через esp8266 , который должен подключаться к домашнему раутеру, наблюдается по web.

Сложности с которыми я столкнулся (не решенные) :

На esp8266 дефолтаная прошивка... Не получается сконфигурировать esp8266 на подключение к дом. роутера и чтобы он при этом как сервер работал.

Так же пытался (без успеха) , чтобы esp8266 управлялся из прописаного кода (конфигурации, setup, init) , ну и так же , чтобы я мог с Serial Monitor давать ему команды и видеть их выполнения в этом же Serial Monitor. Реально ли такое или я загнул ?

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

Заранее благодарю за помощь.

kotwi
Offline
Зарегистрирован: 17.04.2015

Друзья!

Прошу помощи. Начал играться с модулями, да нечаянно установил скорость 11520 вместо 115200. Сейчас и прошить не могу через стандартную прогу, т.к. не коннектится. Дабы соединиться с модулем в терминале задаю кастомную скорость 11520 однако на команды отвечает абракадаброй, при сбросе модуля тоже абракадабра, в конце слова READY не видно, прободвал перебирать скорости. Читал где-то об автоопределении скорости, но не смог ничего сделать. У кого есмть какие идеи? 

Leon010203
Offline
Зарегистрирован: 27.06.2014

Попробуй прошить через прошивальщик от nodeMCU или esp8266_flasher.exe

Araris
Offline
Зарегистрирован: 09.11.2012

Когда Вы соединяете GPIO0 с GND, модуль переходит в режим прошивки, в нем выставленные ранее параметры порта не актуальны. Режим прошивки поддерживает автоопределение скорости и прошивка может быть осуществлена на скорости от 9600 и выше.

kotwi
Offline
Зарегистрирован: 17.04.2015

Спасибо за советы.

Взял новый модуль. Работает норма по терминалу.

По прошивке выдает

AT version:0.21.0.0
SDK version:0.9.5

так вот хочу я его попытаться прошить (дабы восстановить старый у которого испорчена скорость), пробую законнектиться к модулю прогой XTCOM (GPIO0 на GND, CH_PD на 3,3 В сначала все соединил, потом включил, модуль питается от преобразователя УСБ-УАРТ). В проге XTCOM открываю порт OPEN, пишет Operation Succeeded! далее жму Connect и начинает бежать счетчик до 200 в конце пишет Fail to connect with target! Короче не соединяется. Здесь пробовал различные скорости, все также... Прошу вашего мнения..

Araris
Offline
Зарегистрирован: 09.11.2012

Leon010203 пишет:

Попробуй прошить через прошивальщик от nodeMCU или esp8266_flasher.exe

Присоединяюсь к совету.

Про XTCOM здесь http://esp8266.ru/esp8266-obnovlenie-proshivki-xtcom_util/ немного написано.

kotwi
Offline
Зарегистрирован: 17.04.2015

Leon, Araris спасибо!

Утилитой flasher шьется без проблем. И еще нарыл в нете сто нужно GPIO2 Подтягивать к +3,3. У меня подтянута.

NEGr
Offline
Зарегистрирован: 12.05.2014

Добрый день.

Кто-нибудь отправлял длинные сообщения? В спецификации сказано что можно отправлять пакеты длинной 2048 байт. Т.е. теоритически можно отправить сообщение состоящее из 2048 символов. Однако при отправке сообщения больше 300 символов - отправка не происходит. Возможно в спецификации ошибка: не байт а бит? Или это только у меня такая ситуация.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не на каждой ардуине оперативки хватит

Araris
Offline
Зарегистрирован: 09.11.2012

NEGr пишет:

Добрый день.

Кто-нибудь отправлял длинные сообщения? В спецификации сказано что можно отправлять пакеты длинной 2048 байт. Т.е. теоритически можно отправить сообщение состоящее из 2048 символов. Однако при отправке сообщения больше 300 символов - отправка не происходит. Возможно в спецификации ошибка: не байт а бит? Или это только у меня такая ситуация.

Байт, конечно же.

Мои игры с отправкой-приемом пакетов по 100-200 байт были неудачны. Сейчас ограничиваю себя 32-мя байтами, так надежнее проходит. Кроме того, стараюсь слать не чаще раза в 3-5 секунд.

NEGr
Offline
Зарегистрирован: 12.05.2014

jeka_tm пишет:

не на каждой ардуине оперативки хватит

реально оперативки маловато. 

Casper17
Offline
Зарегистрирован: 21.06.2013

Подскажите пожалуйста, если модуль настроен как точка доступа, есть ли ограничения на количество клиентов подключенных к данному модулю. Необходимо до 15 соединений и обмениваться информацией по tcp. По tcp одновременно будет идти обмен информацией только с одним клиентом.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Не держит он одновременно 15 конектов, максимум 4 TCP. А так же максимум 4 клиента в режиме точки доступа. В последнем SDK лимит увеличили до 8.

Casper17
Offline
Зарегистрирован: 21.06.2013

Про TCP я вкурсе что только до 4 соединений, но мне одновременно только 1 соединение необходимо. А вот то что столько мало клиентов это печально(( Выход только использовать отдельный роутер, да?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Да.

Timon_1
Offline
Зарегистрирован: 15.03.2015

semenov2009 пишет:

Может и не надо уже - но отвечу на вопрос о синхронизации времени с NTP через esp8266.

Работа с esp8266 идет без библиотек, только с помощью AT-команд.

Все пашет, время приходит всегда.  

Ниже - вырезка из основной программы настенных часов, только то, что отностится к синхронизации по NTP.

/

а целиком скетч не покажите? хочу тоже часы.

semenov2009
Offline
Зарегистрирован: 05.08.2014

Да пожалуйста!

Модуль esp8266 должен быть предварительно прошит прошивкой 1.0.0 SDK 0.22 и сконфигурирован (скорость порта, точка доступа, автоматическое подключение) через любую терминальную программу и переходник USB-UART на макетке с помощью АТ-команд. Читаем описание АТ-команд на esp8266.ru

/*
Настенные часы на семисегментных индикаторах GNS23011, врезаны светодиоды для двух центральных точек
Датчик освещенности "табла" (фоторезистор)
Модуль управления - Arduino Pro Mini 3V 8MHz
Часы - DS3231 в виде готового модуля с резервным аккумулятором
Датчик BMP180 с обвязкой - атмосферное давление, комнатная температура
Датчик HC-SR501 PIR MOTION DETECTOR (включает настенный светильник 220В через модуль коммутации на симисторе)
Модуль NRF24l01+ для получения данных от погодного датчика за окном и от сервера
Модуль ESP8266 для получения времени с NTP через WiFi (прошивка 1.0.0 SDK 0.22)
ESP8266 предварительно настроен на мою точку доступа и автоконнект, скорость 9600, mode 1 (STA)  
Питание: блок 220-12 для светодиодных лент и готовый DC-DC регулируемый (уст. 9В) на LM2596, 
далее - локальные стабилизаторы 5В и 3В где надо
Раскладка разъемов - в DOC файле. Согласование уровней 3.3-5В на МОСФЕТах. 
Схему рисовать лень...
*/
//#define ISDEBUG // Мы в отладке

#include <SPI.h>         
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <BMP180.h>
#include <Metro.h>
#include <SoftwareSerial.h>

#define latchPin 9 // LE драйвера MBI5026
#define clockPin 8 // CLK драйвера MBI5026
#define dataPin 7 // SDI драйвера MBI5026
#define OEPin 6 // OE инверсный для ШИМ регулировки яркости 
#define dotsPin 5 // Вывод центральных точек индикатора
#define PHOTORES A1 // Вход фоторезистора
#define HourButton A7 // увеличение показаний часов
#define MinuteButton A6 // увеличение показаний минут
#define PIR 2 // инфракрасный датчик присутствия 
#define RELAY 4 // реле
#define SID 800 // идентификатор датчика - этот узел 800

char VERSION[]={1,0,3}; // Так, для красоты можно при старте часов вывести
// For NTP & ESP8266
SoftwareSerial mySerial(16, 17); // A2 - RX, A3 - TX
unsigned long started=0; 
uint32_t out=0; 
time_t NTPtime=0;
//tmElements_t tm;
int c0, lenght=0;
const unsigned long seventyYears = 2208988800UL;     
const unsigned long LocalTimeZone = 10800UL;  // GMT+3   
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets 
// Сервер WWW.BELGIM.BY 178.124.164.107

//ПЕРЕМЕННЫЕ ДЛЯ ВЫВОДА НА ИНДИКАТОР
byte digit1, digit2, digit3, digit4; // разряды индикатора слева направо
volatile char d1, d2;
volatile int luminance=0; //освещенность, upperTreshold=1023, bottomTreshold=0, lumstep=0;//
volatile byte OE=0, dots=0;
volatile boolean dotsEnable=true; 

// структура для получения значений от сервера
typedef struct{         
  int SensorID;        // идентификатор датчика
  float ParamValue1;    // значение параметра 1
  float ParamValue2;    // значение параметра 2
  float ParamValue3;    // значение параметра 3
  float ParamValue4;    // значение параметра 4
  time_t ParamValue5;    // значение параметра 5
  time_t ParamValue6;    // значение параметра 6
  char Comment[6];    // комментарий
}
MessageMeteo2;
MessageMeteo2 ReceivedMeteo = { SID, 9999, 9999, 9999, 9999, 9999, 9999, "empty" }; // Для приема
MessageMeteo2 Meteo4 = { SID, 4444, 4444, 4444, 4444, 4444, 4444, "CLOCK" }; // Для передачи
time_t meteo4time; // время получения метеоданных с сервера 900 или внешнего датчика 600
tmElements_t tmMeteo4; 
time_t lastNTPtime = 0; // время получения времени от NTP

/////////////////////////////////////////////////////////////////////////////
// Периодичность действий
#ifdef ISDEBUG  
Metro NTPTimeSync = Metro(900000); //Если отладка - период синхронизации RTC по NTP 15 минут
#endif
#ifndef ISDEBUG  
Metro NTPTimeSync = Metro(14400000); //Период синхронизации RTC по NTP (4 часа)
#endif
Metro ReadRTCtime_period = Metro(600000); //Период чтения значений из RTC (10 минут)
Metro Trans_period = Metro(180000); //Период отправки данных (3 минуты)
Metro PIR_period = Metro(500); //Период опроса PIR (0.5 секунды)

unsigned long PreviousClockTime, i; 

//флаг принятых данных для прерывания
volatile boolean waitRF24 = false; 
// флаг принятых данных от сервера (датчиков)
volatile boolean Meteo4enable = false;

// Set up nRF24L01 radio on SPI bus plus pins 14 & 10 (CE, CSN)
RF24 radio(14,10);
// Radio pipe addresses for the 4 nodes to communicate.
const uint64_t pipes[5] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C7LL, 0xF0F0F0F0A5LL, 0xF0F0F0F0B4LL }; 
// адреса: 0 - сервер, 1 - внутренний модуль, 2 - уличный модуль, 3 - машина, 4 - этот модуль 
float tempDHT, humid, tempTMP, timeFromServer; 
float pressureBMP, tempBMP;
int sign, output, hours, mins;
tmElements_t tm;

BMP180 barometer;

void setup() {

#ifdef ISDEBUG  
  Serial.begin(57600); 
  Serial.print("Firmware version ");
  Serial.print((char)(VERSION[0]+'0'));
  Serial.print((char)(VERSION[1]+'0'));
  Serial.print((char)(VERSION[2]+'0'));
  Serial.println();
#endif

  mySerial.begin(9600);

  //переключение выводов для индикатора в режим работы "вывод", т.к. к ним идет обращение в главном цикле
  pinMode(latchPin, OUTPUT);
  digitalWrite(latchPin, LOW);
  pinMode(clockPin, OUTPUT);
  digitalWrite(clockPin, LOW);
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, LOW);
  pinMode(OEPin, OUTPUT);
  digitalWrite(OEPin, HIGH);
  pinMode(dotsPin, OUTPUT);
  pinMode(PIR, INPUT_PULLUP);
//  pinMode(PIR, INPUT);
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, LOW);
//  lumstep = (upperTreshold-bottomTreshold)/16;

// Зажигаем все табло с максимальной яркостью
  OE=0;  dots=255;
  digit1 = B11111111; 
  digit2 = B11111111; 
  digit3 = B11111111; 
  digit4 = B11111111; 
  ShowInfo();
  delay(2000);
// Выводим версию ПО часов
  digit1 = SegmentValue (22); // F
  digit2 = Digit1toDigit2 (SegmentValue (VERSION[0])); 
  digit3 = SegmentValue (VERSION[1]); 
  digit4 = Digit1toDigit2 (SegmentValue (VERSION[2])); 
  dots=0;
  ShowInfo();
  
// Инициализируем радиоканал NRF24
#ifdef ISDEBUG  
  printf_begin();
  printf("\n\rRF24_setup/\n\r");   // Setup and configure rf radio
#endif
  radio.begin();  
  radio.setRetries(15,15);  // optionally, increase the delay between retries & # of retries
  radio.setChannel(109);   // номер канала, на котором работаем (подобрать свой)
  radio.setDataRate(RF24_250KBPS); 
  radio.setPayloadSize(sizeof(MessageMeteo2));   // optionally, reduce the payload size.  seems to improve reliability
  // Open pipes to other nodes for communication
  radio.openWritingPipe(pipes[4]);
  radio.openReadingPipe(1,pipes[0]);
  radio.openReadingPipe(2,pipes[1]);
  radio.openReadingPipe(3,pipes[2]);
  radio.openReadingPipe(4,pipes[3]);
  // Start listening
  radio.startListening();
#ifdef ISDEBUG  
  radio.printDetails();   // Dump the configuration of the rf unit for debugging
#endif    
  // Attach interrupt handler to interrupt #1 (using pin 3)
  attachInterrupt(1, check_radio, FALLING);

  Wire.begin(); //i2c
  barometer = BMP180();
  if(barometer.EnsureConnected())
  {
#ifdef ISDEBUG  
    Serial.println("Connected to BMP180."); // Output we are connected to the computer.
#endif    
     // When we have connected, we reset the device to ensure a clean start.
    barometer.SoftReset();
    // Now we initialize the sensor and pull the calibration data.
    barometer.Initialize();
  }
#ifdef ISDEBUG  
  else
  { 
    Serial.println("Could not connect to BMP180.");
  }
#endif
  delay(4000); // Подождем еще четыре секунды, чтобы увидеть версию прошивки и поднять коннект с ТД
  setTime(RTC.get()) ; //установим системное время из часов ds3231
#ifdef ISDEBUG
  Serial.println("RTC reading OK");
  PrintTime (now());
#endif
   ShowRTC(); // Отобразим время
   //Запрашиваем время с NTP сервера
#ifdef ISDEBUG  
   Serial.println("Request for NTP ..."); 
#endif    
     GetNTP_esp8266(); // 
     //Если время получили успешно, то записываем данные в RTC
     if (NTPtime!=0 && NTPtime!=0xFFFFFFFF) 
        {
          setTime(NTPtime); 
          RTC.set(now());
          lastNTPtime=NTPtime;
          // Помигаем цифрами два раза - типа ОК
          ShowRTC();  
          analogWrite(OEPin, 255); 
          delay(500);
          ShowRTC();  
          delay(500);
          ShowRTC();  
          analogWrite(OEPin, 255); 
          delay(500);
#ifdef ISDEBUG
          Serial.println("NTP updated OK!");
          PrintTime (now());
#endif
        }
   ShowRTC();  
} //end of setup
 
void loop() {
if (ReadRTCtime_period.check() == 1)
   {
     setTime(RTC.get()) ; //установим системное время из часов ds3231
#ifdef ISDEBUG
  Serial.println("RTC reading OK");
  PrintTime (now());
#endif
   }
   
#ifdef ISDEBUG
//  PrintTime (now());
#endif
  if (NTPTimeSync.check() == 1) //Синхронизация по времени
     {
     dotsEnable=true;
     ShowRTC(); // Для начала - отобразим время
     //Запрашиваем время с NTP сервера
#ifdef ISDEBUG  
    Serial.println("Request for NTP ..."); 
#endif    
     GetNTP_esp8266(); // секунд около 40
     //Если время получили успешно, то записываем данные в RTC
     if (NTPtime!=0 && NTPtime!=0xFFFFFFFF) 
        {
          setTime(NTPtime); 
          RTC.set(now());
          lastNTPtime=NTPtime;
          // Помигаем цифрами два раза - типа ОК
          ShowRTC();  
          analogWrite(OEPin, 255); 
          delay(500);
          ShowRTC();  
          delay(500);
          ShowRTC();  
          analogWrite(OEPin, 255); 
          delay(500);
#ifdef ISDEBUG
          Serial.println("NTP updated OK!");
          PrintTime (now());
#endif
        }
     ShowRTC();  
     }  
  
    dotsEnable=true;
    ShowRTC();
    PreviousClockTime = millis(); 
    i=1;
    while (abs(millis()-PreviousClockTime) < 20000) // 20 секунд крутим цикл
           { 
            if ( (abs(millis()-PreviousClockTime)) >= (i*1000)) 
                 {dotsEnable=!dotsEnable; 
                  ShowRTC();
                  i++;
                 };
            checkClockButtons();//обработка нажатий кнопок установки часов
            if (PIR_period.check() == 1) {checkPIR(); //обработка срабатывания датчика движения    
                                          SetBrightness();
                                          ShowInfo();
                                         }
           };  
//delay(10000); // держим 10 секунд

  if (waitRF24) //флаг полученных данных взведен
  {
  waitRF24 = false; //сбросим флаг
  if ( radio.available() )
     {
      // Dump the payloads until we've gotten everything
      bool done = false;
      while (!done)
      {
        done = radio.read( &ReceivedMeteo, sizeof(ReceivedMeteo) ); // Fetch the payload, and see if this was the last one.
        // Spew it
#ifdef ISDEBUG  
       Serial.print(">>>>>>>>>>> Got data from  MODULE ");
       Serial.print(ReceivedMeteo.SensorID);
       Serial.println(); // Start a new line.
#endif    
       if(ReceivedMeteo.SensorID==900) { 
                                         meteo4time = now(); 
                                         Meteo4enable=true; 
                                         // если время, переданное сервером, более позднее, чем собственное, обновляем RTC
                                         if (ReceivedMeteo.ParamValue6 > lastNTPtime) 
                                           {
                                           setTime(ReceivedMeteo.ParamValue5);
                                           RTC.set(now());
                                           lastNTPtime=ReceivedMeteo.ParamValue6;
#ifdef ISDEBUG  
       Serial.print("Set time from module 900 ");
       Serial.println(); // Start a new line.
#endif    
                                           ShowRTC();
                                           };
                                         // проверка на NAN  
                                         if (ReceivedMeteo.ParamValue1==ReceivedMeteo.ParamValue1)
                                            {tempDHT=constrain(ReceivedMeteo.ParamValue1, -50.0, 80.0);  
                                             humid=constrain(ReceivedMeteo.ParamValue2, 0.0, 99.9);
                                            }
                                         // else Meteo4enable=false;   
                                        };
       if(ReceivedMeteo.SensorID==600) { 
                                         meteo4time = now(); 
                                         Meteo4enable=true; 
                                         // проверка на NAN  
                                         if (ReceivedMeteo.ParamValue1==ReceivedMeteo.ParamValue1)
                                            {tempDHT=constrain(ReceivedMeteo.ParamValue1, -50.0, 80.0);  
                                             humid=constrain(ReceivedMeteo.ParamValue2, 0.0, 99.9);
                                            }
                                         // else Meteo4enable=false;   
                                        }	
      delay(20); 	// Delay just a little bit to let the other unit make the transition to receiver
      }
     } //Конец обновления данных от сервера
   } // Обработали прерывание от NRF24L01

 dotsEnable=false; //выключим отображение точек
     
 if (Meteo4enable)
  {
#ifdef ISDEBUG  
       Serial.print("TempDHT ");
       Serial.print(tempDHT,1);
       Serial.print(" C, Humidity ");
       Serial.print(humid,1);
       Serial.println(" %"); // Start a new line.
#endif    
    // выводим уличную температуру
    if (tempDHT<0) {sign=1; tempDHT=-tempDHT;} else {sign=0;};
    output = (int)(tempDHT+0.5);
    if ((sign==1)&&(output>=10)) {d1=10;} else {d1=11;}; // знак минус если температура отриц. и двузначная
    digit1 = SegmentValue (d1); 
    if ((now()-meteo4time)>1800) 
        {digit1 = digit1|B00000100;}; //Если возраст инфы более 30 минут - в первом разряде пририсовываем точку
    IntToDigits (output);     
    if (output < 10) { d1=11; }; // убираем ноль в первом разряде
    if ((sign==1)&&(output<10)) {d1=10;} ; // знак минус если температура отриц
    digit2 = Digit1toDigit2 (SegmentValue (d1)); // десятки градусов
    digit3 = SegmentValue (d2); // единицы градусов
    digit4 = Digit1toDigit2 (SegmentValue (30)); // знак градуса
    SetBrightness();
    ShowInfo();
    PreviousClockTime = millis();  
    while (abs(millis()-PreviousClockTime) < 4000) // 4 секунды крутим цикл
           {
           checkClockButtons();//обработка нажатий кнопок установки часов
           if (PIR_period.check() == 1) {checkPIR(); //обработка срабатывания датчика движения    
                                         SetBrightness();
                                         ShowInfo();
                                        }
           }
    // выводим уличную влажность
    output = (int)(humid+0.5);
    digit1 = SegmentValue (23); // знак H
    if ((now()-meteo4time)>1800) 
        {digit1 = digit1|B00000100;}; //Если возраст инфы более 30 минут - в первом разряде пририсовываем точку
    d2 = byte(output/100);
    if (d2 == 0) { d2=11; }; // убираем ноль 
    digit2 = Digit1toDigit2 (SegmentValue (d2)); // сотни процентов
    IntToDigits (output%100);     
    if (output < 10) { d1=11; }; // убираем ноль 
    digit3 = SegmentValue (d1); // десятки процентов
    digit4 = Digit1toDigit2 (SegmentValue (d2)); // единицы процентов
    SetBrightness();
    ShowInfo();
    PreviousClockTime = millis();  
    while (abs(millis()-PreviousClockTime) < 4000) // 4 секунды крутим цикл
           {
           checkClockButtons();//обработка нажатий кнопок установки часов
           if (PIR_period.check() == 1) {checkPIR(); //обработка срабатывания датчика движения    
                                         SetBrightness();
                                         ShowInfo();
                                        }
           }
    if ((now()-meteo4time)>14400) 
        {Meteo4enable=false;}; //Если возраст инфы более 4 часов - запрещаем отображение meteo4
  };

  // получаем давление и внутреннюю температуру
  if(barometer.IsConnected)
  {
    pressureBMP = barometer.GetPressure(); // Retrive the current pressure in Pascals.
    tempBMP = barometer.GetTemperature(); // Retrive the current temperature in degrees celcius.
//Формируем пакет
//          Meteo4.SensorID = SID;
          Meteo4.ParamValue1 = (pressureBMP+0.5)/133.3; //давление в мм рт ст
          Meteo4.ParamValue2 = tempBMP; // температура
          Meteo4.ParamValue3 = (float)(1023 - analogRead(PHOTORES)); // показания датчика освещенности
          Meteo4.ParamValue4 = (float)(digitalRead(PIR)); // датчик присутствия 
          Meteo4.ParamValue5 = RTC.get(); // время замера 
          Meteo4.ParamValue6 = lastNTPtime; //до кучи...
//          Meteo4.Comment = (char*)"CLOCK";

#ifdef ISDEBUG  
       Serial.print("PressureBMP ");
       Serial.print( ((pressureBMP/133.3)+0.5),1);
       Serial.print(" mmHg,  TempBMP "); 
       Serial.print(tempBMP,1);
       Serial.println(" C"); // Start a new line
#endif    
    // выводим давление
    output = (int)((pressureBMP/133.3)+0.5); //перевод в мм рт ст и округление до целого
    digit1 = SegmentValue (19); // знак P
    d2 = byte(output/100);
    if (d2 == 0) { d2=11; }; // убираем ноль 
    digit2 = Digit1toDigit2 (SegmentValue (d2)); // сотни процентов
    IntToDigits (output%100);     
    if (output < 10) { d1=11; }; // убираем ноль 
    digit3 = SegmentValue (d1); // десятки процентов
    digit4 = Digit1toDigit2 (SegmentValue (d2)); // единицы процентов
    SetBrightness();
    ShowInfo();
    PreviousClockTime = millis();  
    while (abs(millis()-PreviousClockTime) < 4000) // 4 секунды крутим цикл
           {
           checkClockButtons();//обработка нажатий кнопок установки часов
           if (PIR_period.check() == 1) {checkPIR(); //обработка срабатывания датчика движения    
                                         SetBrightness();
                                         ShowInfo();
                                        }
           }

    // выводим комнатную температуру
    if (tempBMP<0) {sign=1; tempBMP=-tempBMP;} else {sign=0;};
    output = (int)(tempBMP+0.5);
    if ((sign==1)&&(output>=10)) {d1=10;} else {d1=11;}; // знак минус если температура отриц. и двузначная
    digit1 = SegmentValue (d1); 
    IntToDigits (output);     
    if (output < 10) { d1=11; }; // убираем ноль в первом разряде
    if ((sign==1)&&(output<10)) {d1=10;} ; // знак минус если температура отриц
    digit2 = Digit1toDigit2 (SegmentValue (d1)); // десятки градусов
    digit3 = SegmentValue (d2); // единицы градусов
    digit4 = Digit1toDigit2 (SegmentValue (30)); // знак градуса
    SetBrightness();
    ShowInfo();
    PreviousClockTime = millis();  
    while (abs(millis()-PreviousClockTime) < 4000) // 4 секунды крутим цикл
           {
           checkClockButtons();//обработка нажатий кнопок установки часов
           if (PIR_period.check() == 1) {checkPIR(); //обработка срабатывания датчика движения    
                                         SetBrightness();
                                         ShowInfo();
                                        }
           }
//Передадим данные на сервер
      if (Trans_period.check() == 1)
         {
	  // Delay just a little bit to let the other unit
	  // make the transition to receiver
 	  delay(20);
          radio.stopListening(); // отключаем режим приёма
          delay(20);
          radio.write( &Meteo4, sizeof(Meteo4) ); //отправляем мессагу
          delay(20);
          radio.startListening();
#ifdef ISDEBUG  
       Serial.println(">>>>>>>>>>> Data transmitted >>>>>>");
#endif    
         };// конец передачи
  } //if barometer connected    
} //loop

// ФУНКЦИИ ДЛЯ ИНДИКАТОРА
float norm(int value, int bottom, int upper, float power, int minimum) {
  float ret = 0;
  value = constrain(value, bottom, upper);
  ret = (float(value-bottom) / (float (upper-bottom)));
  ret = (255.0 - float(minimum)) * pow(ret, power) + float(minimum);
  return ret;
}

void SetBrightness()
{
   // меряем освещенность и устанавливаем яркость
   float lumnorm;
   OE=0; dots=255;
   luminance = 1023 - analogRead(PHOTORES); // яркость получается наоборот
   lumnorm = norm (luminance, 0, 400, 1.0, 17);  
   if (dotsEnable) {dots = int(lumnorm);} else {dots = 0;};
   lumnorm = norm (luminance, 0, 1000, 1.5, 5);  
   OE = 255 - int(lumnorm);
#ifdef ISDEBUG  
       Serial.print("Luminance ");
       Serial.print( luminance );
       Serial.print(" dots ");
       Serial.print( dots );
       Serial.print(" OE ");
       Serial.println( OE );
#endif    
}

void ShowInfo ()
{
//формируем ноль на latchPin и удерживаем его до конца передачи
//возвращаем высокий уровень на latchPin, тем самым сообщая микросхеме о том, что
//больше не требуется воспринимать информацию
    analogWrite(OEPin, OE); 
    analogWrite(dotsPin, dots);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, digit4);   
    shiftOut(dataPin, clockPin, LSBFIRST, digit3);   
    shiftOut(dataPin, clockPin, LSBFIRST, digit2);   
    shiftOut(dataPin, clockPin, LSBFIRST, digit1);   
    digitalWrite(latchPin, HIGH);
}

byte Digit1toDigit2 (byte d) // преобразование для второго разряда из пары
{
byte u = (d<<3)+(d>>5);
return u;
}

byte SegmentValue(char k)
{
  byte u;
  switch (k)
  {
    case 0:
      u=B11101011;
      break;
    case 1:
      u=B10000001;
      break;
    case 2:
      u=B01110011;
      break;
    case 3:
      u=B11010011;
      break;
    case 4:
      u=B10011001;
      break;
    case 5:
      u=B11011010;
      break;
    case 6:
      u=B11111010;
      break;
    case 7:
      u=B10000011;
      break;
    case 8:
      u=B11111011;
      break;
    case 9:
      u=B11011011;
      break;
    case 10: // '-':
      u=B00010000;
      break;
    case 11: //' ':
      u=B00000000;
      break;
/*    case 12: //'E':
      u=B01111010;
      break;
    case 13: //'U':
      u=B11101001;
      break;
    case 14: //'u':
      u=B11100000;
      break;
    case 15: //'I левое':
      u=B00101000;
      break;
    case 16: //'i правое':
      u=B10000000;
      break;
    case 17://'i левое':
      u=B00100000;
      break;
    case 18: //'o':
      u=B11110000;
      break;              */
    case 19: //'P':
      u=B00111011;
      break;
/*    case 20: //'A':
      u=B10111011;
      break;
    case 21: //'S':
      u=B11011010;
      break;              */
    case 22: //'F':
      u=B00111010;
      break;                 
    case 23: //'H':
      u=B10111001;
      break;
/*    case 24: //'J':
      u=B11100001;
      break;
    case 25: //'L':
      u=B01101000;
      break;
    case 26: //'C':
      u=B01101010;
      break;
    case 27: //'B':
      u=B11111011;
      break;
    case 28: //'b':
      u=B11111000;
      break;
    case 29: //'d':
      u=B11110001;
      break;              */
    case 30: //'°':
      u=B00011011;
      break;
    default:
      u=B00000000;
  }
 return u;
}

void IntToDigits (int a) 
{
d1 = (char)(a/10);
d2 = (char)(a%10);
}

// ФУНКЦИИ ДЛЯ ЧАСОВ
void ShowRTC()
{
#ifdef ISDEBUG
  Serial.println("Show RTC ...");
#endif
    RTC.read(tm);
    IntToDigits (tm.Hour);     
    if (tm.Hour < 10) { d1=11; } 
    digit1 = SegmentValue (d1);
    digit2 = Digit1toDigit2 (SegmentValue (d2));
    IntToDigits (tm.Minute);
    digit3 = SegmentValue (d1);
    digit4 = Digit1toDigit2 (SegmentValue (d2));
    SetBrightness();
    ShowInfo();
#ifdef ISDEBUG
//    PrintTime(RTC.get());
    Serial.print("Hour = ");
    Serial.print(tm.Hour);
    Serial.print("  Minute = ");
    Serial.println(tm.Minute);
#endif
} 

void checkClockButtons()//обработка нажатий кнопок установки часов
{    
    if (analogRead(HourButton)<128) 
         {
         delay(300);
         if (analogRead(HourButton)<128) 
             {RTC.read(tm); 
              tm.Hour++;
              if (tm.Hour>=24) {tm.Hour=0;};
              RTC.write(tm); 
              setTime(RTC.get()) ; //установим системное время из часов ds1307
              ShowRTC();
             };   
         };
    if (analogRead(MinuteButton)<128) 
         {
         delay(300);
         if (analogRead(MinuteButton)<128) 
             {RTC.read(tm);
              tm.Minute++;
              if (tm.Minute>=60) {tm.Minute=0;};
              RTC.write(tm); 
              setTime(RTC.get()) ; //установим системное время из часов ds1307
              ShowRTC();
             };   
         };
}

void checkPIR() //обработка срабатывания датчика движения
{   
    int hr=hour();
    if (digitalRead(PIR)==HIGH) 
         { if ( (hr>=6)&&(hr<22) ) { digitalWrite(RELAY, HIGH); } 
           else { digitalWrite(RELAY, LOW); }; 
#ifdef ISDEBUG
  Serial.print("PIR is HIGH ");
  Serial.print("  Hour = ");
  Serial.println(hr);
#endif
         };
    if (digitalRead(PIR)==LOW) 
       { digitalWrite(RELAY, LOW); 
#ifdef ISDEBUG
  Serial.println("PIR is LOW ");
#endif
       };
}
 
// Обработчик прерывания
void check_radio()
{
 waitRF24 = true;
}

time_t GetNTP_esp8266()
{
  NTPtime=0;
/*    mySerial.println("AT+RST");
  delay(3000);
  mySerial.println("AT+CWMODE_CUR=1");
  delay(2000);

#ifdef ISDEBUG
  Serial.println("Connect to my AP");
#endif
  mySerial.println("AT+CWJAP_CUR=\"MYSSID\",\"MYPASSWORD\"");
  delay(8000);
*/ 
  setNTPpacketBuffer();

#ifdef ISDEBUG
  Serial.println("Connect to NTP");
#endif
  mySerial.println("AT+CIPSTART=\"UDP\",\"178.124.164.107\",123,34000");
  delay(5000);

#ifdef ISDEBUG
  Serial.println("Send lenght 48 bytes");
#endif
  mySerial.println("AT+CIPSEND=48");
  delay(4000);
  while ( mySerial.available()) mySerial.read();
//  delay(100);
 
#ifdef ISDEBUG
  Serial.println("Send NTP packet ");
#endif
  for (int i=0; i<NTP_PACKET_SIZE; i++) {mySerial.write(packetBuffer[i]); }
#ifdef ISDEBUG
  Serial.println("NTP packet sended ");
#endif
delay(10000);
#ifdef ISDEBUG
  Serial.println("Receive Message");
#endif
if (mySerial.available())
   {
   started = millis(); 
   do {c0 = mySerial.read();} while ((c0 != ':') && (mySerial.available()));
   for (int i=0; i<NTP_PACKET_SIZE; i++) {packetBuffer[i] = mySerial.read(); 
//                                           Serial.print(packetBuffer[i],HEX); Serial.print(","); 
                                         }
   out = (uint32_t(packetBuffer[40])<<24) + (uint32_t(packetBuffer[41])<<16) + (uint32_t(packetBuffer[42])<<8) + uint32_t(packetBuffer[43]) ;
   NTPtime = out - seventyYears + LocalTimeZone + 12;
   }
else {
#ifdef ISDEBUG
  Serial.println("No data received!");
#endif
     mySerial.println("AT+CIPCLOSE");
     return 0;
     }
#ifdef ISDEBUG
  Serial.println("Close connection");
#endif
  mySerial.println("AT+CIPCLOSE");
//  delay(1000);
// if (out==0xFFFFFFFF) {return0} else
return NTPtime;
}

void setNTPpacketBuffer()
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
}

#ifdef ISDEBUG
void PrintTime (time_t ttt)
{
 tmElements_t tttm;
 Serial.print("UNIXTIME   ->>>>   ");
 Serial.print(ttt,HEX);
 Serial.print("   ->>>>   ");
 Serial.println(ttt,DEC);
 breakTime(ttt, tttm);  
 Serial.print("Date time is: ");
 Serial.print(tttm.Day);
 Serial.print(".");
 Serial.print(tttm.Month);
 Serial.print(".");
 Serial.print(tttm.Year+1970);
 Serial.print(" - ");
 Serial.print(tttm.Hour);
 Serial.print(":");
 if ( (tttm.Minute) < 10 ) {
     // In the first 10 minutes of each hour, we'll want a leading '0'
     Serial.print('0');
    }
 Serial.print(tttm.Minute);
 Serial.print(":");
 if ( (tttm.Second) < 10 ) {
     Serial.print('0');
    }
 Serial.print(tttm.Second);
 Serial.println(); // Start a new line.
}
#endif

Пользуйтесь!

 

Timon_1
Offline
Зарегистрирован: 15.03.2015

Спасибо огромное.

Извиняюсь за офтоп. но не нашел на форуме ЛС. поэтому спрошу semenov2009  тут.

Но отчего то не получается время от NTP. каждый раз получается ответ    7C55ABBB   ->>>>   2085989307

Date time is: 7.2.2036 - 9:28:27. Подскажите куда копать.

bes666x13
Offline
Зарегистрирован: 28.03.2015

Всем привет!

Подскажите пожалуйста, что сжелать с этим ESP 8266 чтоб он заработал наконец то!!!

Имею:

Arduino UNO R3 (1 шт.) , DHT-11 (2 шт.), ESP8266 (1 шт.)

Хочется сделать отправку данных температуры и влажности на Народный мониторинг.

С чего вообще начинать???

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

bes666x13 пишет:

Имею:

Arduino UNO R3 (1 шт.) , DHT-11 (2 шт.), ESP8266 (1 шт.)

Хочется сделать отправку данных температуры и влажности на Народный мониторинг.

С чего вообще начинать???

Для этого ардуина не нужна.

semenov2009
Offline
Зарегистрирован: 05.08.2014

У меня похожие цифры получались, когда NTP сервер в четырех байтах возвращал FFFFFFFF.

Я вылечил выбором сервера belgim.by.

Попробуйте NTP сервера российского ВНИИФТРИ (эталон времени РФ), или задержки для получения ответа увеличить. Как мне показалось, esp8266 любит неторопливую работу.

Еще установите увеличенный буфер для SoftwareSerial. Рекомендуют 256.

Мне попробовать не на чем - часы уже на стене висят и четко пашут.

А вообще, я начинал с макетки и терминальной программки CoolTerm. Читаем описание АТ-команд, задаем руками, смотрим в терминале ответ, осознаем. Возможно, загоните модуль в бессознательное состояние - лечим перепрошивкой и начинаем заново: AT+RST  и далее ...

Самый лучший сайт ИМХО - esp8266.ru.

Timon_1
Offline
Зарегистрирован: 15.03.2015

да с ESP с большего все понятно. до отправки данных на NTP все работает (выбор режима модуля, сброс модуля, коннект к WiFi, коннект к NTP, после обмена с NTP закрытие соединения и отключение от WiFi). а вот проконтролировать что уходит и что приходит от NTP мозгов не хватает. из того ответа NTP что вижу в скетче первые 4 числа есть (третье меняется), остальные FF.  

semenov2009
Offline
Зарегистрирован: 05.08.2014

Предположу еще плохое питание. Я свою всегда от отдельного стаба питал и электролит на 200 мкф рядом с контактами ставил.

Timon_1
Offline
Зарегистрирован: 15.03.2015

Т.е. во всех символах ответа NTP должно быть что то отличное от FF? а что надо ему посылать? есть ли какая то одна строка? что бы через ESPlorer к примеру ручками послать и посмотреть ответ

semenov2009
Offline
Зарегистрирован: 05.08.2014

В четырех значащих байтах - 40,41,42,43. 43 младший. Количество секунд с 1.01.1900 г. Можно на калькуляторе посчитать, чтобы понять что должно прийти.

А чтобы послать ему нужные 48 байт - я их вычислял из функции setNTPpacketBuffer(), набирал в HEX-редакторе, копировал и отправлял на приглашение модуля.

bes666x13
Offline
Зарегистрирован: 28.03.2015

Тогда как прошить ESP, без Ардуино и прошивальщика?! Как ваще понять что ESP живой?

Как в ESP забить данные моей Wi-Fi сети?

Timon_1
Offline
Зарегистрирован: 15.03.2015

примерно так проверить, а вот так можно настроить 

bes666x13
Offline
Зарегистрирован: 28.03.2015

На этапе проверки, при подаче питания +3.3 вольт на VCC и GND  на esp8266 загораются синий (тускло) и красные светодиоды.

При одключении третьего провода к разъему CH_PD, гаснут оба светодиода. 

 

Как я понимаю, это не нормально?!

 

Timon_1
Offline
Зарегистрирован: 15.03.2015

+ на VCC - на GND? а что за третий?

bes666x13
Offline
Зарегистрирован: 28.03.2015

Timon_1 пишет:

+ на VCC - на GND? а что за третий?

В ссылке которую ты дал указано что +3,3 вольта подать на CH_PD

Timon_1
Offline
Зарегистрирован: 15.03.2015

Ну тогда да. откуда берешь 3,3В? может источник не вытягивает?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

bes666x13 пишет:
Тогда как прошить ESP, без Ардуино и прошивальщика?! Как ваще понять что ESP живой? Как в ESP забить данные моей Wi-Fi сети?

Ну я бы рекомендовал иметь USB-TTL адаптер. Но можно и Вашу ардуинку для этого использовать. Адаптер у неё на борту. Пропишите в ардуинку любой скетч не использующий сериал-порт и подключив к RX ардуины RX esp8266, а к TX соответственно TX получите USB-TTL адаптер из ардуины. Ну и 3.3 вольта для esp8266 (обычно) надо. И учтите, что она достаточно прожорливая во время работы радиомодуля.

bes666x13
Offline
Зарегистрирован: 28.03.2015

Timon_1 пишет:

Ну тогда да. откуда берешь 3,3В? может источник не вытягивает?

3,3 вольт беру с Ардуино Уно.