ESP8266 c датчиком движения.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Народ, всем привет. Собираю часы с датчиками теипературы, давления и движения на esp8266(NodeMCU 1.0) + датчик движения, чтобы не светился по ночам и когда нет никого, Дисплей из 4 адресных светодиодных матриц 16х16. В общем на макетке все работало. Сделал платку, на ней собрал датчик движения на BISS0001 ну и всякие резюки туда запихал, с esp8266 проводками китайскими соединил. И тоже вроде все работает, но датчик движения глючит. Во первых не нравится ему  timeClient.update() и во вторых не переваривает FastLED.show(). Вот код:

// -------- ВРЕМЯ -------
#define GMT 3              // смещение (москва 3)
#define NTP_ADDRESS  "europe.pool.ntp.org"    // сервер времени
#define NTP_INTERVAL 60 * 1000    // обновление (1 минута)

//-------------------Библиотеки-------------------
#include <FastLED.h>
#include "font12.h"
#include "font_sm.h"
#include <WiFiManager.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "Adafruit_Sensor.h"
#include "Adafruit_BME280.h"
#include "Wire.h"
#include <DallasTemperature.h>
#include <OneWire.h>

//-------------------Заданные значения---------------
#define MATRIX_WIDTH 64 //ширина матрицы               
#define MATRIX_HEIGHT 16 //высота матрицы
#define COLOR_ORDER GRB 
#define NUM_LEDS MATRIX_WIDTH * MATRIX_HEIGHT
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_ESP8266_RAW_PIN_ORDER
#define DATA_PIN 4  //пин матрицы
#define LIGHT_PIN A0  //пин матрицы
#define ONE_WIRE_BUS D3 //контакт для передачи данных подключен к D1ES8266 12-Е (GPIO5)
#define MOVE D7 //датчик движения
#define POWER_PIN D8 //пин включения питания по датчику движения 
CRGB leds[NUM_LEDS];
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, GMT * 3600, NTP_INTERVAL);
WiFiServer server(80);
// создаем экземпляр класса oneWire; с его помощью 
// можно коммуницировать с любыми девайсами, работающими 
// через интерфейс 1-Wire, а не только с температурными датчиками
// от компании Maxim/Dallas:
OneWire oneWire(ONE_WIRE_BUS);
// передаем объект oneWire объекту DS18B20: 
DallasTemperature DS18B20(&oneWire);

const float SEA_LEVEL_PRESSURE_HPA = 1013.25;
Adafruit_BME280 bme;

// ----------------- ПЕРЕМЕННЫЕ ------------------
int symbols[] = {32,37,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,194};
int smallnum[] = {32,37,45,46,48,49,50,51,52,53,54,55,56,57,58};
uint8_t curX;
uint8_t curY;
uint16_t lineStart=0;//с какого столбца строки начинаем вопроизведение текста
uint16_t lineFin=0;//каким столбцом строки заканчиваем вопроизведение текста
uint8_t startRunLineX=MATRIX_WIDTH-1;//столбец X начала отрисовки бегущей строки
byte sl, sn, days, hs, ms, ss, my, dm;
String DayOfWeek, MonthOfYear;
unsigned long Full_tm, yy, interval, corr, intizmer;
int BRIGHTNESS, RBRIGHTNESS, cc;
float h, t, p, pin, dp;
char temperatureString[6]; //температура в комнате
char dpString[6];
char humidityString[6];
char pressureString[7];
char pressureInchString[6];
char temperatureCString[6]; //температура на улице
long unsigned int lowIn; //Пауза, после которой движение считается оконченным 
long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет 
boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения 
boolean takeLowTime; 

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(LIGHT_PIN, INPUT);
  pinMode(POWER_PIN, OUTPUT);
  pinMode(MOVE, INPUT);
  FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  Serial.begin(9600);
  interval = 0;
  intizmer = 0;
  WiFiManager wifiManager;
  wifiManager.autoConnect("Meteo-ST");
  sl = sizeof(symbols)/sizeof(symbols[0]);
  sn = sizeof(smallnum)/sizeof(smallnum[0]);
  timeClient.begin();

  Wire.begin(D6, D5);
  Wire.setClock(100000); 
  if(!bme.begin())
  {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1)
    {
      yield();
      delay(3000);
    }
  }
  //Запускаем WEB сервер
  server.begin();
  DS18B20.begin();
  cc = random(255);
  GetData();
  digitalWrite(MOVE, LOW);   //дадим датчику время на калибровку   4
  for(int i = 0; i < 30; i++)   
  {     
    digitalWrite(POWER_PIN,HIGH);
    delay(500);   
    digitalWrite(POWER_PIN,LOW);
    delay(500);   
  }   
  delay(50); 
  digitalWrite(POWER_PIN,LOW);
  RBRIGHTNESS = analogRead(LIGHT_PIN);
  RBRIGHTNESS = 1023 - RBRIGHTNESS;
  BRIGHTNESS = map(RBRIGHTNESS, 0, 1023, 1, 50);

}

