Простые часы на ESp8266 +Oled display
Для сборки потребуется :
Плата NodeMcu v3 https://ali.pub/54jmzl
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include <ESP8266WiFi.h>
#include <time.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
Для сборки потребуется :
Плата NodeMcu v3 https://ali.pub/54jmzl
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include <ESP8266WiFi.h>
#include <time.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
MQ-135 Gas Sensor - это простой в использование датчик газа, широко применяются в робототехнике и системах автоматизации, подходит для Arduino проектов. Еще его называют датчик углекислого газа.
US $1.28
https://ali.pub/5cutkh
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
US $1.28
https://ali.pub/5cutkh
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
aliexpress.com
US $1.28 |MQ135 MQ 135 Air Quality Sensor Hazardous Gas Detection Module For M2 PromotionHot New Arrival|gas detection module|gas…
Smarter Shopping, Better Living! Aliexpress.com
MQ-135 Gas Sensor - это простой в использование датчик газа, широко применяются в робототехнике и системах автоматизации, подходит для Arduino проектов. Еще его называют датчик углекислого газа.
US $1.28
https://ali.pub/5cutkh
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
US $1.28
https://ali.pub/5cutkh
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
aliexpress.com
US $1.28 |MQ135 MQ 135 Air Quality Sensor Hazardous Gas Detection Module For M2 PromotionHot New Arrival|gas detection module|gas…
Smarter Shopping, Better Living! Aliexpress.com
Датчик атмосферного давления, влажности и температуры BME280
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include <Wire.h>
#include <SPI.h>
// подключение библиотек
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <OLED_I2C.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-107877557_118570&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include <Wire.h>
#include <SPI.h>
// подключение библиотек
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <OLED_I2C.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-107877557_118570&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353
Простые часы на ESp8266 +Oled display
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
aliexpress.com
0.98€ 20% OFF|Nieuwe Draadloze Module CH340 Nodemcu V3 Lua Wifi Internet Van Dingen Development Board Gebaseerd ESP8266|nodemcu…
Smarter Shopping, Better Living! Aliexpress.com
Простые часы на ESp8266 +Oled display
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
aliexpress.com
0.98€ 20% OFF|Nieuwe Draadloze Module CH340 Nodemcu V3 Lua Wifi Internet Van Dingen Development Board Gebaseerd ESP8266|nodemcu…
Smarter Shopping, Better Living! Aliexpress.com
Дубликатор ключей ONEWIRE DS-1990 (Dallas Touch Memory DS-90) на ардуино
Простота устройства, дешевизна изготовления, надежность (нечему ломаться) привело к тому, что данные ключи стали использоваться повсеместно. Начиная от домофонов и заканчивая автомобильными сигнализациями.
Многие производители считывающих устройств поддерживают так называемые "мастер ключи" - т.е. универсальные коды ключей. Такие обычно выдают обслуживающим организациям для доступа в подъезд. Вот некоторые из них, что можно найти в открытом доступе:
01:BE:40:11:5A:36:00:E1
FF:FF:FF:FF:FF:FF
00:36:5A:11:40:BE
00:00:00:FE:D4:53
00:00:00:00:00:00
00:00:00:01:FF:FF
00:00:09:3С:E4:A9
00:00:FF:FF:FF:FF
00:00:AA:11:BE:00
00:00:0F:2E:B8:76
FF:FF:FF:FF:FF
36:5A:11:40:BE
01:FF:FF:FF:FF
36:5A:39:81:49
00:00:00:00:00
01:FF:FF:FF:FF
56:5A:11:40:BE
36:5A:39:81:49
00:00:00:00:00
0B:57:81:46:01
C9:8E
Соберем программатор для записи ключей. Нам потребуются болванки. В продаже часто встречаются DS1990 и TM2004. TM2004 - можно перезописывать, если не произведена финализация (подача 9 вольт). После финализации ключ сохраняется на вечно.
Программировать будем через Arduino Uno. Подключается ключ на 16 ногу и подтягивается к плюсу. Второй конец ключа на землю.
Скетч программы для Arduino записывает каждый бит отдельно:
include <OneWire.h>
#define pin 10
byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };
OneWire ds(pin); // pin 10 is 1-Wire interface pin now
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte data[8];
delay(1000); // 1 sec
ds.reset();
delay(50);
ds.write(0x33); // "READ" command
ds.read_bytes(data, 8);
Serial.print("KEY ");
for( i = 0; i < 8; i++) {
Serial.print(data[i], HEX);
if (i != 7) Serial.print(":");
}
// Check if FF:FF:FF:FF:FF:FF:FF:FF
// If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
{
Serial.println("...nothing found!");
return;
}
return; // remove when ready to programm
// Check if read key is equal to the one to be programmed
for (i = 0; i < 8; i++)
if (data[i] != key_to_write[i])
break;
else
if (i == 7)
{
Serial.println("...already programmed!");
return;
}
Serial.println();
Serial.print("Programming new key...");
for (uint8_t i = 0; i < 8; i++)
{
ds.reset();
data[0] = 0x3C; // "WRITE" command
data[1] = i; // programming i-th byte
data[2] = 0;
data[3] = key_to_write[i];
ds.write_bytes(data, 4);
Serial.print(".");
uint8_t crc = ds.read();
if (OneWire::crc8(data, 4) != crc) {
Serial.print("error!\r\n");
return;
}
else
Serial.print(".");
send_programming_impulse();
}
Serial.println("done!");
}
void send_programming_impulse()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
delay(60);
digitalWrite(pin, LOW);
delay(5);
digitalWrite(pin, HIGH);
delay(50);
}
Если вы хотите просто считать код ключа, а не программировать его, то закомментируйте строку "remove when ready to programm". При подключении ключа в консоль вывалится считанный код.
Таким образом, можно создать дубликат любого ключа или сделать свой мастер-ключ, если вам известен его код.
Простота устройства, дешевизна изготовления, надежность (нечему ломаться) привело к тому, что данные ключи стали использоваться повсеместно. Начиная от домофонов и заканчивая автомобильными сигнализациями.
Многие производители считывающих устройств поддерживают так называемые "мастер ключи" - т.е. универсальные коды ключей. Такие обычно выдают обслуживающим организациям для доступа в подъезд. Вот некоторые из них, что можно найти в открытом доступе:
01:BE:40:11:5A:36:00:E1
FF:FF:FF:FF:FF:FF
00:36:5A:11:40:BE
00:00:00:FE:D4:53
00:00:00:00:00:00
00:00:00:01:FF:FF
00:00:09:3С:E4:A9
00:00:FF:FF:FF:FF
00:00:AA:11:BE:00
00:00:0F:2E:B8:76
FF:FF:FF:FF:FF
36:5A:11:40:BE
01:FF:FF:FF:FF
36:5A:39:81:49
00:00:00:00:00
01:FF:FF:FF:FF
56:5A:11:40:BE
36:5A:39:81:49
00:00:00:00:00
0B:57:81:46:01
C9:8E
Соберем программатор для записи ключей. Нам потребуются болванки. В продаже часто встречаются DS1990 и TM2004. TM2004 - можно перезописывать, если не произведена финализация (подача 9 вольт). После финализации ключ сохраняется на вечно.
Программировать будем через Arduino Uno. Подключается ключ на 16 ногу и подтягивается к плюсу. Второй конец ключа на землю.
Скетч программы для Arduino записывает каждый бит отдельно:
include <OneWire.h>
#define pin 10
byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };
OneWire ds(pin); // pin 10 is 1-Wire interface pin now
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte data[8];
delay(1000); // 1 sec
ds.reset();
delay(50);
ds.write(0x33); // "READ" command
ds.read_bytes(data, 8);
Serial.print("KEY ");
for( i = 0; i < 8; i++) {
Serial.print(data[i], HEX);
if (i != 7) Serial.print(":");
}
// Check if FF:FF:FF:FF:FF:FF:FF:FF
// If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
{
Serial.println("...nothing found!");
return;
}
return; // remove when ready to programm
// Check if read key is equal to the one to be programmed
for (i = 0; i < 8; i++)
if (data[i] != key_to_write[i])
break;
else
if (i == 7)
{
Serial.println("...already programmed!");
return;
}
Serial.println();
Serial.print("Programming new key...");
for (uint8_t i = 0; i < 8; i++)
{
ds.reset();
data[0] = 0x3C; // "WRITE" command
data[1] = i; // programming i-th byte
data[2] = 0;
data[3] = key_to_write[i];
ds.write_bytes(data, 4);
Serial.print(".");
uint8_t crc = ds.read();
if (OneWire::crc8(data, 4) != crc) {
Serial.print("error!\r\n");
return;
}
else
Serial.print(".");
send_programming_impulse();
}
Serial.println("done!");
}
void send_programming_impulse()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
delay(60);
digitalWrite(pin, LOW);
delay(5);
digitalWrite(pin, HIGH);
delay(50);
}
Если вы хотите просто считать код ключа, а не программировать его, то закомментируйте строку "remove when ready to programm". При подключении ключа в консоль вывалится считанный код.
Таким образом, можно создать дубликат любого ключа или сделать свой мастер-ключ, если вам известен его код.
Датчик атмосферного давления, влажности и температуры BME280
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-43363264_482771&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-43363264_482771&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
Простые часы на ESp8266 +Oled display
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
Для сборки потребуется :
Плата NodeMcu v3 https://alii.pub/5wwx2u
0.96" I2C OLED Display https://ali.pub/54jn2p
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
aliexpress.com
0.98€ 20% OFF|Nieuwe Draadloze Module CH340 Nodemcu V3 Lua Wifi Internet Van Dingen Development Board Gebaseerd ESP8266|nodemcu…
Smarter Shopping, Better Living! Aliexpress.com
MQ-135 Gas Sensor - это простой в использование датчик газа, широко применяются в робототехнике и системах автоматизации, подходит для Arduino проектов. Еще его называют датчик углекислого газа.
US $0.91
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738&from_content=wall_-107877557_124033&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
US $0.91
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738&from_content=wall_-107877557_124033&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
aliexpress.ru
MQ-135 Air quality and hazardous gas detection sensor alarm module MQ135 module | Электронные компоненты и принадлежности | АлиЭкспресс
MQ-135 Air quality and hazardous gas detection sensor alarm module MQ135 module, Наслаждайся ✓Бесплатная доставка по всему миру! ✓Предложение ограничено по времени! ✓Удобный возврат!
MQ-135 Gas Sensor - это простой в использование датчик газа, широко применяются в робототехнике и системах автоматизации, подходит для Arduino проектов. Еще его называют датчик углекислого газа.
US $0.91
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738&from_content=wall_-43363264_503668&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
US $0.91
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738
#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
MQ135 gasSensor = MQ135(A0);
int val;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.display();
}
void loop() {
val = analogRead(A0);
Serial.print ("raw = ");
Serial.println (val);
// float zero = gasSensor.getRZero();
// Serial.print ("rzero: ");
//Serial.println (zero);
float ppm = gasSensor.getPPM();
Serial.print ("ppm: ");
Serial.println (ppm);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18,43);
display.println("CO2");
display.setCursor(63,43);
display.println("(PPM)");
display.setTextSize(2);
display.setCursor(28,5);
display.println(ppm);
display.display();
display.clearDisplay();
delay(2000);
}
https://aliclick.shop/r/c/1r0ry1kr5ysnxijo?product_id=32728440738&from_content=wall_-43363264_503668&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
aliexpress.ru
MQ-135 Air quality and hazardous gas detection sensor alarm module MQ135 module | Электронные компоненты и принадлежности | АлиЭкспресс
MQ-135 Air quality and hazardous gas detection sensor alarm module MQ135 module, Наслаждайся ✓Бесплатная доставка по всему миру! ✓Предложение ограничено по времени! ✓Удобный возврат!
Датчик атмосферного давления, влажности и температуры BME280
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-107877557_134072&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-107877557_134072&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
Простые часы на ESp8266 +Oled display
Для сборки потребуется :
Плата NodeMcu v3 https://alli.pub/6ca8io
0.96" I2C OLED Display https://alli.pub/6ca8iv
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
Для сборки потребуется :
Плата NodeMcu v3 https://alli.pub/6ca8io
0.96" I2C OLED Display https://alli.pub/6ca8iv
Провода для спайки
Код
#include
#include
#include
#include
#include
#include
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
const char* ssid = "имя сети";
const char* password = "пароль от вай-фая";
int ledPin = 13;
int timezone = 7 * 3600;
int dst = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer.
display.clearDisplay();
display.display();
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.begin(115200);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Wifi connecting to ");
display.println( ssid );
WiFi.begin(ssid,password);
display.println("\nConnecting");
display.display();
while( WiFi.status() != WL_CONNECTED ){
delay(500);
display.print(".");
display.display();
}
// Clear the buffer.
display.clearDisplay();
display.display();
display.setCursor(0,0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP() );
display.display();
configTime(timezone, dst, "pool.ntp.org","time.nist.gov");
display.println("\nWaiting for NTP...");
while(!time(nullptr)){
Serial.print("*");
delay(1000);
}
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print(p_tm->tm_mday);
Serial.print("/");
Serial.print(p_tm->tm_mon + 1);
Serial.print("/");
Serial.print(p_tm->tm_year + 1900);
Serial.print(" ");
Serial.print(p_tm->tm_hour);
Serial.print(":");
Serial.print(p_tm->tm_min);
Serial.print(":");
Serial.println(p_tm->tm_sec);
// Clear the buffer.
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print(p_tm->tm_hour);
display.print(":");
if( p_tm->tm_min <10)
display.print("0");
display.print(p_tm->tm_min);
display.setTextSize(2);
display.setCursor(90,5);
display.print(".");
if( p_tm->tm_sec <10)
display.print("0");
display.print(p_tm->tm_sec);
display.setTextSize(1);
display.setCursor(0,40);
display.print(p_tm->tm_mday);
display.print("/");
display.print(p_tm->tm_mon + 1);
display.print("/");
display.print(p_tm->tm_year + 1900);
display.display();
delay(1000); // update every 1 sec
}
aliexpress.com
0.82US $ 25% OFF|New Wireless Module Ch340 Nodemcu V3 Lua Wifi Internet Of Things Development Board Based Esp8266 - Integrated…
Smarter Shopping, Better Living! Aliexpress.com
👍4👎1
Датчик атмосферного давления, влажности и температуры BME280
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-43363264_556423&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
US $2.08
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
#include
#include
// подключение библиотек
#include
#include
#include
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1="";
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1="Temp=";
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+" *C";
oled.print(txt1, CENTER, 10);
// влажность
txt1="Hum=";
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+" %";
oled.print(txt1, CENTER, 25);
// давление
txt1="P=";
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+" hPa";
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
https://aliclick.shop/r/c/1qvw6uhprx3n7bi9?product_id=1005002434252889&from_content=wall_-43363264_556423&gaid=bfc0fd12-544f-4bc8-96c7-c6e5f5a06353&sns_params=%7B%22vk_id%22%3A10943591%2C%22exps%22%3A%5B%5D%7D
👍2
Название проекта: О'кей Google, Сезам, открой дверь
Платформа: Arduino
Описание:
В проекте реализовано открывание двери с помощью голосовой команды. Чтобы попасть в дом, нужно просто сказать: "Сезам, откройся".
Использованные компоненты: Arduino UNO, cерводвигатель , Bluetooth-модуль HC-05
Купить комплектующие на Алиэкспресс :
Сервопривод https://aliclick.shop/r/c/1r4jf5zc7fwoz4bw?product_id=1005001265737959
Arduino uno r3 https://aliclick.shop/r/c/1r4jf6t3ou7yo90h?product_id=1005002379248792
Bluetooth HC-05 https://aliclick.shop/r/c/1r4jf8z62a6ii0km?product_id=32786773297
Сайт проекта: https://dheera.net/projects/sesame
Отличный DIY-проект, в котором использована базовая схема подключения серводвигателя к arduino. Сделай сам умный дом и интернет вещей.
Для разблокирования дверей студент MIT использовал команды Google Now.
Мейкер создал приложение для мобильных устройств, которое окрестили именем «Сезам». Теперь чтобы открыть дверь, ему нужно просто произнести слова: "О'кей Google, Сезам, откройся". Приложение, установленное на android-часах, которые он носит на запястье, отдает команду дверному замку.
Для реализации идеи на двери размещены: плата Arduino Uno (ATmega328), bluetooth-модуль и сервопривод. Сервопривод прикреплен к дверной защелке, а модуль bluetooth ожидает сигнал и при его получении отдает команду arduino через serial-порт. Arduino в свою очередь отдает команду сервоприводу.
Скетч для ардуино
#include
#define SERVO_PIN 9
Servo servo;
void setup() {
Serial.begin(9600);
}
void loop() {
char inputLine[200];
int bytesRead;
String argv[10];
char* i;
if (Serial.available()) {
bytesRead=Serial.readBytesUntil('n',inputLine,200);
inputLine[bytesRead]=0;
if(inputLine[bytesRead-1]=='r') inputLine[bytesRead-1]=0;
argv[0]=strtok_r(inputLine," ",&i);
argv[1]=strtok_r(NULL," ",&i);
if(argv[0]=="ping") {
Serial.write("pongrn");
} else if(argv[0]=="write") {
servo.attach(SERVO_PIN);
servo.write(argv[1].toInt());
delay(2000);
servo.detach();
}
}
}
https://youtu.be/JfZt8_a6fVY
https://alii.pub/5qsovr
Платформа: Arduino
Описание:
В проекте реализовано открывание двери с помощью голосовой команды. Чтобы попасть в дом, нужно просто сказать: "Сезам, откройся".
Использованные компоненты: Arduino UNO, cерводвигатель , Bluetooth-модуль HC-05
Купить комплектующие на Алиэкспресс :
Сервопривод https://aliclick.shop/r/c/1r4jf5zc7fwoz4bw?product_id=1005001265737959
Arduino uno r3 https://aliclick.shop/r/c/1r4jf6t3ou7yo90h?product_id=1005002379248792
Bluetooth HC-05 https://aliclick.shop/r/c/1r4jf8z62a6ii0km?product_id=32786773297
Сайт проекта: https://dheera.net/projects/sesame
Отличный DIY-проект, в котором использована базовая схема подключения серводвигателя к arduino. Сделай сам умный дом и интернет вещей.
Для разблокирования дверей студент MIT использовал команды Google Now.
Мейкер создал приложение для мобильных устройств, которое окрестили именем «Сезам». Теперь чтобы открыть дверь, ему нужно просто произнести слова: "О'кей Google, Сезам, откройся". Приложение, установленное на android-часах, которые он носит на запястье, отдает команду дверному замку.
Для реализации идеи на двери размещены: плата Arduino Uno (ATmega328), bluetooth-модуль и сервопривод. Сервопривод прикреплен к дверной защелке, а модуль bluetooth ожидает сигнал и при его получении отдает команду arduino через serial-порт. Arduino в свою очередь отдает команду сервоприводу.
Скетч для ардуино
#include
#define SERVO_PIN 9
Servo servo;
void setup() {
Serial.begin(9600);
}
void loop() {
char inputLine[200];
int bytesRead;
String argv[10];
char* i;
if (Serial.available()) {
bytesRead=Serial.readBytesUntil('n',inputLine,200);
inputLine[bytesRead]=0;
if(inputLine[bytesRead-1]=='r') inputLine[bytesRead-1]=0;
argv[0]=strtok_r(inputLine," ",&i);
argv[1]=strtok_r(NULL," ",&i);
if(argv[0]=="ping") {
Serial.write("pongrn");
} else if(argv[0]=="write") {
servo.attach(SERVO_PIN);
servo.write(argv[1].toInt());
delay(2000);
servo.detach();
}
}
}
https://youtu.be/JfZt8_a6fVY
https://alii.pub/5qsovr
👍1