Обновление репозитория
This commit is contained in:
parent
5082c5efa4
commit
9e5a561c5b
21
README_files/1 Подключение железок (1).md
Normal file
21
README_files/1 Подключение железок (1).md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
В проекте я использовала клон Arduino Nano: **ATmega328P** c USB-mini портом.
|
||||||
|
|
||||||
|
В качестве датчика температуры и влажности клон SHT31: на маркетплейсе он был
|
||||||
|
обозначен как "**SHT31-D**", на плате указано "**SHT3X**".
|
||||||
|
|
||||||
|
Эти две платы необходимо соединить по следующим пинам:
|
||||||
|
|
||||||
|
|
||||||
|
|SHT31 | -> | Arduino Nano|
|
||||||
|
|------|------|--------------|
|
||||||
|
|Vin |-> | 3V3 |
|
||||||
|
|GND |-> |GND |
|
||||||
|
|SCL |-> |A5 |
|
||||||
|
|SDA |-> |A4 |
|
||||||
|
|
||||||
|
Датчик также работал и при подключении Vin -> +5V, но его работа была
|
||||||
|
нестабильной и он выдавал повышенные показания.
|
||||||
|
|
||||||
|
Также столкнулась с тем, что плата работает стабильнее при прямом подключении в
|
||||||
|
USB-порт компьютера, а не через USB-хаб.
|
||||||
|
|
||||||
83
README_files/2 Прошивка arduino (2).md
Normal file
83
README_files/2 Прошивка arduino (2).md
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
**2. Прошивка Arduino nano**
|
||||||
|
|
||||||
|
В каталоге *arduino* лежит файлы для прошивки arduino nano (ATmega328P).
|
||||||
|
|
||||||
|
Для прошивки: устанавила Arduino IDE (из AUR)
|
||||||
|
|
||||||
|
**yay -S --aur arduino-ide-bin **
|
||||||
|
|
||||||
|
и пакет для доступа к ней через терминал:
|
||||||
|
|
||||||
|
**sudo pacman -S arduino**
|
||||||
|
|
||||||
|
Разрешаем текущему пользователю доступ к последовательным портам (и
|
||||||
|
соответсвующим lock файлам) :
|
||||||
|
|
||||||
|
**sudo usermod -a -G uucp $USER sudo usermod -a -G lock $USER**
|
||||||
|
|
||||||
|
Так как при каждом перетыкивании платы в USB-порт linux увеличивает его
|
||||||
|
значение (USB0, затем USB1, USB2... и т.д.), я добавила правило для именования
|
||||||
|
порта для arduino, то есть чтобы порт всегда назывался одинаково
|
||||||
|
("/dev/arduino") и всегда имел права 666:
|
||||||
|
|
||||||
|
выполняем в терминале:
|
||||||
|
|
||||||
|
**lsusb **
|
||||||
|
|
||||||
|
ищем в нём нашу ардуинку: должно быть что-то вроде:
|
||||||
|
|
||||||
|
*Bus 001 Device 003: **ID** **1a86:7523** QinHeng Electronics CH340 serial
|
||||||
|
converter*
|
||||||
|
|
||||||
|
запоминаем полученный **ID**!
|
||||||
|
|
||||||
|
выполняем команды:
|
||||||
|
|
||||||
|
**sudo nano /etc/udev/rules.d/99-arduino.rules**
|
||||||
|
|
||||||
|
вставляем код (замените ID **1a86:7523** на ваши, если плата отличается)
|
||||||
|
|
||||||
|
SUBSYSTEM=="tty", ATTRS{idVendor}=="**1a86**", ATTRS{idProduct}=="**7523**",
|
||||||
|
SYMLINK+="arduino", MODE="0666"
|
||||||
|
|
||||||
|
Выполняем запись и выходим: жмём **Ctrl+O**, затем **Ctrl+X**.
|
||||||
|
|
||||||
|
применяем правило:
|
||||||
|
|
||||||
|
**sudo udevadm control --reload-rules && sudo udevadm trigger**
|
||||||
|
|
||||||
|
проверяем:
|
||||||
|
|
||||||
|
** ls -l /dev/arduino**
|
||||||
|
|
||||||
|
должно вывести примерно так:
|
||||||
|
|
||||||
|
*lrwxrwxrwx 1 root root 7 фев 21 15:54 /dev/arduino -> ttyUSB0*
|
||||||
|
|
||||||
|
**Запускаем Arduino IDE:**
|
||||||
|
|
||||||
|
в **Менеджере плат** (кнопка слева) ищем и устанавливаем: ***Arduino AVR Boards*, **
|
||||||
|
|
||||||
|
затем (кнопка ниже) ищем и устанавливаем библиотеку: **Adafruit SHT31 Library**.
|
||||||
|
|
||||||
|
Теперь надо **выбрать модель платы**: Инструменты -> Плата -> Менеджер плат ->
|
||||||
|
Arduino AVR Boards - **Arduino Nano**
|
||||||
|
|
||||||
|
**Выбрать порт**: Инструменты -> Серийный порт: **/dev/tty/USB0** (обычно arduino
|
||||||
|
IDE сама определяет нужный порт, просто тыкаем в него)
|
||||||
|
|
||||||
|
**Выбираем загрузчик**: Инструменты -> Processor -> **Atmega328P (Old bootloader)**
|
||||||
|
|
||||||
|
Теперь всё должно быть готов для прошивки: вставляем код **sketch_hum_temp.ino **и жмем на кнопку слева (->) "Загрузить на плату". В случае успеха :) ошибок быть не должно и прошивка загрузиться, всё замигает красный светодиод и перестанет - значит данные отправляются в порт USB.
|
||||||
|
|
||||||
|
Для проверки, что данные приходят: или в Arduino IDE тыкаем кнопку "Монитор
|
||||||
|
порта" (изображена в виде лупы вверху слева)). ,
|
||||||
|
или в терминале вводим: **cat
|
||||||
|
/dev/arduino**
|
||||||
|
|
||||||
|
должно будет вывести сообщения инициализации датчика и отправлять данные о
|
||||||
|
температуре и влажности каждые 30 секунд.
|
||||||
|
|
||||||
|
если всё OK, тогда жмем **Ctrl+С** чтобы прервать чтение из порта, закрываем
|
||||||
|
терминал и закрываем IDE (чтобы освободить порт arduino)
|
||||||
|
|
||||||
24
README_files/3_1 Установка десклета Cinnamon.md
Normal file
24
README_files/3_1 Установка десклета Cinnamon.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
**3.Декслет для показа данных о температуры и влажности на рабочем столе Cinnamon**
|
||||||
|
|
||||||
|
Он довольно примитивный, при желании вы можете перенастроить его "под себя".
|
||||||
|
|
||||||
|
В текущей версии он показывает температуру и влажность, а также время получения
|
||||||
|
этих данных (обновляется каждые 30 секунд).
|
||||||
|
|
||||||
|
Для наглядности в декслет добавлены смайлики:
|
||||||
|
|
||||||
|
смайлик довольный 😊, если влажность в пределах нормы: от 40% до 60% (иначе: если жарче 🥵, если холоднее 🥶)
|
||||||
|
|
||||||
|
смайлик довольный😊, если температура в пределах комфортной: от 22С до 27С (иначе: если сухой воздух 😮💨, если влажный 😶🌫️)
|
||||||
|
|
||||||
|
**Установка**.
|
||||||
|
|
||||||
|
Установка заключается в двух действиях:
|
||||||
|
|
||||||
|
скопировать из проекта папку **home-meteo@lina** в папку по адресу:
|
||||||
|
|
||||||
|
**/home/*имя вашего пользователя*/.local/share/cinnamon/desklets**
|
||||||
|
|
||||||
|
после этого на рабочем столе кликнете правой кнопкой мыши "**добавить декслет**", выбрать из списка
|
||||||
|
**Home Meteo** *Домашняя метеостанция*, нажать "+" для запуска.
|
||||||
|
|
||||||
26
README_files/3_2 Установка виджета KDE Plasma 6.md
Normal file
26
README_files/3_2 Установка виджета KDE Plasma 6.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
**3.Виджет для показа данных о температуры и влажности на рабочем столе KDE PLASMA 6**
|
||||||
|
|
||||||
|
Виджет показывает температуру и влажность, а также время получения
|
||||||
|
этих данных (обновляется каждые 30 секунд).
|
||||||
|
|
||||||
|
Для наглядности в декслет добавлены смайлики:
|
||||||
|
|
||||||
|
Смайлик довольный 😊, если влажность в пределах нормы: от 40% до 60% (иначе: если жарче 🥵, если холоднее 🥶)
|
||||||
|
|
||||||
|
Смайлик довольный😊, если температура в пределах комфортной: от 22С до 27С (иначе: если сухой воздух 😮💨, если влажный 😶🌫️)
|
||||||
|
|
||||||
|
**Установка**.
|
||||||
|
|
||||||
|
Установка заключается в двух действиях:
|
||||||
|
|
||||||
|
1) перейти в папку org.kde.plasma.homemeteo/package, запустить терминал и выполнить команду для установки виджета в систему:
|
||||||
|
**kpackagetool6 -t Plasma/Applet --install .**
|
||||||
|
(обратите внимание, "." точка в конце команды важна!)
|
||||||
|
|
||||||
|
*фактически эта команда скопирует содержимое виджета в каталог пользовательских виджетов по следующему пути:* /home/ИМЯ_Пользователя/.local/share/plasma/plasmoids/org.kde.plasma.homemeteo/
|
||||||
|
|
||||||
|
2) после этого на рабочем столе кликнете правой кнопкой мыши "**Перейти в режим редактирования**", Нажать на кнопку "добавить или изменить виджеты" и выбрать из списка
|
||||||
|
**Home Meteo** *Домашняя метеостанция*
|
||||||
|
[screenshot5.png](README_files/screenshot5.png) , и разместить в удобном месте рабочего стола. После запуска виджета первые данные придут через 30-35 секунд.
|
||||||
|
|
||||||
|
|
||||||
BIN
README_files/screenshot1.png
Normal file
BIN
README_files/screenshot1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
BIN
README_files/screenshot2.png
Normal file
BIN
README_files/screenshot2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
BIN
README_files/screenshot3.png
Normal file
BIN
README_files/screenshot3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
BIN
README_files/screenshot4.png
Normal file
BIN
README_files/screenshot4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
BIN
README_files/screenshot5.png
Normal file
BIN
README_files/screenshot5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
14
org.kde.plasma.homemeteo/package/contents/config/main.xml
Normal file
14
org.kde.plasma.homemeteo/package/contents/config/main.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0">
|
||||||
|
<group name="General">
|
||||||
|
<entry name="fontSize" type="Int">
|
||||||
|
<default>16</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="customColor" type="Color">
|
||||||
|
<default>#ffffff</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="useCustomColor" type="Bool">
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
</group>
|
||||||
|
</kcfg>
|
||||||
11
org.kde.plasma.homemeteo/package/contents/ui/arduino_bridge.sh
Executable file
11
org.kde.plasma.homemeteo/package/contents/ui/arduino_bridge.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
# #!/bin/bash
|
||||||
|
#
|
||||||
|
# Настройка порта
|
||||||
|
stty -F /dev/arduino 9600 raw -echo -icanon hupcl 2>/dev/null
|
||||||
|
|
||||||
|
cat /dev/arduino | while read -r line; do
|
||||||
|
if [[ $line =~ ([0-9.]+)[[:space:]]+([0-9.]+) ]]; then
|
||||||
|
# Перезаписываем файл: только текущие значения T и H
|
||||||
|
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}" > /tmp/arduino_last_run
|
||||||
|
fi
|
||||||
|
done
|
||||||
210
org.kde.plasma.homemeteo/package/contents/ui/main.qml
Normal file
210
org.kde.plasma.homemeteo/package/contents/ui/main.qml
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import org.kde.plasma.plasmoid
|
||||||
|
import org.kde.plasma.components as PlasmaComponents
|
||||||
|
import org.kde.plasma.plasma5support as Plasma5Support
|
||||||
|
import org.kde.plasma.core as PlasmaCore
|
||||||
|
|
||||||
|
PlasmoidItem {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
readonly property int fontSize: (Plasmoid.configuration.fontSize
|
||||||
|
> 0) ? Plasmoid.configuration.fontSize : 16
|
||||||
|
readonly property color textColor: Plasmoid.configuration.useCustomColor ? Plasmoid.configuration.customColor : PlasmaComponents.Label.color
|
||||||
|
|
||||||
|
// Настройка заголовка и иконки через присоединенное свойство
|
||||||
|
Plasmoid.title: i18n("Home Meteo")
|
||||||
|
Plasmoid.icon: "applications-system"
|
||||||
|
|
||||||
|
property string tempValue: "--.-"
|
||||||
|
property string humValue: "--.-"
|
||||||
|
property string tempEmoji: "⏳"
|
||||||
|
property string humEmoji: "⏳"
|
||||||
|
property string lastUpdate: "..."
|
||||||
|
|
||||||
|
width: 320
|
||||||
|
height: 180
|
||||||
|
Plasmoid.backgroundHints: PlasmaCore.Types.NoBackground
|
||||||
|
| PlasmaCore.Types.ConfigurableBackground
|
||||||
|
|
||||||
|
fullRepresentation: Rectangle {
|
||||||
|
id: mainCanvas
|
||||||
|
implicitWidth: 320
|
||||||
|
implicitHeight: 180
|
||||||
|
color: Qt.rgba(root.textColor.r, root.textColor.g,
|
||||||
|
root.textColor.b, 0.2)
|
||||||
|
radius: 15
|
||||||
|
border.color: root.textColor
|
||||||
|
border.width: 1
|
||||||
|
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
// Привязываемся к краям родителя с внутренним отступом
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: 10
|
||||||
|
columns: 2
|
||||||
|
rowSpacing: 0 // Убираем лишние промежутки между строками
|
||||||
|
columnSpacing: 10
|
||||||
|
|
||||||
|
// Заголовки
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: "Температура, °C"
|
||||||
|
font.pointSize: root.fontSize * 0.8
|
||||||
|
color: root.textColor
|
||||||
|
opacity: 0.7
|
||||||
|
}
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: "Влажность, %"
|
||||||
|
font.pointSize: root.fontSize * 0.8
|
||||||
|
color: root.textColor
|
||||||
|
opacity: 0.7
|
||||||
|
}
|
||||||
|
|
||||||
|
// Эмодзи
|
||||||
|
Text {
|
||||||
|
Layout.topMargin: 5
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: root.tempEmoji
|
||||||
|
font.pointSize: root.fontSize * 2.6
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
Layout.topMargin: 5
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: root.humEmoji
|
||||||
|
font.pointSize: root.fontSize * 2.6
|
||||||
|
}
|
||||||
|
|
||||||
|
// Значения
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: root.tempValue
|
||||||
|
font.pointSize: root.fontSize * 1.6
|
||||||
|
font.bold: true
|
||||||
|
color: root.textColor
|
||||||
|
}
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: root.humValue
|
||||||
|
font.pointSize: root.fontSize * 1.6
|
||||||
|
font.bold: true
|
||||||
|
color: root.textColor
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: 5 // Небольшой отступ от цифр
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
text: "Обновлено: " + root.lastUpdate
|
||||||
|
font.pointSize: root.fontSize * 0.6
|
||||||
|
opacity: 0.7
|
||||||
|
color: root.textColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gradient: Gradient {
|
||||||
|
GradientStop {
|
||||||
|
position: 0.0
|
||||||
|
color: "azure"
|
||||||
|
}
|
||||||
|
GradientStop {
|
||||||
|
position: 0.7
|
||||||
|
color: "honeydew"
|
||||||
|
}
|
||||||
|
GradientStop {
|
||||||
|
position: 2.0
|
||||||
|
color: "lightgoldenrodyellow"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Источник данных для чтения файла
|
||||||
|
Plasma5Support.DataSource {
|
||||||
|
id: fileProcessor
|
||||||
|
engine: "executable"
|
||||||
|
connectedSources: []
|
||||||
|
onNewData: (source, data) => {
|
||||||
|
let stdout = data.stdout ? data.stdout.trim() : "";
|
||||||
|
|
||||||
|
// ШАГ 1: Проверка размера
|
||||||
|
if (source.includes("stat -c%s")) {
|
||||||
|
let size = parseInt(stdout) || 0;
|
||||||
|
if (size > 1024) {
|
||||||
|
fileProcessor.connectSource("> /tmp/arduino_last_run");
|
||||||
|
console.log("Критический размер файла! Очистка.");
|
||||||
|
} else {
|
||||||
|
// Переход к шагу 2
|
||||||
|
fileProcessor.connectSource("stat -c%y /tmp/arduino_last_run | awk '{print $2}' | cut -d. -f1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ШАГ 2: Получение времени (ищем формат 00:00:00)
|
||||||
|
else if (stdout.match(/^\d{2}:\d{2}:\d{2}$/)) {
|
||||||
|
root.lastUpdate = stdout;
|
||||||
|
// Переход к шагу 3
|
||||||
|
fileProcessor.connectSource("cat /tmp/arduino_last_run");
|
||||||
|
}
|
||||||
|
// ШАГ 3: Чтение самих данных
|
||||||
|
else if (source.includes("cat ")) {
|
||||||
|
parseData(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnectSource(source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: refreshTimer
|
||||||
|
interval: 5000
|
||||||
|
running: true
|
||||||
|
repeat: true
|
||||||
|
triggeredOnStart: true
|
||||||
|
onTriggered: {
|
||||||
|
// Запуск цепочки: проверяем размер.
|
||||||
|
// Если файла нет, echo 0 предотвратит ошибку DataSource.
|
||||||
|
fileProcessor.connectSource("stat -c%s /tmp/arduino_last_run 2>/dev/null || echo 0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseData(out) {
|
||||||
|
|
||||||
|
if (!out) return;
|
||||||
|
let m = out.match(/[-+]?[0-9]*\.?[0-9]+/g)
|
||||||
|
if (m && m.length >= 2) {
|
||||||
|
let t = parseFloat(m[0])
|
||||||
|
let h = parseFloat(m[1])
|
||||||
|
root.tempValue = t.toFixed(1)
|
||||||
|
root.humValue = h.toFixed(1)
|
||||||
|
root.tempEmoji = t > 27 ? "🥵" : (t < 22 ? "🥶" : "😊")
|
||||||
|
root.humEmoji = h < 40 ? "😮💨" : (h > 60 ? "😶🌫️" : "😊")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plasma5Support.DataSource {
|
||||||
|
id: scriptLauncher
|
||||||
|
engine: "executable"
|
||||||
|
connectedSources: []
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
// В Plasma 6 используем Qt.resolvedUrl для получения пути к текущей папке
|
||||||
|
// .replace("file://", "") нужно, так как DataSource ожидает путь к системе, а не URL
|
||||||
|
let currentDir = Qt.resolvedUrl(".").toString().replace("file://",
|
||||||
|
"")
|
||||||
|
let scriptPath = currentDir + "arduino_bridge.sh"
|
||||||
|
|
||||||
|
if (scriptPath) {
|
||||||
|
scriptLauncher.connectSource(`chmod +x ${scriptPath} && ${scriptPath}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
org.kde.plasma.homemeteo/package/metadata.json
Normal file
17
org.kde.plasma.homemeteo/package/metadata.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"KPackageStructure": "Plasma/Applet",
|
||||||
|
"KPlugin": {
|
||||||
|
|
||||||
|
"Category": "Environment and Weather",
|
||||||
|
"Id": "org.kde.plasma.homemeteo",
|
||||||
|
"Name": "Home Meteo",
|
||||||
|
"Name[ru]": "Домашняя метеостанция",
|
||||||
|
"Description": "Home Arduino Meteo Station",
|
||||||
|
"Description[ru]": "Домашняя метеостанция на базе Arduino",
|
||||||
|
"Version": "1.0",
|
||||||
|
"Authors": [{ "Name": "Lina" }],
|
||||||
|
"Icon": "weather-showers-day",
|
||||||
|
"ServiceTypes": ["Plasma/Applet"]
|
||||||
|
},
|
||||||
|
"X-Plasma-API-Minimum-Version" : "6.0"
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user