void loop() {
  String frmdt;
  String OutDT;
  String OutTm;
  String OutTmp;
  String OutTmpOut;
  String OutHum;
  String OutPre;
  //Если обнаружено движение   
  if(digitalRead(MOVE) == HIGH)   
  {     
    //Если еще не вывели информацию об обнаружении     
    if(lockLow)     
    {       
      lockLow = false;       
      digitalWrite(POWER_PIN,LOW);
//      delay(50);     
    }             
    takeLowTime = true;   
  }   
  //Ели движения нет   
  if(digitalRead(MOVE) == LOW)   
  {           
    //Если время окончания движения еще не записано     
    if(takeLowTime)     
    {       
      lowIn = millis(); //Сохраним время окончания движения       
      takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения     
    }     
    //Если время без движение превышает паузу => движение окончено     
    if(!lockLow && millis() - lowIn > pause)     
    {        
      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения       
      lockLow = true;       
      digitalWrite(POWER_PIN,HIGH);
//      delay(50);     
    }   
  }
//  timeClient.update(); ***********************

if (lockLow){
  BRIGHTNESS = 0;
}
else {
  if (BRIGHTNESS == 0){
    RBRIGHTNESS = analogRead(LIGHT_PIN);
    RBRIGHTNESS = 1023 - RBRIGHTNESS;
    BRIGHTNESS = map(RBRIGHTNESS, 0, 1023, 1, 50);
  }
}

  if (millis() - intizmer > 60000){
    GetData();
    intizmer = millis();
  }
  
  days = timeClient.getDay();
  hs = timeClient.getHours();
  ms = timeClient.getMinutes();
  ss = timeClient.getSeconds();
  frmdt = getDTString();
  OutDT = DayOfWeek + ", " + dm + " " + MonthOfYear + " " + yy + " года";
  OutTm = timeClient.getFormattedTime();
  OutTmp = "Температура в комнате " + String(temperatureString) + "°C";
  OutTmpOut = "Температура на улице " + String(temperatureCString) + "°C";
  OutHum = "Влажность " + String(humidityString) + "%";
  OutPre = "Давление " + String(pressureString) + "мм.рт.ст.";

  FastLED.setBrightness(BRIGHTNESS);//0-255
  FastLED.clear();
  CHSV color = CHSV(cc,255,255);

  FastLED.show();
  
  WiFiClient client = server.available();
  if (client) {
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c == '\n' && blank_line) {
            //getWeather();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // your actual web page that displays temperature
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            //client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15; charset=Windows-1251 \"></head>");
            client.println("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
            client.println("<script>");
            client.println("setTimeout(function(){location.reload();}, 15000);");
            client.println("</script></head>");
            client.println("<body><h1>ESP8266 Weather Web Server</h1>");
            client.println("<h1>"+OutDT+"</h1>");
            client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
            client.println("<h3>");
            client.println(OutTmp);
            client.println("</h3><h3>");
            client.println(OutTmpOut);
            client.println("</h3><h3>");
            client.println(OutHum);
            client.println("</h3><h3>");
            client.println(OutPre);
             client.println("</h3></td></tr></tbody></table></body></html>");  
            break;
        }
        if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    }  
    // closing the client connection
    delay(1);
    client.stop();
  }
}

