Посмотрел фото дисплея из поста 211. А точно подсветка отделилась от дисплея?
…может просто отделил экран от платы?
Посмотрел фото дисплея из поста 211. А точно подсветка отделилась от дисплея?
из 220 ?)))
подсветка - 2 диода остались на экране, тут даже если не разбирать дисплей такая пелена есть, дело не в подсветке…
так как я лентяй, резистор не ставил…))
Нет, из 211. Там слой самого дисплея от подложки-подсветки удалось отделить?
Поэтому полосы и т.д.
удалось отделить все кроме наклейки от платы, как в 222 на фото, где надпись Подсветка тут осталась, это наклейка служит для отражения света диодов, и за ней шлейф экрана припаян, я ее оставил что бы случайно не замкнуть пины…
ну проектор у вас кажется готов))))
будите объединять все кода ?)))
судя по фото вижу испытываете проблемы с освещением… по краям…
если возьмете картон, и в нем дисплей разместите, наведя большое пятно света от фонарика , что бы полностью распределился по всему экрану, остальное картон не пропустил, картинка будет хуже ? еще ярче фонарик нужен ?
если брать ленту адресную, или панель, даже добавляя пленку для рассеивания, одни части рисунка более светлые выходят чем другие… и просматривается несколько ярких пятен…
Это вопрос качества-количества оптики и выдержки руками главной оптической оси ![]()
Схема такая
Это не классика диаскопостроения, нужен точечный источник ![]()