timeClient.update() я пока вообще закомментировал. А вот как сейчас, т.е. с FastLED.show() датчик движения не перестает выдавать единицу на выходе, коть его тряпкой прикрывай, хоть уходи. СТоит закомментировать эту строку, сразу через положенные 3 минуты выдает 9 на выходе. Светодиод на D8 прекрасно срабатывает. Ну с timeClient потом буду разбираться, он по задумке раз в день будет срабатывать, так в основное время часы на DS1307 будут работать. А вот без FastLED.show() ну никак!

Xomyc
Offline
Зарегистрирован: 10.04.2020

0 конечно на выходе, а не 9. Чего-то не вижу как исправить.

И еще может кто знает, сайт Arduino.ru автоматом не открывается. Надо каждый раз вначале адреса https:// прописывать. Все остальные сайты без проблем, а этот руками каждый раз прописывать. Вот сейчас сохраню и чтобы увидеть страницу, опять надо будет https:// вписать в начале строки!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

В общем на макетке все работало.

Накосячили с платой, если работало.

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Xomyc пишет:

В общем на макетке все работало.

Накосячили с платой, если работало.

Все прозвонил. Так и работает, если матрицу не включать командой FastLED.show()

О Идея! Попробую команду дать, а матрицу отключить физически.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

Все прозвонил.

Я не видел схемы и сборки, хрустальный шар запрещен. Угадываю...

А проверить датчик движения - почему бы и нет?

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Xomyc пишет:

Все прозвонил.

Я не видел схемы и сборки, хрустальный шар запрещен. Угадываю...

А проверить датчик движения - почему бы и нет?

Да блин! Картинку вставить гемор! Я сразу хотел схему приложить. Пытаюсь разобраться.

К стати отсоединил разъем от светодиодной матрицы, датчик движения заработал! Щас ковырять буду!

Xomyc
Offline
Зарегистрирован: 10.04.2020

https://cdn1.radikalno.ru/uploads/2020/12/30/126c360694f7c33207aec0e6ca28c677-full.png

Вот там схема. Что-то иначе не получается.

Xomyc
Offline
Зарегистрирован: 10.04.2020
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

Да блин! Картинку вставить гемор!

Программирование и схемотехника ище тот гимор. Но люди как-то справляются.

Скорее всего Вы что-то оптимизировали на плате (какой-то ноль).

А честно - программирование не терпит суеты! Усвойте двоичную прану, Выдохните шестнадцетеричный контент. И вперед!

И главное - освойте вставку картинок в форум. Понимаю, что для дебилов это малость сложно, но ведь делают!

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Xomyc пишет:

Да блин! Картинку вставить гемор!

Понимаю, что для дебилов это малость сложно, но ведь делают!

Мда. Так откровенно меня еще не где не обзывали! алё! Дегенератище, ты ту закис похоже! Очки сегодня на жопу одел? Освоил вставку картинок больше в жизни ничего не интересует?

Модераторы, это вообще нормально тут у вас? Мало того, что страницы сами не открываются, так еще и оскорбляют тут!!!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я про дебилов, вообще то. Ну а как кто себя позиционирует - это его проблемы.

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Я про дебилов, вообще то. Ну а как кто себя позиционирует - это его проблемы.

Ага, типа отмазался. Да конечно все кто даже с трудом научился картинки вставлять - дебилы, ну а мол ты дорогой друг, хоть и не умеешь, в отличие от дебилов, вставлять картинки, все равно к ним не относишься! Я мол так имел ввиду, а как ты подумал....

В общем пусть это будет на совести модераторов. Я об авторе заявления высказал вполне определенное мнение ничем не закомуфлированное. А после последнего высказывания еще и подпишусь под ним.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

И не надо обижаться.

Xomyc
Offline
Зарегистрирован: 10.04.2020

55ad4bc7b4b48331d32085da183468a1-prev.jp

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Не издеваюсь. А нельзя качество повысить? При 500% - все расплывается, при 200% - нихрена не видно. Особенно номиналы ... Или в векторе дать

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Не издеваюсь. А нельзя качество повысить? При 500% - все расплывается, при 200% - нихрена не видно. Особенно номиналы ... Или в векторе дать

Да не пролучается. Картинка у меня большая и четкая, а через Радикал такая фигня получается.

Xomyc
Offline
Зарегистрирован: 10.04.2020

На всех форумах, где картинка не вставляется простым выбором файла на диске есть инструкция как это сделать. Ту мало того, что при нажатии каждой ссылки мне приходится https перед адресом вручную писать, так еще и инструкции нет!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

 а через Радикал такая фигня получается.