Ещё вариант увеличения линейных размеров использование просмотровой лупы. Логично увеличивать диаметр изображения до диаметра лупы, тут 6см. А вообще продают до 10 кажется ![]()
https://www.wildberries.ru/catalog/535515016/detail.aspx
…для равновесия системы желательно класть болт в нужное место.
мне тут про библиотеку одну напомнили)))
если ЫЫ все правильно сделал, можно посмотреть на стартовую картинку для генерации изображения в браузере
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
// Настройки точки доступа ESP32
const char* ap_ssid = "ESP32_Voronoi";
const char* ap_password = "12345678";
AsyncWebServer server(80);
// HTML страница с ПРАВИЛЬНОЙ анимацией
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
body {
margin: 0;
padding: 0;
background: black;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
overflow: hidden;
}
#container {
text-align: center;
}
canvas {
display: block;
width: min(95vw, 95vh);
height: min(95vw, 95vh);
border-radius: 50%;
box-shadow: 0 0 30px rgba(0,255,255,0.3);
}
#status {
color: #0ff;
margin-top: 20px;
font-family: monospace;
font-size: 14px;
}
</style>
</head>
<body>
<div id="container">
<canvas id="voronoiCanvas" width="400" height="400"></canvas>
<div id="status">Анимация запущена...</div>
</div>
<script>
const canvas = document.getElementById('voronoiCanvas');
const ctx = canvas.getContext('2d');
const statusEl = document.getElementById('status');
// Размер канваса
const SIZE = 400;
const CENTER = 200;
// Точки Вороного
let points = [];
const NUM_POINTS = 12;
let frame = 0;
// Инициализация точек
function initPoints() {
points = [];
for (let i = 0; i < NUM_POINTS; i++) {
points.push({
x: Math.random() * SIZE,
y: Math.random() * SIZE,
r: Math.random() * 255,
g: Math.random() * 255,
b: Math.random() * 255,
dx: (Math.random() - 0.5) * 2, // скорость движения
dy: (Math.random() - 0.5) * 2,
dr: (Math.random() - 0.5) * 5, // скорость изменения цвета
dg: (Math.random() - 0.5) * 5,
db: (Math.random() - 0.5) * 5
});
}
}
// Обновление точек (движение + изменение цвета)
function updatePoints() {
for (let p of points) {
// Движение
p.x += p.dx;
p.y += p.dy;
// Отскок от границ
if (p.x < 0 || p.x > SIZE) p.dx *= -1;
if (p.y < 0 || p.y > SIZE) p.dy *= -1;
// Изменение цвета
p.r += p.dr;
p.g += p.dg;
p.b += p.db;
// Ограничение цвета и отскок
if (p.r < 0 || p.r > 255) p.dr *= -1;
if (p.g < 0 || p.g > 255) p.dg *= -1;
if (p.b < 0 || p.b > 255) p.db *= -1;
// Ограничение координат
p.x = Math.max(0, Math.min(SIZE, p.x));
p.y = Math.max(0, Math.min(SIZE, p.y));
p.r = Math.max(0, Math.min(255, p.r));
p.g = Math.max(0, Math.min(255, p.g));
p.b = Math.max(0, Math.min(255, p.b));
}
}
// Функция расстояния (Евклидово)
function distance(x1, y1, x2, y2) {
return Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
// Отрисовка кадра
function drawFrame() {
frame++;
// Обновляем позиции точек (КАЖДЫЙ КАДР)
updatePoints();
// Очищаем экран
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, SIZE, SIZE);
// Получаем данные изображения для пиксельной отрисовки
const imageData = ctx.getImageData(0, 0, SIZE, SIZE);
const data = imageData.data;
// Перебираем каждый пиксель (КАЖДЫЙ КАДР)
for (let y = 0; y < SIZE; y++) {
for (let x = 0; x < SIZE; x++) {
// Проверяем, находится ли пиксель в круге
let dx = x - CENTER;
let dy = y - CENTER;
let distFromCenter = Math.sqrt(dx*dx + dy*dy);
if (distFromCenter <= CENTER) {
// Находим ближайшую точку Вороного
let minDist = Infinity;
let closestPoint = null;
for (let p of points) {
let d = distance(x, y, p.x, p.y);
if (d < minDist) {
minDist = d;
closestPoint = p;
}
}
if (closestPoint) {
// Добавляем эффект пульсации от времени
let pulse = Math.sin(frame * 0.1) * 20;
// Вычисляем цвет
let r = Math.min(255, Math.max(0, closestPoint.r - minDist + pulse));
let g = Math.min(255, Math.max(0, closestPoint.g - minDist));
let b = Math.min(255, Math.max(0, closestPoint.b - minDist + pulse * 0.5));
// Записываем пиксель
let idx = (y * SIZE + x) * 4;
data[idx] = r;
data[idx + 1] = g;
data[idx + 2] = b;
data[idx + 3] = 255;
}
}
}
}
// Применяем изменения
ctx.putImageData(imageData, 0, 0);
// Добавляем спиральный эффект поверх (как в оригинале)
ctx.save();
ctx.translate(CENTER, CENTER);
ctx.rotate(frame * 0.02); // вращаем каждый кадр
for (let i = 0; i < 12; i++) {
ctx.rotate(Math.PI / 6);
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(CENTER - 20, 0);
ctx.strokeStyle = `rgba(255,255,255,0.1)`;
ctx.lineWidth = 2;
ctx.stroke();
}
ctx.restore();
// Обновляем статус
statusEl.textContent = `Кадр: ${frame} | Точек: ${points.length} | Анимация: ✓`;
// Запрашиваем следующий кадр (ЭТО СОЗДАЕТ АНИМАЦИЮ)
requestAnimationFrame(drawFrame);
}
// Запуск анимации
console.log("Запуск анимации...");
initPoints();
drawFrame();
// Обработка ошибок
window.onerror = function(msg, url, line) {
statusEl.textContent = "Ошибка: " + msg;
console.error(msg);
};
</script>
</body>
</html>
)rawliteral";
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n\n=== ESP32 Voronoi АНИМАЦИЯ ===");
// Настройка точки доступа
WiFi.softAP(ap_ssid, ap_password);
IPAddress IP = WiFi.softAPIP();
Serial.print("Точка доступа: ");
Serial.println(ap_ssid);
Serial.print("IP адрес: http://");
Serial.println(IP);
// Запуск сервера
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", index_html);
});
server.begin();
Serial.println("\n=== ГОТОВО ===");
Serial.println("1. Подключитесь к WiFi: " + String(ap_ssid));
Serial.println("2. Откройте браузер по адресу: http://" + IP.toString());
Serial.println("3. ДОЛЖНА БЫТЬ НЕПРЕРЫВНАЯ АНИМАЦИЯ!");
Serial.println(" (точки двигаются, цвета меняются, всё плавно)");
}
void loop() {
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 5000) {
lastMsg = millis();
Serial.println("🔄 Анимация передается на телефон... (проверьте браузер)");
}
}
а если рисовать в веб браузере, пока дисплея у вас еще нет, + там может освещение лучше…
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
const char* ap_ssid = "ESP32_Voronoi";
const char* ap_password = "12345678";
AsyncWebServer server(80);
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
body {
margin: 0;
padding: 0;
background: black;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: monospace;
}
canvas {
display: block;
width: min(95vw, 95vh);
height: min(95vw, 95vh);
border-radius: 50%;
box-shadow: 0 0 30px cyan;
}
#status {
position: absolute;
bottom: 20px;
color: cyan;
font-size: 14px;
}
</style>
</head>
<body>
<canvas id="voronoiCanvas" width="240" height="240"></canvas>
<div id="status">Рисование...</div>
<script>
const canvas = document.getElementById('voronoiCanvas');
const ctx = canvas.getContext('2d');
const statusEl = document.getElementById('status');
const CENTER_X = 120;
const CENTER_Y = 120;
const Z = 300.0;
const NUM_POINTS = 12;
let points = [];
let variant = 1;
let Y = 0;
let currentF1 = 0;
let currentR1 = 0;
let lastFrameTime = 0;
let batchSize = 30;
function dist(x1, y1, x2, y2, m) {
if (m == 1) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
if (m == 2) {
return Math.abs(x1 - x2) + Math.abs(y2 - y1);
}
if (m == 3) {
return Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2));
}
return 0;
}
function ran_Sait(variant) {
for (let i = 0; i < NUM_POINTS; i++) {
if (!points[i]) points[i] = {};
if (variant == 1 || variant == 3) {
points[i].x = Math.floor(Math.random() * 120) + CENTER_X;
points[i].y = Math.floor(Math.random() * 60) + CENTER_Y;
} else {
points[i].x = Math.floor(Math.random() * 240);
points[i].y = Math.floor(Math.random() * 240);
}
if (variant == 2 || variant == 3) {
points[i].R = Math.floor(Math.random() * 256);
points[i].G = Math.floor(Math.random() * 256);
points[i].B = Math.floor(Math.random() * 256);
} else {
points[i].R = Math.floor(Math.random() * 256);
points[i].G = Math.floor(Math.random() * 256);
points[i].B = Math.floor(Math.random() * 256);
}
}
}
function drawPixel(x, y, r, g, b) {
if (x < 0 || x >= 240 || y < 0 || y >= 240) return;
ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;
ctx.fillRect(x, y, 1, 1);
}
function drawBatch() {
let now = Date.now();
if (now - Y > 90000) {
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, 240, 240);
Y = now;
statusEl.textContent = 'Очистка экрана...';
}
for (let b = 0; b < batchSize; b++) {
if (currentF1 > Math.PI / 6.0) {
currentF1 = 0;
currentR1 = 0;
variant = (variant % 3) + 1;
ran_Sait(3);
let metricName = "";
if (variant == 1) metricName = "Евклидова";
else if (variant == 2) metricName = "Манхэттенская";
else metricName = "Чебышева";
statusEl.textContent = `Метрика: ${metricName} | Сектор готов`;
break;
}
let x = Math.floor(CENTER_X + Math.cos(currentF1) * currentR1);
let y = Math.floor(CENTER_Y + Math.sin(currentF1) * currentR1);
if (x >= 0 && x < 240 && y >= 0 && y < 240) {
let closestPoint = 0;
let minDist = dist(x, y, points[0].x, points[0].y, variant);
for (let i = 1; i < NUM_POINTS; i++) {
let d = dist(x, y, points[i].x, points[i].y, variant);
if (d < minDist) {
minDist = d;
closestPoint = i;
}
}
for (let angle = 0.01; angle <= 2 * Math.PI; angle += Math.PI / 3.0) {
if (minDist > 15) {
let df = (1.2 * currentR1) / 120;
let x1 = Math.floor(CENTER_X + Math.cos(currentF1 + angle + df) * currentR1);
let y1 = Math.floor(CENTER_Y + Math.sin(currentF1 + angle + df) * currentR1);
if (x1 >= 0 && x1 < 240 && y1 >= 0 && y1 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x1, y1, r, g, b);
}
let x2 = Math.floor(CENTER_X + Math.cos(2 * Math.PI - currentF1 + angle + df) * currentR1);
let y2 = Math.floor(CENTER_Y + Math.sin(2 * Math.PI - currentF1 + angle + df) * currentR1);
if (x2 >= 0 && x2 < 240 && y2 >= 0 && y2 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x2, y2, r, g, b);
}
}
}
}
currentR1++;
if (currentR1 > 120) {
currentR1 = 0;
currentF1 += Math.PI / Z;
}
}
}
function animationLoop() {
drawBatch();
requestAnimationFrame(animationLoop);
}
ran_Sait(3);
Y = Date.now();
animationLoop();
</script>
</body>
</html>
)rawliteral";
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("=== ESP32 Voronoi FULL Animation ===");
WiFi.softAP(ap_ssid, ap_password);
IPAddress IP = WiFi.softAPIP();
Serial.print("SSID: ");
Serial.println(ap_ssid);
Serial.print("IP: http://");
Serial.println(IP);
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", index_html);
});
server.begin();
Serial.println("Server started!");
}
void loop() {
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 10000) {
lastMsg = millis();
Serial.println("Полная анимация в браузере...");
}
}
мне удалось передать всю полноту картины ?))) или опять анимация не полная ?
кстате работает и без связи с esp32 по wifi кажется… но в начале надо подключиться и загрузить сервер…
если нечего не поломал, и интересно, могу попытаться объединить кучу ваших кодов…
p.s. за основу брал это
а еще интересно если я все таки не поломал анимацию, это магия арм архитектуры, или просто сложный код, и на пк так же все будет ?
тестить времени нет, сегодня устал от кода))) но если что, библиотека эта отличная, напишите если что нужно, я попробую добавить…
Не знаю, я попробовал скомпилировать скетч, не пошло. Сначала выскочила запись - нет файлов библиотеки “ESPAsyncWebServer.h”. Скачал, вставил в папку со скетчем (24!!! файла). Потом выскочила запись - нет “AsyncTCP.h”, добавил ещё 2 файла этой библиотеки. Но по прежнему файла AsyncTCP.h нет
хотя он есть.
…как я понял на гитхабе надо зарегистрироваться, чтоб этот файл заработал?
… так что проще самому вам фотки выложить из браузера, или пакет своих файлов библиотеки кинуть.
Кстати, раз ИИ наше всё. Может попробовать без МК, просто код в файле с расширением HTML ему поручить. Вот мне тут давали ходилку-иллюстрацию пары ног паука. Открывается браузером для работы и блокнотом для чтения кода.
<HTML>
<HEAD>
<TITLE>Bhla Bhla</TITLE>
<meta charset="utf-8">
<style>
div#circle {
position: relative;
display: block;
border-radius: 50%;
background: linear-gradient(#fff, transparent 1px), linear-gradient(90deg, #fff, #bdb 1px);
background-size: 10mm 10mm;
background-position: 0 0;
transform: perspective(140mm) rotateX(60deg) translateZ(-8mm);
transform-style: preserve-3d;
perspective-origin: center bottom;
}
div#circle>div {
position: absolute;
display: block;
width: 4mm;
height: 4mm;
font-size: 3mm;
line-height: 4mm;
font-weight: bold;
border: 1mm solid #777;
color: #777;
border-radius: 3mm;
margin: -3mm 0 0 -3mm;
text-align: center;
background: #fff;
}
div#circle>div.floating {
border-color: #37f;
color: #37F;
}
div#circle>div.landed {
border-color: #f33;
color: #f33;
}
div#circle>div#S {
border-color: #fa3;
color: #fa3;
}
div#joystick {
display: inline-block;
width: 70mm;
height: 70mm;
background: radial-gradient(circle at center, #da0 0, #da0 2.5mm, transparent 2.5mm),
repeating-linear-gradient(90deg, transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%),
repeating-linear-gradient(transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%), #333;
}
</style>
</HEAD>
<BODY>
<div id="circle">
<div id="A" class="landed">A</div>
<div id="B" class="landed">B</div>
</div>
<div id="joystick"></div>
<script type="text/javascript">
var right_x = 0;
var right_y = 0;
var bg_x = 0;
var bg_y = 0;
document.getElementById('joystick').onmousemove = function(e) {
var rect = e.target.getBoundingClientRect();
right_x = Math.round((e.clientX - rect.left - rect.width / 2) / rect.width * 2000);
right_y = Math.round((rect.height / 2 - e.clientY + rect.top) / rect.height * 2000);
e.target.style.background = "radial-gradient(circle at " + String(e.clientX - rect.left)+"px "+String(e.clientY - rect.top)+"px, #da0 0, #da0 2.5mm, transparent 2.5mm),"
+ "repeating-linear-gradient(90deg, transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%),"
+ "repeating-linear-gradient(transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%), #333";
}
document.getElementById('joystick').onmouseout = function(e) {
right_x = 0;
right_y = 0;
e.target.style.background = "radial-gradient(circle at center, #da0 0, #da0 2.5mm, transparent 2.5mm),"
+ "repeating-linear-gradient(90deg, transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%),"
+ "repeating-linear-gradient(transparent, transparent 49.75%, #888 50%, transparent 50.25%, transparent 100%), #333";
}
function circle(r, dx, dy) {
var circ = document.getElementById("circle");
circ.style.height = r * 2 + "mm";
circ.style.width = r * 2 + "mm";
bg_x = (bg_x + dx) % 10;
bg_y = (bg_y + dy) % 10;
circ.style.backgroundPosition = bg_x + "mm " + bg_y + "mm";
}
function pos (el, x, y, z = 0) {
el.style.left = x + "mm";
el.style.top = y + "mm";
el.style.transform = "translateZ(" + z + "mm)";
}
function hypot (dx, dy) { return Math.hypot(dx, dy); }
function max (x, y) { return Math.max(x, y); }
function abs (x) { return Math.abs(x); }
function min (x, y) { return Math.min(x, y); }
function sqrt (x) { return Math.sqrt(x); }
// МАГИЯ ТУТ
function div (val, divider) { return divider > 0 ? val / divider : 0; }
var max_radius = 35;
var max_height = 30;
// максимальные скорость в мм/с и ускорение в мм/с², отмасштабированные до периода итераций 20мс
var maximum_velocity_value = 100 / 50; // за 1 / 50 секунды
var maximum_acceleration_value = 75 / 2500; // за 1 / 2500 секунды за секунду
// текущий вектор скорости
var current_velocity_dx = 0;
var current_velocity_dy = 0;
// координаты находящейся на поверхности конечности
var landed_limb_x = 0;
var landed_limb_y = 0;
// координаты поднятой конечности
var floating_limb_x = 0;
var floating_limb_y = 0;
// фаза
var phase = true;
function calc() {
// ПОЛУЧЕНИЕ ДАННЫХ С ДЖОЙСТИКА -1000..1000
var joystick_dx = right_x;
var joystick_dy = right_y;
var joystick_dl = hypot(joystick_dx, joystick_dy);
// получение единичного вектора желаемого направления
var setpoint_velocity_cos = div(joystick_dx, joystick_dl);
var setpoint_velocity_sin = div(joystick_dy, joystick_dl);
// получение нормализованного значения отклонения джойстика
var joystick_normalized_value = div(joystick_dl, hypot(min(abs(joystick_dx), abs(joystick_dy)), 1000));
// получение значения желаемой скорости
var setpoint_velocity_value = joystick_normalized_value * maximum_velocity_value;
// преобразование данных джойстика в вектор целевой скорости "setpoint_velocity"
var setpoint_velocity_dx = setpoint_velocity_cos * setpoint_velocity_value;
var setpoint_velocity_dy = setpoint_velocity_sin * setpoint_velocity_value;
// ВЫЧИСЛЕНИЕ ВЕКТОРА СКОРОСТИ ПРИЗЕМЛЕННОЙ КОНЕЧНОСТИ
// текущий вектор скорости "current_velocity" переходит в "setpoint_velocity" с заданным ускорением
// определение вектора из конца "current_velocity" в конец "setpoint_velocity"
var to_setpoint_dx = setpoint_velocity_dx - current_velocity_dx;
var to_setpoint_dy = setpoint_velocity_dy - current_velocity_dy;
var to_setpoint_dl = hypot(to_setpoint_dx, to_setpoint_dy);
if (to_setpoint_dl > maximum_acceleration_value) {
// если длина найденного вектора превышает значение максимального ускорения за итерацию
// вектор ускорения применяется к текущей скорости
current_velocity_dx += div(to_setpoint_dx, to_setpoint_dl) * maximum_acceleration_value;
current_velocity_dy += div(to_setpoint_dy, to_setpoint_dl) * maximum_acceleration_value;
} else {
// длина вектора меньше максимального ускорения за итерацию,
// применение вектора длиной maximum_acceleration_value вызовет перемещение дальше требуемого значения
// поэтому "current_velocity" просто приравнивается к "setpoint_velocity"
current_velocity_dx = setpoint_velocity_dx;
current_velocity_dy = setpoint_velocity_dy;
}
// ВЫЧИСЛЕНИЕ ВЕКТОРА СКОРОСТИ ПОДНЯТОЙ КОНЕЧНОСТИ
var floating_velocity_dx = 0;
var floating_velocity_dy = 0;
// текущая скорость
var current_velocity_value = hypot(current_velocity_dx, current_velocity_dy);
if (current_velocity_value != 0) {
// определение целевой позиции поднятой конечности - на краю окружности в направлении current_velocity
var floating_target_x = div(current_velocity_dx, current_velocity_value) * max_radius;
var floating_target_y = div(current_velocity_dy, current_velocity_value) * max_radius;
// текущее расстояние от центра до позиции приземленной конечности
var center_to_landed_limb_distance = hypot(landed_limb_x, landed_limb_y);
// конечность движется в направлении, обратном движению - вычисляем косинус угла между векторами landed_limb и -current_velocity
var cos = div(landed_limb_x * -current_velocity_dx + landed_limb_y * -current_velocity_dy, center_to_landed_limb_distance * current_velocity_value);
// расстояние - сторона треугольника напротив угла с найденным косинусом, к которому прилегают стороны center_to_landed_limb_distance и max_radius
var landed_to_out_distance = sqrt(center_to_landed_limb_distance * center_to_landed_limb_distance + max_radius * max_radius - 2 * cos * center_to_landed_limb_distance * max_radius);
// определение векора из текущего положения поднятой конечности в ее целевую позицию
var to_floating_target_dx = floating_target_x - floating_limb_x;
var to_floating_target_dy = floating_target_y - floating_limb_y;
var to_floating_target_dl = hypot(to_floating_target_dx, to_floating_target_dy);
// определение значения скорости поднятой конечности, необходимой чтобы успеть переместиться в целевую позицию
var floating_velocity_value = to_floating_target_dl * current_velocity_value / landed_to_out_distance;
// определение вектора скорости поднятой конечности
floating_velocity_dx = div(to_floating_target_dx, to_floating_target_dl) * floating_velocity_value;
floating_velocity_dy = div(to_floating_target_dy, to_floating_target_dl) * floating_velocity_value;
}
// СМЕНА ФАЗ ПРИ ПРИБЛИЖЕНИИ ПРИЗЕМЛЕННОЙ КОНЕЧНОСТИ К КРАЮ ОКРУЖНОСТИ
// не перешагнет ли край окружности при приращении координат на значения вектора скорости?
if (hypot(landed_limb_x - current_velocity_dx, landed_limb_y - current_velocity_dy) >= max_radius) {
// смена роли конечностей и фазы
var temp = landed_limb_x;
landed_limb_x = floating_limb_x;
floating_limb_x = temp;
temp = landed_limb_y;
landed_limb_y = floating_limb_y;
floating_limb_y = temp;
phase = !phase;
}
// ПЕРЕМЕЩЕНИЕ ПО ПОЛУЧЕННЫМ ВЕКТОРАМ СКОРОСТИ
landed_limb_x -= current_velocity_dx;
landed_limb_y -= current_velocity_dy;
floating_limb_x += floating_velocity_dx;
floating_limb_y += floating_velocity_dy;
// ВЫЧИСЛЕНИЕ ВЫСОТЫ ОТ ПОВЕРХНОСТИ ДЛЯ ПОДНЯТОЙ КОНЕЧНОСТИ
// множитель высоты поднятой конечности f(x) = 1 - (x - 1)² где x = 0..1 удаленность поднятой конечности от радиуса
var height_scale = (1 - (floating_limb_x * floating_limb_x + floating_limb_y * floating_limb_y) / (max_radius * max_radius));
// второй множитель - отношение текущей скорости к максимально возможной
height_scale *= current_velocity_value / maximum_velocity_value;
// итоговая высота
var floating_limb_height = height_scale * max_height;
// ОТОБРАЖЕНИЕ
/* актуальное значение скорости
console.log(Math.floor(Date.now() / 1000 % 100) + " velocity: " + Math.round(current_velocity_value*50*100)/100 + "mm/s");/**/
circle(max_radius, -current_velocity_dx, current_velocity_dy);
if (phase) {
pos(A, max_radius + landed_limb_x, max_radius - landed_limb_y);
pos(B, max_radius + floating_limb_x, max_radius - floating_limb_y, floating_limb_height);
A.className = "landed";
B.className = floating_limb_height > 0 ? "floating" : "landed";
} else {
pos(A, max_radius + floating_limb_x, max_radius - floating_limb_y, floating_limb_height);
pos(B, max_radius + landed_limb_x, max_radius - landed_limb_y);
A.className = floating_limb_height > 0 ? "floating" : "landed";
B.className = "landed";
}
}
var timerId = null;
timerId = setInterval(calc, 20);
</script>
</BODY>
</HTML>
единственное что на ум приходит у вас версия ядра esp32 не та… она должна быть менее 3…
2 библиотеки по идеи это максимум…. еще wifi для esp32…. сейчас скачаю заново и перепроверю))) может у меня еще версия сервера другая…
библиотека от сюда, установка в ручную папку перекинуть))) https://github.com/me-no-dev/ESPAsyncWebServer
Красиво смотрится. Кстати на смартфоне есть кнопки скриншот (на старом это пара кнопок у меня :))
…если есть желание ИИ мучить, рациональней обойтись без esp32, сгенерировав HTML файл.
Это та же ссылка, что я и ставил. Не хочу ставить библиотеку через иде, и так их море пруди у меня, хотел через отдельные файлы в папке скетча.
только там сложнее скинуть файлы… а что пыльная и грязная клава на фото ?))) это я еще не показывал те модули которые у меня год валяются!))))
так вы победили проблему ?))) реально измените ядро esp32 и должно все работать… вот зачем вам там 3 и выше ?)))
я все еще сижу с преобразованием кода фото в координаты)))) а этот проект с такой библиотекой как отдых)))) + она реально хорошая, много чего там автоматизировано, не то что в веб сервере…. я думаю вам просто необходимо ее освоить! и поскольку она легкая, и если реально что то надо добавить, могу добавить…. только скажите что))) и доделывать вам ее все равно придется)))
я 2 ящика перерыл, и нашел только блютуз модули для пк)))) не могу найти wifi модуль, что бы проверить как оно будет на пк…(соединение должно быть кабельным! по этому не использую почти wifi)
помните же вы говорили что esp32 вроде лучше узоры создает ?! (а там вроде как все с есп32 грузится… хоть и создаются новые узоры без подключения по wifi)
а еще интересно правильно ли я визуализировал изменение картинны Вороного которая отвечает за стартовую картинку вроде бы… или нет)))
аааа это что меня ии обманул ?))) и библиотека вебсервера этого там вовсе не нужна ?))) зря он так, я ведь обещал его аннигилировать за подобное… надо мне с ним серьезно пообщаться…
получилось))) просто сохраните в текстовый и измените имя на .html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
body {
margin: 0;
padding: 0;
background: black;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: monospace;
}
canvas {
display: block;
width: min(95vw, 95vh);
height: min(95vw, 95vh);
border-radius: 50%;
box-shadow: 0 0 30px cyan;
}
#status {
position: absolute;
bottom: 20px;
color: cyan;
font-size: 14px;
}
</style>
</head>
<body>
<canvas id="voronoiCanvas" width="240" height="240"></canvas>
<div id="status">Рисование...</div>
<script>
const canvas = document.getElementById('voronoiCanvas');
const ctx = canvas.getContext('2d');
const statusEl = document.getElementById('status');
const CENTER_X = 120;
const CENTER_Y = 120;
const Z = 300.0;
const NUM_POINTS = 12;
let points = [];
let variant = 1;
let Y = 0;
let currentF1 = 0;
let currentR1 = 0;
let lastFrameTime = 0;
let batchSize = 30;
function dist(x1, y1, x2, y2, m) {
if (m == 1) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
if (m == 2) {
return Math.abs(x1 - x2) + Math.abs(y2 - y1);
}
if (m == 3) {
return Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2));
}
return 0;
}
function ran_Sait(variant) {
for (let i = 0; i < NUM_POINTS; i++) {
if (!points[i]) points[i] = {};
if (variant == 1 || variant == 3) {
points[i].x = Math.floor(Math.random() * 120) + CENTER_X;
points[i].y = Math.floor(Math.random() * 60) + CENTER_Y;
} else {
points[i].x = Math.floor(Math.random() * 240);
points[i].y = Math.floor(Math.random() * 240);
}
if (variant == 2 || variant == 3) {
points[i].R = Math.floor(Math.random() * 256);
points[i].G = Math.floor(Math.random() * 256);
points[i].B = Math.floor(Math.random() * 256);
} else {
points[i].R = Math.floor(Math.random() * 256);
points[i].G = Math.floor(Math.random() * 256);
points[i].B = Math.floor(Math.random() * 256);
}
}
}
function drawPixel(x, y, r, g, b) {
if (x < 0 || x >= 240 || y < 0 || y >= 240) return;
ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;
ctx.fillRect(x, y, 1, 1);
}
function drawBatch() {
let now = Date.now();
if (now - Y > 90000) {
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, 240, 240);
Y = now;
statusEl.textContent = 'Очистка экрана...';
}
for (let b = 0; b < batchSize; b++) {
if (currentF1 > Math.PI / 6.0) {
currentF1 = 0;
currentR1 = 0;
variant = (variant % 3) + 1;
ran_Sait(3);
let metricName = "";
if (variant == 1) metricName = "Евклидова";
else if (variant == 2) metricName = "Манхэттенская";
else metricName = "Чебышева";
statusEl.textContent = `Метрика: ${metricName} | Сектор готов`;
break;
}
let x = Math.floor(CENTER_X + Math.cos(currentF1) * currentR1);
let y = Math.floor(CENTER_Y + Math.sin(currentF1) * currentR1);
if (x >= 0 && x < 240 && y >= 0 && y < 240) {
let closestPoint = 0;
let minDist = dist(x, y, points[0].x, points[0].y, variant);
for (let i = 1; i < NUM_POINTS; i++) {
let d = dist(x, y, points[i].x, points[i].y, variant);
if (d < minDist) {
minDist = d;
closestPoint = i;
}
}
for (let angle = 0.01; angle <= 2 * Math.PI; angle += Math.PI / 3.0) {
if (minDist > 15) {
let df = (1.2 * currentR1) / 120;
let x1 = Math.floor(CENTER_X + Math.cos(currentF1 + angle + df) * currentR1);
let y1 = Math.floor(CENTER_Y + Math.sin(currentF1 + angle + df) * currentR1);
if (x1 >= 0 && x1 < 240 && y1 >= 0 && y1 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x1, y1, r, g, b);
}
let x2 = Math.floor(CENTER_X + Math.cos(2 * Math.PI - currentF1 + angle + df) * currentR1);
let y2 = Math.floor(CENTER_Y + Math.sin(2 * Math.PI - currentF1 + angle + df) * currentR1);
if (x2 >= 0 && x2 < 240 && y2 >= 0 && y2 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x2, y2, r, g, b);
}
}
}
}
currentR1++;
if (currentR1 > 120) {
currentR1 = 0;
currentF1 += Math.PI / Z;
}
}
}
function animationLoop() {
drawBatch();
requestAnimationFrame(animationLoop);
}
ran_Sait(3);
Y = Date.now();
animationLoop();
</script>
</body>
</html>
а вот так выглядит стартовая картинка
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
body {
margin: 0;
padding: 0;
background: black;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
overflow: hidden;
}
#container {
text-align: center;
}
canvas {
display: block;
width: min(95vw, 95vh);
height: min(95vw, 95vh);
border-radius: 50%;
box-shadow: 0 0 30px rgba(0,255,255,0.3);
}
#status {
color: #0ff;
margin-top: 20px;
font-family: monospace;
font-size: 14px;
}
</style>
</head>
<body>
<div id="container">
<canvas id="voronoiCanvas" width="400" height="400"></canvas>
<div id="status">Анимация запущена...</div>
</div>
<script>
const canvas = document.getElementById('voronoiCanvas');
const ctx = canvas.getContext('2d');
const statusEl = document.getElementById('status');
// Размер канваса
const SIZE = 400;
const CENTER = 200;
// Точки Вороного
let points = [];
const NUM_POINTS = 12;
let frame = 0;
// Инициализация точек
function initPoints() {
points = [];
for (let i = 0; i < NUM_POINTS; i++) {
points.push({
x: Math.random() * SIZE,
y: Math.random() * SIZE,
r: Math.random() * 255,
g: Math.random() * 255,
b: Math.random() * 255,
dx: (Math.random() - 0.5) * 2, // скорость движения
dy: (Math.random() - 0.5) * 2,
dr: (Math.random() - 0.5) * 5, // скорость изменения цвета
dg: (Math.random() - 0.5) * 5,
db: (Math.random() - 0.5) * 5
});
}
}
// Обновление точек (движение + изменение цвета)
function updatePoints() {
for (let p of points) {
// Движение
p.x += p.dx;
p.y += p.dy;
// Отскок от границ
if (p.x < 0 || p.x > SIZE) p.dx *= -1;
if (p.y < 0 || p.y > SIZE) p.dy *= -1;
// Изменение цвета
p.r += p.dr;
p.g += p.dg;
p.b += p.db;
// Ограничение цвета и отскок
if (p.r < 0 || p.r > 255) p.dr *= -1;
if (p.g < 0 || p.g > 255) p.dg *= -1;
if (p.b < 0 || p.b > 255) p.db *= -1;
// Ограничение координат
p.x = Math.max(0, Math.min(SIZE, p.x));
p.y = Math.max(0, Math.min(SIZE, p.y));
p.r = Math.max(0, Math.min(255, p.r));
p.g = Math.max(0, Math.min(255, p.g));
p.b = Math.max(0, Math.min(255, p.b));
}
}
// Функция расстояния (Евклидово)
function distance(x1, y1, x2, y2) {
return Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
// Отрисовка кадра
function drawFrame() {
frame++;
// Обновляем позиции точек (КАЖДЫЙ КАДР)
updatePoints();
// Очищаем экран
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, SIZE, SIZE);
// Получаем данные изображения для пиксельной отрисовки
const imageData = ctx.getImageData(0, 0, SIZE, SIZE);
const data = imageData.data;
// Перебираем каждый пиксель (КАЖДЫЙ КАДР)
for (let y = 0; y < SIZE; y++) {
for (let x = 0; x < SIZE; x++) {
// Проверяем, находится ли пиксель в круге
let dx = x - CENTER;
let dy = y - CENTER;
let distFromCenter = Math.sqrt(dx*dx + dy*dy);
if (distFromCenter <= CENTER) {
// Находим ближайшую точку Вороного
let minDist = Infinity;
let closestPoint = null;
for (let p of points) {
let d = distance(x, y, p.x, p.y);
if (d < minDist) {
minDist = d;
closestPoint = p;
}
}
if (closestPoint) {
// Добавляем эффект пульсации от времени
let pulse = Math.sin(frame * 0.1) * 20;
// Вычисляем цвет
let r = Math.min(255, Math.max(0, closestPoint.r - minDist + pulse));
let g = Math.min(255, Math.max(0, closestPoint.g - minDist));
let b = Math.min(255, Math.max(0, closestPoint.b - minDist + pulse * 0.5));
// Записываем пиксель
let idx = (y * SIZE + x) * 4;
data[idx] = r;
data[idx + 1] = g;
data[idx + 2] = b;
data[idx + 3] = 255;
}
}
}
}
// Применяем изменения
ctx.putImageData(imageData, 0, 0);
// Добавляем спиральный эффект поверх (как в оригинале)
ctx.save();
ctx.translate(CENTER, CENTER);
ctx.rotate(frame * 0.02); // вращаем каждый кадр
for (let i = 0; i < 12; i++) {
ctx.rotate(Math.PI / 6);
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(CENTER - 20, 0);
ctx.strokeStyle = `rgba(255,255,255,0.1)`;
ctx.lineWidth = 2;
ctx.stroke();
}
ctx.restore();
// Обновляем статус
statusEl.textContent = `Кадр: ${frame} | Точек: ${points.length} | Анимация: ✓`;
// Запрашиваем следующий кадр (ЭТО СОЗДАЕТ АНИМАЦИЮ)
requestAnimationFrame(drawFrame);
}
// Запуск анимации
console.log("Запуск анимации...");
initPoints();
drawFrame();
// Обработка ошибок
window.onerror = function(msg, url, line) {
statusEl.textContent = "Ошибка: " + msg;
console.error(msg);
};
</script>
</body>
</html>
что в итоге картинка поломана или нет?
или скорее последний вариант
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
body {
margin: 0;
padding: 0;
background: black;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: monospace;
}
canvas {
display: block;
width: min(95vw, 95vh);
height: min(95vw, 95vh);
border-radius: 50%;
box-shadow: 0 0 30px cyan;
}
#status {
position: absolute;
bottom: 20px;
color: cyan;
font-size: 14px;
}
</style>
</head>
<body>
<canvas id="voronoiCanvas" width="240" height="240"></canvas>
<div id="status">Рисование...</div>
<script>
const canvas = document.getElementById('voronoiCanvas');
const ctx = canvas.getContext('2d');
const statusEl = document.getElementById('status');
const CENTER_X = 120;
const CENTER_Y = 120;
const Z = 300.0;
const NUM_POINTS = 12;
let points = [];
let variant = 1;
let Y = 0;
let currentF1 = 0;
let currentR1 = 0;
let lastFrameTime = 0;
let batchSize = 30;
function dist(x1, y1, x2, y2, m) {
if (m == 1) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
if (m == 2) {
return Math.abs(x1 - x2) + Math.abs(y2 - y1);
}
if (m == 3) {
return Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2));
}
return 0;
}
function ran_Sait(variant) {
for (let i = 0; i < NUM_POINTS; i++) {
if (!points[i]) points[i] = {};
if (variant == 1 || variant == 3) {
points[i].x = Math.floor(Math.random() * 120) + CENTER_X;
points[i].y = Math.floor(Math.random() * 60) + CENTER_Y;
} else {
points[i].x = Math.floor(Math.random() * 240);
points[i].y = Math.floor(Math.random() * 240);
}
// Всегда генерируем цвета
points[i].R = Math.floor(Math.random() * 256);
points[i].G = Math.floor(Math.random() * 256);
points[i].B = Math.floor(Math.random() * 256);
}
}
function drawPixel(x, y, r, g, b) {
if (x < 0 || x >= 240 || y < 0 || y >= 240) return;
ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;
ctx.fillRect(x, y, 1, 1);
}
function drawBatch() {
let now = Date.now();
if (now - Y > 90000) {
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, 240, 240);
Y = now;
statusEl.textContent = 'Очистка экрана...';
}
for (let b = 0; b < batchSize; b++) {
if (currentF1 > Math.PI / 6.0) {
currentF1 = 0;
currentR1 = 0;
variant = (variant % 3) + 1;
ran_Sait(variant);
let metricName = "";
if (variant == 1) metricName = "Евклидова";
else if (variant == 2) metricName = "Манхэттенская";
else metricName = "Чебышева";
statusEl.textContent = `Метрика: ${metricName} | Сектор готов`;
break;
}
let x = Math.floor(CENTER_X + Math.cos(currentF1) * currentR1);
let y = Math.floor(CENTER_Y + Math.sin(currentF1) * currentR1);
if (x >= 0 && x < 240 && y >= 0 && y < 240) {
let closestPoint = 0;
let minDist = dist(x, y, points[0].x, points[0].y, variant);
for (let i = 1; i < NUM_POINTS; i++) {
let d = dist(x, y, points[i].x, points[i].y, variant);
if (d < minDist) {
minDist = d;
closestPoint = i;
}
}
for (let angle = 0.01; angle <= 2 * Math.PI; angle += Math.PI / 3.0) {
if (minDist > 15) {
let df = (1.2 * currentR1) / 120;
let x1 = Math.floor(CENTER_X + Math.cos(currentF1 + angle + df) * currentR1);
let y1 = Math.floor(CENTER_Y + Math.sin(currentF1 + angle + df) * currentR1);
if (x1 >= 0 && x1 < 240 && y1 >= 0 && y1 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x1, y1, r, g, b);
}
let x2 = Math.floor(CENTER_X + Math.cos(2 * Math.PI - currentF1 + angle + df) * currentR1);
let y2 = Math.floor(CENTER_Y + Math.sin(2 * Math.PI - currentF1 + angle + df) * currentR1);
if (x2 >= 0 && x2 < 240 && y2 >= 0 && y2 < 240) {
let p = points[closestPoint];
let r = Math.abs(p.R - 10 * minDist) % 256;
let g = Math.abs(p.G - 10 * minDist) % 256;
let b = Math.abs(p.B - 10 * minDist) % 256;
drawPixel(x2, y2, r, g, b);
}
}
}
}
currentR1++;
if (currentR1 > 120) {
currentR1 = 0;
currentF1 += Math.PI / Z;
}
}
}
function animationLoop() {
drawBatch();
requestAnimationFrame(animationLoop);
}
ran_Sait(1); // Начинаем с варианта 1
Y = Date.now();
animationLoop();
</script>
</body>
</html>
работает! но играться времени нет)))
А у меня нет.
PK ! Я¤ТlZ [Content_Types].xml ў( ґ”ЛnВ0Eч•ъ‘·UbиўЄ*‹>–-Rйa{Vэ’ЗјюѕQU‘
l"%3чЮ3VЖѓСЪљl µw%л=–Ѓ“^i7+ЩЧд-d&б”0ЮAЙ6Ђl4јЅL60#µГ’НS
OњЈњѓXш Ћ*•ЏV$zЌ3„ь3ачЅЮ—Ю%p)Oµae^ “ІЧ5}nH"dЩsУXg•L„`ґ‰к|йФџ”|—PђrЫѓsрЋ?PWЋaмtt4Q+ИЖ"¦wa©‹Ї|T\y№°¤,NЫафUҐ%ґъЪ-D/‘ОЬљўXЎЭћя(a¦Ќј<EгЫ)‘а ;зN„L?ЇFсЛј¤ўЬ‰ё<FkЭ ‘hЎyцПжШЪњЉ¤ОqфiЈг?ЖЮЇlОiа 1йУ]›HЦgПaхm @ИжЫыmш яя PK ! ‘·п N _rels/.rels ў( ¬’БjГ0@пѓэѓСЅQЪБЈN/cРЫЩa[ILЫШjЧюэ<ШШ]йaGЛТУ“РzsњFuа”]р–U
ЉЅ Цщ^Г[ыјx •…јҐ1xЦpв›жцfэК#I)Кѓ‹YЉП‘ш€НАе*Dце§i")ПФc$іЈћqUЧч~3 ™1ХЦjH[{aЄ=Eѕ†єО~
f?±—3-ђЏВЮІ]ДTк“ё2Ќj)х,l0/%њ‘b¬
рјСкzЈї§Е‰…, Ў ‰/ы|f\ZюзЉж?6п!Yґ_бoeњ]Aу яя PK ! ЦdіQф 1 word/_rels/document.xml.rels ў( ¬’ЛjГ0Eч…юѓ}-;}PBдlJ!ЫЦэ E?Ё, НфбїЇHIлР`єрr®sПЂ6ЫПБЉwЊФ{§ ИrиЊЇ{Ч*x©ЇоAkWkл*‘`[^^lћРjNKФхЃDў8RР1‡µ”d:4e> K/ЌЏѓж4ЖVm^u‹r•зw2NPћ0Е®Vwх5€jш¶oљЮаѓ7o:>S!?pяЊМй8JX[d“0KDђзEVKЉР‹c2§P,ЄАЈЕ©Аaћ«ї]ІћУ.ю¶Жп°sёYТЎсЋ+Ѕ·Џџи(!O>zщ яя PK ! ‡))Wв •Ы word/document.xmlмќ[Џe·ЂЯф?0УДЦvWТЊЦ»±еИAчbГ@н,vm N`8Ф%1;3њpЁ›/Ђнў
и[[ґO}uќ0Ь&їaфЏJrFТ¬vіЦP»›l||‘ж&’усррђ<sжЈЏaЃЏz„З”…
Л©Ш"ЎЛ<¶eЦЭ;ЧЛ—-zШg!iXC[_ыщП>кЧ=жv
$“гz?reVG€Ё^Жn‡8®Фе,f-QqYPeuIµПёWЩЋ·"О\З2їMцpleЙ№ѓщRу8оЛ«/UЭж‚Жi‡KД"К“-Ж,д.oWМч»QY¦aA›Ф§b(“іЧЗЙ°†Хеa=Kў<)†ъI=-Fц5юџ'Яф'[Eќc•_–Ѓ…q‡FЃijтdgњHпё›июшє~д\Z¬·Т™&8OсіjьґдЗ§иШsФ€Jbт‹yЉp0ПqILГiЖFhrpќµb Ф%°“bI¬eITгa0mэЁЅX-Яа¬eMSЈ‹Ґv3Ьџ¤ҐФLЃґ2iЙKpјXaц:8’M9pл7Ы!гёйЛЙєGІъђ®¤Z‰uM*Б&у†к;BэєTўЮnГІнЌнЪж¦TњЩЎ~ДБ-ТВ]_>і“;¤SЮбк‹§_сCyYы
«vЩЄ¦G6гЩc>Ыгc$,ЯЭS‡«Y"ХiљG–рdsлЧЕµѕёъЮЦ'›wонlЈЋьmqU]!ТлТ2Ж90Ѕ…им=Sz…8ђЪ°GI?b\XИeЎђ‡TђФќ†GzRµ–хО
ў!ыеШЕR‡Jлrx@ѓnђ?ФЌ ЧыZУ†М‚*2ўX}шLр©ћ=nE№ЙбS›†udѓМfaOЌґћQѓЕо~[ЋBBЇЋљѕЬ†…z4Ћ|<¬Ј–OАЇ0ї/є± a9і‚кИ•џ„ЙВ$±OЫa™
Д@Сb@Гr‡РvGЉўcЫЅ0,М°%Ыr№…кKЅ°ђЕv Ђ,т +ЉМХk 0YА’iъLAЂzКF*<–®¬хъ+H~v– daђгюH.JІЙёGx™cЏvҐUёf
Кqa{¬_G¶ь»jGдq,і‹¦0І_Д‹.4&іѓ,¦К¤Ћp3f~WА ДDэ Б‚:ЄIµaш
гs™Пxъ3zz*!¦I9—@ю
фq,vI(Ќ@вна6ЩаплB_l Ћj…ё
KД‹с’Eр©Uv gJ/›¤^Гк1ОBFЗNУ©чЌU»d[(ќЂHwk-¶йOЅ)zЏц4чt8sШEй„J“П6щgтzф,щ.y™јHѕM^'ЇN#З9оїR©h’@ЂL(v9Ќр3e…„±@™цk с“'•6Ы>Q›eГ›^йвҐx¦\ЌI‹ЃДњтVђ7•{Г@”.Ц< jL5н:¶эг$8Ѕ eCЮЬѕ}g{чБo$d§nubјaВш©д·jЫ hJрцЭ[v>№yыОћEаXЈOЉ
…2ќ>»Ќц0§8JЃ AХ—Ђ4cзv9—6вua.Кpљ3T2Ч9ИаhМ±‰…ЫЩЈГХџDЁя9кїХ
]еЦЃ<‹ТАYACщP“Ят°®2Е™Т*Ё!Ќ3АgЂЏСе!є…E§ЙEIoE¬/Е•µlЦ–РrzЃ:<T‡•ёЦ–`ЄЄ8oр](ЊlТВkРВг;ОЏ&Яцq3·шIsWЗ†5ХЬhкРФПІ©ЇBS_°3р нЛу-{%Ч°У~:qhЩg(љ0kрKeФv‘9ЋГa{ЉR¶ю =ў MЖQIM»Q=e)ї”CVniQZ^ґ†¶Ъ{йквgфюR¶Р(7%йGO@Пeќ¬56ђѓ?ћ®=‚Ilu"•еЧ¦Я–ПOmc©c=”–Р/•Ї‹шЋќ€@~@=<хzћф= ]фDьЂ:8EuP»dГИшu р…™‡3A¦BГЧuЇ†qЮ#Цµj yBЕЙWUт—СідUтuтMтв4т2ЅхУїсЇеm›ј=M^ЏћЋ~+чючNэ>y)oящLЅCk-ԁ쾥Y[‡dѕ7Ђп©тЭ ѕ§А wФцµ=х1дёїCaД/
VРpсФ^AME4ЂЄ¦faйТЃЌ?Fr»-®6Ф(Vнs§†УSK(]х5_шqNK®TZФччT0eЩЕ~ОЫНТыЏш“фюЈ¶юl>Yът1Щ]вЉLg8тX)РеBmWЫaєЬ
х|G zYЋjќ>d}©Ф·° №Yеcf¬(ЊetOЫ"иЉ-яЂD.Р%ЋЌЌ‹ъmCA(ЌIjгВ^Aтџґђхaґсв8ХХІЌ№ВдЖЎx**¬‘Ћn¤нїxЂд 'џoтЏСTP·СудН;¶ 4ъ*y3zЄ#Щэ@7®вШЃЦ~‡З1g‡lвqЪL=N›йЬРд±o№ §Жvн4†¶lхўКОMTEл°pЌм2/rь ґ€!їipҐ‰пуaКХy‚-Р<фМ0,МPхЭњє·±ЋtcY@±0ЕЩ‡–f zBЕКзџь5y)aZяM^'Я¤qґO#З9@Ђрg¦ЅЫg$Ёvжф75bэnфХ蹴ї’ЫПФР}фgђ¤у%Ig,7я–ІтџСџF”Я wО“ґ|ПЬазg j^I%уTvV?І№Б:zяСґщ<AЏOЯ{ь_ІЩј‘
ч»СУ‰іp›яNЭvттaТа3SњYSy&·ВЬ`b№025.ќyhqтЖѓ,`—Лвй©r2џМNБDЂр™§'пFИЂЗ4а'ь8§ПМяV;ЦЪиў«ъC9вЄХ凛;:цБќ=]
†БхYLb±ЈћqЃщncЊ
·h¬¦qЂµ«mцађ}ї2ИпИ30—kLы@шaВяњ° {GЉ°
®ђЯ^„ікъјTl3ЅвjЂ1§sAУ›йш) ,ЊFјЂм
yЎцX·+¶ґ{Т=Х‰4PMS3ї©с‰еlђ«=©VБ“КёЈч2Ъ9НYЋ¦†eK99%«У))њрFJг©CеЎ6пЬЎ<iY0Їuш‡Gг?z&с\г?%ОіЄvђє ПОa:GOy±:zЋ¦П ¬~aЁФlрћ7ыПБЫCП·dх…ЁІ‹КИ±e#ќП?PБ} W†«}Ч
Аu,.хШHЧаъ^\№7Щ«фЖ1n П№>џQ“ФЮnъжFЕІЕЃ%V прhјaL[Аk„Weєµ#
ЭЪС†о‘«Ј`иОК-єЯи8_0ЃKА…pЃ <7®њ њЅELа0Ѓ@ y“!Жт2иИlЊ1Ќbђ®\ЄwaБТeЎЬ€8З.ВOНд=>”…Q‚п ds#ѓЪћЗ№lз‡4АjлЧЊEлШ„e.T4фn…йqтe—ДвWc9јОq@JaД&@Оз€пЁIд.gй*ЄVQтчд…
«b¦ЄиЎС3¤ў‰и *.Нудr@sХ*p2D—_ аLЯTK±ХШе4j¶еЬiи"uI“yГщЂlo8W¶њџТЅwDаєч~ЅЙШ~ЂщюћА\И$Ё'уTwJ{§a=ёБ6°»џж2ѕv;ф&W¦YЅ`z+Ы««ЧнЈЁf—џВqЃbвЉќ Н·•JзЭЮSщхe–г\±ЧХ…№Ѕ~y5Л<jЯВ*EБ"uНк%ќmwд]\^УаљLLПъ¤%O:Ъ:ЯБ‘Щ~hkj1&r»н®Р»љkїо2_Эj)H]Ј{МЅБ©Єџ†d‡Jeїa®Џ+#ЅmЅ©^oИџtЉkяa яя PK ! T¶c»M В word/theme/theme1.xmlмYЭЉЫFѕ/ф„оЛ¶дџ%Ю`ЛvУf7 ЩMJ.ЗТXљx¤1љсољ›«ЮґТТ‹ЪЮфў”.4ҐЎ4фњgXHhУ‡иМИІ5цё›t%6Xууќ3Яњ3уЌd]јtaг &‘ёi–.X¦cЏш(љжНэ^Ўn”ЃШaД°iN 5/mїяЮE°ЕBAѓЫЗt4Нђ±СV±H=Юи2‚1пeђ$ЊW“ и'ађыЌp±lYХbPl1€ёЫйwУ_¦їOOЊkѓт №ќщпbю3*<њм п03ъцЩсфdъtъxzтм>/?еЧП¤?,‰ќP'ЖАM“н“Г}xДLКxGУґдЗ,n_,ОЌ0[c›ілЙПМnfаЛТ. ъsCЫvмjkо_0[ЕukЭj·:ч'АушМS.y¬Уnґ;О›ҐEЌпNS))шњяК
ѕе€Ї‚— ґhЇа{=wГ(-:љФК®а%(-VWр5«Х±k
^‚BЊвб
ЪrЄ7›н2 шІЮpм^<ѓ/PЕЬjKнcцЄk/wHТг2ЩЂЎШ`“ ЏЫ№ Ј~‚Њ„|!Ћ@L(o¶КVПЄр_сµeIFlAђіN›<єТ$шФKР€5НЏёW3ayюдЙйсгУг_O<8=юi6цЄЭeay»—ЯючЈыЖ_?утбz<Нг_ьшЙ‹Яюш7чLЎхеЙ‹З'ПїъфПjафур}Aj\…‡Ж
с jЂэдх,цCЂт8 ВFѓоІPA_ќ 4ё6Tгx+бтЎ~0ѕЈЮ“1Cа•0RЂ»„а6Iґsє"ЖКGaaъБ“qwЂЭШоR–»гЯaHзТ
ЎBу:ж)aЊ!3DBЁ1»ЌђЧ]д%„’3n#Ј
ђ6$ыЁЇ¬¦…СeсјLtyѕ•ШмЮ2ЪлЬwаЃЉд{`ќK€•0~ ЖDZЖ Вyд`ЎЋдЮ$с”ЂSЖ3@LЊ®)ХЩ\K&
Э+\fфiЯЕ“HE&
uИ@HЩ!C7СHЛЕaы!т%
Њл„iIu‡€:П€Ч¦ы‚JєПЮЫ7№й€и'є-‰є'x t^\ТхЕgЉь’ј;oNЮ№€>яъ‘^s7 йzаyДј• нnZ–рuёeбvIвЈ·_·;`_‡|«h пdыќlяпe{Э~ЮјX/фYЮШg·пТMфКчт„с›`ёCҐТS>]їЗeeE:™?JЊB^њ
Їа‚ИІ‘ц1bб^F|Ш’! 3Ч5F„тіB6k}‹<Ћv‰џ¶–JЩУ+7 lСОПљ¬ќџL,mЦЏisчІИЗлЊЂ°}№БT
‰ZЦx 9іЌ°hhXФ…ыµ,дe–ѕ
юqм”_ C_д)µПІ»сLЇ¦:нІfz
Бu3™VHд–›J"·CаГеж
зє±H©BO„b•Fю&r-DeIep¬ЦЊCѕз*wгЃQУр»D^ЊFЬ:
p7MЏНэ_”e”PЦ4LaІ+ќ„LЊ"ѕЦуiАс‚[©\s|KЙ5¬·/rт’O2 ЗЦґ,Єј/uўн='XTИ“ЮэCЈЏЗЙ
АеФJ"Ђ>ўlM%№ЕЅ€в’\Н¶ўтЇЪb‹<
БмDЙ‹y
—е9ќЬ<$УеY©хЩdъЃHТ№OЭіЌDGN4Ч вФФлЗ›;дs¬єЇ°JҐ{Yл™Ц;%О дЁ-SЁ Жj‹V•ЪorГН—жє3bУ§БтЄaDvџ)k+Ї3Hя_щ~ы:ЖЊJЄр€?3ёЩП©ИЦL]Ћ1NPУјk9-Ы-;nБЄ;Э‚]±BЭiU
-З©”єNЙкґЛчxPX•њtмѕБ“ЩeЩѕтТ&Кn»/x$*щ.¦(ЌеK›RYyi“ѕ«1цEїi ™»ХrЇQiґ«…FҐХ+ШќvЅРp«нB§кЦ:ЅЋлФeЅ{¦q Бv«вЪХnЅP-№nБ®Z‚~ЅQЁЩеrЛ®µк]»uok>умљ…WтЪюa яя PK ! /lа ѓ
word/settings.xmlґVmsЪ8ю~3ч>‚m0ДnIaCё¦®ќ@ЂlЛ ‰^<’Ў7чЯo%[1$№ЅN?!піымjµ/јярДhoЏҐ"‚OЅаКчzзў |;хѕn–эkЇ§4вў‚г©wДКыpуыoп‰ВZѓљкW Л§ЮNл*TѕГ©+Qa`)$C>еvАђ|¬«~.X…4Й%ъ8}мµ4bкХ’'-Eџ‘\
%JmLQ–$ЗнЏіђ—шmL"ЇжЪzHL!БХЋTК±±яЛаО‘мїw‰=ЈNпш\ч dсlqIxЖ ’"ЗJБ1к$јs<zEфмы
|·WґT`шцtyфcб+‚±В?FµudшЙ)zIJићdЙ¦аЪ|°<№Ыr!QF!ИK®ЦіСy7PеЯ„`ЅCRa™ГSC‹шѕ70@ЃKTSЅAЩZ‹
Tц"™шЧ
њпђD№Жr]Ў^a.ё–‚:ЅBь%фє@В#µ¶'єУєй/°а€Alg=і4А!©%№<‰ЖАzўS—/ a’xcrІЦGЉ—ьљ|Г3^|Є•&Аh;з'"ш^ eПџб7З
/1Т5¤й9і/±¤¤Z)…јгју/sFКKp@ђЖ+("ЕБжщ#FЊбџф;8-#к…r‡a!ґSхэY:IЈё‰Ф §“Емц-dжa±+њИІҐ?ПЮDnГщјн•sдv8\ъ‹7‘4€m~_ Лq<·ћпН3’їHw2EЬcЌЕ±LФ[™Ў=0™|L wx†axаSd]gмчe@1DйєЬv2°¤ ЄZаТћй
ЙmЗЫjИ7Ґ0Q>=s™iѓеџRФUѓ$Єљвt*БhФZ®п srUgkgЕaЬќ@5/>пҐНS—ћCўЎИl“Я#[¬VWЦэ‡Їm1S№6…€WЁЄљzО¶БФЈd»УЃ)A
_мvы‘mГ-6э@№№h·‡N:Щ‰ЮРЙ†ќlдdЈN9YФЙЖN66ІLI „ЦrG#/ҐвЂ‹ЏюJФ$AнP…НФ‡тЌ ]Є·Oрмa\
™*R0фdЦE86ж6EGQл3]ѓекњЎ@№¦>3¶%ю"іЌrеё>І¬[24ЃSў`U°Џґђ{g±`”"їѓN‚“•‡йl–ЖqУіAdчЮ@‘?В»?а2E
-жLЈЖфпЫ8тэе|Ц_О‡“ю(ЌзэtњЮцУ(ј^Дq‹фџ¶IЭїЗ› яя PK ! bК®Ф < word/fontTable.xmlј’mkЫ0ЗЯц„Ю7–ќ‡¶¦Nйјc/JчE¶Еф`tJЬ|ыќe'Ы0e ѓЙ дяЭэ|ъыЯЊ&aйA9[РtЖ(‘VёќІuAїїnnо(ЃАнЋkgeAЏигъ㇇.Їњ
@°ЮBnDA›Ъ<I@4Тp№VZVОeрХЧ‰бюЗѕЅОґ<ЁТ*“Њ±1юЉ«*%дg'цFЪл/5ќ…Fµpўu—Р:зwwBаќЌx†+{Ж¤‹ И(бё*Мр2cG…е)‹'Ј–ЧІ `т:ДrD$p4тЌ#т/µuћo5’рJ»"LЧгП$]n№БpЙµЪz-·dЉ±ЧeЫ°%оэі`у~§Iџ(оAцђX–ѓ\qЈфс¤B§ †@«‚hNъЃ{Х·6„@ХШГ–ф™бК6e:(iA(<•g%Г¦†•ЋКь¬°^‘3dЬЗ*9зьf280qвU д›мИ‹3ЬѕгHЖVиДэиќ™_е€ЏЬkЙћw¤Dецn1џ8rяwGОеЋЊіAѕЄє пNH?яkBћъ–Сђ?'$c·џ&~ДЫяг„ЊaXя яя PK ! ±?ёb" N word/webSettings.xml”ТНJ1 а»а;„ЬЫl‹-Іt[©юЃЦ{љО¶Б$2©ЫхйЧЄH/н-“Й|М$™МvЮ‰wHd1TrР/¤Ђ`peГє’‹—yпR
К:¬ґГ •lЃдlz~6iК–Пђ3џ$БJ Т›JnrЋҐRd6а5х1BаdЌЙлМaZ+ЇУЫ6цъЁі]Zgs«†E1–{&Ј`][Чh¶BокUЗ"ЪШH?ZsЊЦ`ZЕ„€xпѕ=Їmшeaђ·&!aќы<МѕЈЋвтAСјыF§Г`Lp1ЪЉZ;)ј)oЧ“^:–x$Б]‰–S~RЊЩzыsLW e‚¤ѕ¶щ^ЫЗрzЧEЪ9lћn8Pя~Бф яя PK ! Єae«ъ л docProps/app.xml ў( њSAnЫ0јиЮcК®aШН pPдР6¬$g†ZЩD%’ #о_ъ‡ў@С\ъa=©K©Vйґ§к МО.WГЩ»|jкм О+ЈWd<КIZљRйЭЉЬп.ж$уAиRФFГЉБ“KюъЫ8cБ>ГЪЇИ>»¤ФЛ=4ВЏ01SЧ€ЂЎЫQSUJВ•‘Џ
и@'y>Јр@—P^ШЎ!й;.б›–FF}ю®8ZмЗYЌE ю1ћ¬GҐ
ЈЛ
D]Ёш|‚ь±ЌШЃзcF{АоЌ+=џЌ±Є‡lЅNИЂт7УЕ”С„`o•Эе”tЖ›*d7ќд,6`4-axЌ-ИG§В‘зЊ¦!{Ї4*,нjsbз„Э{>Џ‡€mҐЁaЌрJФэC°kqєeЎўАCX@г2Ї>г|'${ўo+rN H_Цa®Ћ·_ЪЇнЏцeѕ¶ПнwF‡TaУ)VУhhО» “ѓш\hЎB
ю¦Вk†и§є;
ЅкDNЄмфЌ]Ч¦±BЈЧt@их'ksе·ќзdІч*м·VHП4_МУeHRl‹,”8Эa>Б®с
®ЋАіzaе©жпD\Ї»юЯегЩ(З§Ы§‡K1ьTь яя PK ! ТgЙшp Э docProps/core.xml ў( „’]kѓ0†пaы’{›ЁPZQ[)VМ±±»,9mіjIZЫїЁХNVШЭщxПГЙ{’,NeбAeQЙ‚<ђ¬вBnSф–ЇьтЊҐ’Уў’ђў3ґИоп¦bVixС•mП‘¤‰™JСОZclШJj&N!]sSй’Z—к-V”нйpHИ—`)§–ви«Ѓ€.HО¤:иўp†ЎЂ¤58шЄµ Kss ньR–ВћЬ”цНA}2bЦu=©ЈVкцрЗъщµ}Є/dг”%њЕVШІ_C™ГЧ70Ы•‡ДЕLµ•ОЦЛ§¶ЧзЌУ{8Ч•жЖMЌ2'г`КєыuМQБ©jмЪt#Ђ?њ;ьЯrЈФpН?ИжbH“‹©ЭJА=gFЬYЧwЮЈЗeѕBYHВ©OB?€т Њ#тЩl5љїЛЛя#џМтЂДС|Lмќ1г™э яя PK ! ЅБ‘7) /p word/styles.xmlјќ]sЫє†п;УяАСU{бИтgв9КЫ‰kOгџИn®!’Pѓ„КЏШкЇ/ Rе%(.ёх•-Qы Д‹А‚¤фЫпЇ±~с4*FaOB‰d><=Ю|YО’€I•рс`ЕіБпџяъ—Я^.І|%yh@’]Дбx°ИуеЕp…імѓZтDњ©4f№~™О‡1Kџ‹еAЁв%ЛЕTH‘Ї†G‡‡gѓ
“vЎЁЩL„ь‹
‹'№Ќ¦\jўJІ…XfkЪKЪ‹JЈeЄBћeъ¤cYтb&’
ft@±S•©YюAџLU#‹ТбЈCы_,·ЂSа О2ЋCњV€a¶Љщл €Г‹»yўR6•љ¤O)Рµ
,xрY«©рџ±Bж™y™>¤ХЛк•эsЈ’<^.X
сЁkЎQ±РФЫЛ$}„і,їМk<ё0я4 іјцц•€Д`hJМю«юbr<8:Zїsmj°ућdЙ|э^ZьxЄЧd<аЙБУДј5ХЬсЂҐa“K8¬N¬ь[;ЭеЫW¶а%…-‡Нr®;кимР@Ґ0ѕ8:эґ~сЈ0-МЉ\U…X@щwѓ‚ЧэWчжIi*}”Пѕ©р™G“\lYъН§»‡TЁTeg<шdЛФoNx,nEс¤цБd!"юsБ“§ЊGЫчяј±ќїz#TEўя?>Щ^ іилkИ—ЖJъhВЊ&ЯMЂ4џ.Д¶peюџ5lT)СїаМЊ'Би-ВV…82Yнl›™Е›s·џBtь^ќјWA§пUРЩ{tю^}|Ї‚,жяYђH"юZЁы87ў9іЎ9/Ў9« 9' 9ЋЋЋж8ъ1љги¦N®BW/¬uцcGooзоџ#ьёы§?оюАЏ»АчгоЯэёы‡s?оюСЫЏ»°ЖsЛҐVp§m–дЅ]6S*OTОѓњїц§±Dіl’EГ3“OIN’ SЋlХDЬ›2ыz±&хџПs“ОjМДјHunЮ·в<щЕҐО’EљGLy^¤ЋсйУ)џс”'!§мШtP“ IO ъж’НЙX<‰€›oM$6ZзПcAР©c¦ЄХ#eѕ‰¬[HpUHЙ‰XЯiєeхП
,¦j`1э3‹йџФ4ЈjўЉFФRЌЁБ*Q»•э“ЄЭ*Q»U4ўv«hэЫнQдТсхUЗЁыЮЭµTf[јw=&bћ0Ѕ и?ЭT{¦БKЩ<eЛE`vҐ›±хsЖ–sҐўUрH1§mHTлzЫE®хY‹¤иЯ ;4*smxDцЪр€¶бх·ШЅ^&›Ъ-M>3)¦yЈi-©“i'Lе‚¶їЫXЮї‡m
p#ТЊМНX‚ьЭ,gЌњ#Я¶–э+¶eх·ХЫQ‰ґz’ –R…П4ГрнjЙSќ–=ч&Э()Տ舓<Ue_«[юИJТЙт_ге‚eВжJ;€оSэъ‚zpП–ЅOиA2‘Рицх fBt+€ЫЗыoБЈZљ4У4
рJе№ЉЙХNаЯ~тйЯi*x©“аdEt¶—DЫCv-&™’¤""’^fЉDђМЎ–чOѕљ*–F4ґ‡”—ч°дњ€8aсІ\txKЏ‹/zь!X
YЮїX*Мѕ•©I`µmГ¬ю›‡э‡єп* ЩъЈИнюЈ]кЪh:\яeВ®яБЄ©§aУ NvaЧяdwpT'{-Y– з%ToХй®yФзЫ?щ«xJЄtVHє\ЙZp
$kB%‹8Й(ПШтOШтЁП—°ЛXБ–њеэ#™FҐ„…QЙ`aTX© эпР©БъЯ¦SѓхїW§„-j0Є~F:э]е©БЁъ™…Qх3ЈкgFХПЋї|6У‹`є)¦†¤кs5$ЭD“д<^Є”Ґ+"дWЙзЊ`ѓґ¤=¤jfnPIy7ТмQKВЕv‰Јщ'џ’UН°(лE°#К¤TЉhom;бШИЭ{Чц…Щ'9zWбAІђ/”Њxк8'w¬О—'еco«o«СiЫу›/т`ІШмцЧ1g‡{#Ч ыNШю›Ъьlэ<KSШ=ЏDЇ+
¦8;оl{фNрЙюанJb'тґc$,уlдv•јyЮ1–щ±c¤хйNd›ѕ°ф№±#њ·хџMЋзи|зmЅhЬXl[GЪD6uБу¶^ґc•а2НХЁN7Пёг»™ЗЏq‘›‚±“›ТЩWnD›Б~р_ВМмAУ–·№{ЊыvЭiдьіPеѕэО§оuЭй…S’с ‘sЬэВХО(гnЗОГЌeСyЬq#:@nD§‘ИЋ’Ь”Оc“eСyђr#РЈњpЈЊЗЌV0Юgґ‚џСЄЗ*АЌијp#РF…ґQ{¬Ь”QAё—Q!mT€@e"РF…0њQa<ОЁ0ЮЗЁђвcTHAe"РF…ґQ!mT€@eХsmпч2*¤ Ќ
hЈBЪЁvЅШГЁ0gTпcTHс1*¤ Ќ
hЈBЪЁЃ6*D Ќ
(Ј‚p/ЈB
ЪЁЃ6*D ЌZ>jиoTЏ3*Њч1*¤шRРF…ґQ!mT€@e"РF…”QAё—Q!mT€@e"РFµ{ЖгЊ
г}Њ
)>F…ґQ!mT€@e"РF…ґQ!eTоeTHAe"РF…€¶юY]ўtЭf?Впz:пШп~йЄЄФЏъЈЬuФqwФєVnVчg®”z<<¶щF7€JЎмµгІzќko‰@]шьгєэ џ:Ѕз—.UПBШk¦ ~Т5м©њґuщz$HтNЪzz=¬:OЪFЯz$OЪ]лЛхM)z:БmГL-xдoekб°‰ЫЖиZ lб¶‘№eёm<®ћfp~e}Ъ±ќО6ч—B[w¬ОЭ„¶n µZЗР]EsєЄз&t•СM@ййДа…uЈР
»Q~RC›aҐц7Є›Ђ•ј¤©!К[j€т“ЊX©!+µяам&xI
0юRC”·Фе'5њК°RCVjHАJЭsBvbьҐ†(o©!КOjёёГJ
X©!+5$xI
0юRC”·Фе'5И’СRCVjHАJ
^RЊїФе-5DµImwQv¤F)\З-ВjЃё №€eњkЃЩR-Ъ3[Є<і%ЁХZs\¶TНMиЄћ›РUF7Ґ§ѓЦЌB+мFщIЌЛ–љ¤ц7Є›Ђ•—-9ҐЖeKRгІҐV©qЩ’[j\¶Ф$5.[j’Ъpvј¤ЖeKRгІҐV©qЩ’[j\¶Ф$5.[j’—-5IЭsBvbьҐЖeKRгІ%·Фёl©Ij\¶Ф$5.[j’—-9ҐЖeKRгІҐV©qЩ’[j\¶Ф$5.[j’—-5IЌЛ–њRгІҐV©qЩR«ФЋliшІуL†mЯL8_-№щоЪ3Qщ¤ХE@ыБ»h<`ц7”L%‚кЧЁЄџNІu®–…ЩXJёРЕ„Х'№J9Е8ѕХ»=Чх§«¶Ы^у,?·s}іµ–№iЫ¶–?&eўTЕUЇOU7ЫW1]Ќ©,”Kяs—DрRэ UYБи••(}ьљKyПКO«ҐыЈ’ПттииР>яжшґь~7g|ja'`ё[™тeхГ`Ћf.їсЅєBнjкЈ†¦¶·JфmеmЅЦяeџяa яя PK- ! Я¤ТlZ [Content_Types].xmlPK- ! ‘·п N “ _rels/.relsPK- ! ЦdіQф 1 і word/_rels/document.xml.relsPK- ! ‡))Wв •Ы й word/document.xmlPK- ! T¶c»M В ъ word/theme/theme1.xmlPK- ! /lа ѓ
ze word/settings.xmlPK- ! bК®Ф < ‰ word/fontTable.xmlPK- ! ±?ёb" N Ќ! word/webSettings.xmlPK- ! Єae«ъ л б" docProps/app.xmlPK- ! ТgЙшp Э & docProps/core.xmlPK- ! ЅБ‘7) /p ё( word/styles.xmlPK Б 4
Вот так нотепад открывает, видимо кодировка не та ![]()
А я скачанный текст в ворд вставлял
Видимо тут и косяк.
Разобрался, надо было в ino расширение ставить ![]()
Заработало.
тогда у меня 2 первостепенных и важных вопроса
полноту картины на телефоне удалось передать ? и то же самое что на esp32 или нет ?)))
и если да, на пк таже картина или на телефоне другая ? на пк скорее всего 3 пример html надо грузить…