Да в шопу этот радикал! Клади картинку в хранилище форума. Кроме того предварительно обработай - убери цвет, рамку (подрежь т.е.). Это все не имеет значение. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

И тут почитай

Xomyc
Offline
Зарегистрирован: 10.04.2020

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ну вот это я вставил через сайт. У меня на компе сама картинка смотрится нормально. Очевидно надо еще размерами играть.

Нет, размерами не играется. Так же расплывается все! Иожет потому, что картинка с EasyEDA через PDF и фотошоп переделана. Но там нет импорта в нормальную картинку. Только PNG, а там вообще швах!

Вот так помоему лучше всего.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

Ну вот это я вставил через сайт. У меня на компе сама картинка смотрится нормально.

Стопэ! Картинка смотрится нормально. И, вроде, софтина соответствует хардвару. Да где-же ошибка?

Пиз-ит кто-то. Или на макетке не работало. Признавайся ужо...

rkit
Offline
Зарегистрирован: 23.11.2016

И сейчас ты будешь заливать, что на макетке собрал этот невообразимый фарш из резисторов и конденсаторов с smd микросхемой.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Нет, не буду заливать. На макетке была ESP8266, датчик температуры DS18B20 с водонепроницаемым наконечником на 2 метровом шнуре (этот на улицу), датчик bme/bme280 и датчик движения готовый HC-SR501. Часов на макетке не было, но там особо тестировать нечего, схема собранная уже миллионы раз.

Так вот я сделал плату по приведенной схеме. Как же говорил, часы миллион раз собирал и часть палты уже готова была, а датчики движения по этой схеме я собрал прошлой зимой 6 штук для фонарей с солнечными батареями и они прекрасно работают. Собственно как уже написал выше, работает если отключить разъем, который идет на светодиодные матрицы. Да собственно то получается затык в том, что без светодиодных матриц все работает, только не выводится на экран. Но стоит подключить матрицы, сразу датчик движения начинает выдавать постоянную единицу на выходе. И вот непонятно, то ли сигнальный провод, который на матрицу выводит шумит сильно и татчик движения получается все время сработавший, то ли еще какая фигня.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Может питание недостаточно?

Xomyc
Offline
Зарегистрирован: 10.04.2020

mykaida пишет:

Может питание недостаточно?

Тоже о питании подумал. На макетке была плата неизвестно откуда выломаная, но 5 вольт давала и все работало. А тут пришел с Алиэкспресса БП на 5В 3А. Его поставил. Подумал мож в нем дело, подключил тот, что на макетке был. Такая же фигня!

Я вот думаю, мож я на макетке датчик движения от 3,3 В питал с ESP 8266.....Хотя по даташиту 5 вольт нормально для нее. Можно конечно попробовать. Но я не поскупился 2 кондея по питанию на плату поставил в 2 концах платы суммой на 1500 микрофарад! На макетке ни одного не было. Буду дальще ковырять.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Xomyc пишет:

на макетке датчик движения от 3,3 В питал с ESP 8266

А чего еще питаем от ESP? Может 2 стоквартирных дома?

Xomyc
Offline
Зарегистрирован: 10.04.2020

Ура! Заработало как только питание датчика движения на 3,3в посадил! От 3,3в питается как на схеме показано: DS18B20 и фоторезистор на 3,3в сидит. Оказывается BISS0001 тоже надо было от 3,3в запитать! Ну собственно в фонарях я их тоже от 3,3в питал. Там ведь аккумулятор на 3,7 вольта, а потом стабилизатор на 3,3в. Блин! Из-за невнимательности панику поднял, а мог бы и сам разобраться, что в итоге и сделал.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Народ, пока сейчас дописываю скетч, возникло подозрение, что часто происходят ложные срабатывания датчика движения. Собственно по такой же схеме я делал в прошлом году фонари на солнечных батареях с датчиком движения на Attiny13. Там все работает отлично. Ложных срабатываний нет. А вот тут на ESP8266 барахлит. Я тут читал, что может надо подтянуть на землю контакты ESP8266? Как вы думаете может это помочь? Я просто не знаю как нужно ли это. Вот для Attiny не нужно было.