Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Yn yr erthygl heddiw rwyf am rannu prosiect newydd gyda chi. Y tro hwn mae'n switsh cyffwrdd gyda phanel gwydr. Mae'r ddyfais yn gryno, yn mesur 42x42mm (mae gan baneli gwydr safonol ddimensiynau 80x80mm). Dechreuodd hanes y ddyfais hon amser maith yn Γ΄l, tua blwyddyn yn Γ΄l.

Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Roedd yr opsiynau cyntaf ar y microreolydd atmega328, ond yn y diwedd daeth y cyfan i ben gyda'r microreolydd nRF52832.

Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Mae rhan gyffwrdd y ddyfais yn rhedeg ar sglodion TTP223. Gwasanaethir y ddau synhwyrydd gan un ymyriad. Wedi'i bweru gan fatri CR2477, trwy drawsnewidydd hwb ar y sglodyn TPS610981 | Taflen data.

Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832
Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Mae'r ddyfais yn gweithredu cylched pΕ΅er i ffwrdd gan ddefnyddio transistorau effaith maes. Ar Γ΄l pwyso'r botwm, mae'r microreolydd ei hun yn rhyng-gipio rheolaeth pΕ΅er ac yna gellir defnyddio'r botwm ar gyfer dulliau gwasanaeth (yn fy achos i, mae hyn yn paru Γ’ dyfeisiau eraill, yn diffodd y pΕ΅er ac yn ailosod i osodiadau ffatri).

Mae yna 2 rgb LED ar gyfer nodi cyflwr a dulliau gwasanaeth. Mae allyrrydd piezo hefyd wedi'i ychwanegu i efelychu clic wrth gyffwrdd Γ’ botymau cyffwrdd ac arwydd sain o foddau gwasanaeth. Gellir troi'r LEDs a'r allyrrydd piezo ymlaen ac i ffwrdd yn Γ΄l disgresiwn y defnyddiwr. Gwneir hyn trwy'r rheolydd cartref craff trwy anfon gorchmynion at synwyryddion technegol; gall y defnyddiwr hefyd newid y cyfnodau ar gyfer anfon tΓ’l batri a lefel y signal hefyd trwy'r rheolydd cartref craff. Yn fy achos i mae'n MAJORDOMO.

Y defnydd yn y modd trawsyrru yw 7mA (250kbit, 10ms), treuliant mewn cwsg yw 40Β΅A, defnydd yn y cyflwr oddi ar yn llai nag 1Β΅A (= treuliant y trawsnewidydd hwb yn y modd β€œsegur”). Darperir cysylltydd Rx, tx, swd ar gyfer rhaglennu. Defnyddir cysylltydd bach 2x3p gyda thraw o 1.27. Gwneir addasydd arbennig ar gyfer rhaglennu.

Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Fel bob amser, mae gweithrediad y ddyfais yn seiliedig ar y protocol Fy Synwyr. Bwriedir defnyddio'r switsh cyffwrdd hwn yn y system rheoli dall rholer. Ond yn gyffredinol, dim ond eich dychymyg sy'n cyfyngu ar y cais. Er enghraifft, mae fy mab (7 oed) eisoes wedi gwneud 3 gorchymyn ar gyfer fersiynau switsh: i droi ymlaen ac oddi ar y golau mewn toiled gyda bathtub (bydd yn cael ei osod yn isel o'r llawr), i droi'r golau ymlaen mewn a coridor hir a thywyll wrth deithio i doiled gyda bathtub, ac un arall fel erchwyn gwely, ar gyfer troi'r golau yn eich ystafell yn gyflym fel bod y bwystfilod yn rhedeg i ffwrdd.

Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832
Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832
Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Yn draddodiadol, cafodd yr achos ei argraffu ar argraffydd CLG, mae'r ddyfais yn fach, trodd yr achos yn fach, mae cyfiawnhad dros ddefnyddio'r dechnoleg argraffu hon.

Gweld model printiedigSwitsh cyffwrdd bach gyda phanel gwydr ar nRF52832
Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832
Switsh cyffwrdd bach gyda phanel gwydr ar nRF52832

Mae magnetau'n cael eu gludo i mewn i'r cas a'r gorchudd compartment batri.

Fideos gyda phrofion o'r ddyfais hon:



I'r rhai sydd am ailadrodd:

Profi cod rhaglen ar gyfer switsh mewn system rheoli dall rholio ar gyfer Arduino IDE

Gwifrau Arduino

int8_t timer_status = 0;
boolean sens_flag1 = 0;
boolean sens_flag2 = 0;
boolean switch_a = 0;
boolean switch_b = 0;
uint16_t temp;
float vcc;
int battery;
int old_battery;
uint32_t oldmillis;
uint32_t newmillis;
uint32_t interrupt_time;
uint32_t SLEEP_TIME = 7000;
uint32_t SLEEP_TIME_W;
uint32_t SLEEP_TIME_W2;
int NrfRSSI;
uint16_t NrfRSSI2;
boolean wait_off;
//#define MY_DEBUG
#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 120
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define POWER_CHILD_ID 110
#define UP_POWER_SWITCH_ID 1
#define DOWN_POWER_SWITCH_ID 2
#define CHILD_ID_nRF52_RSSI_RX 3
#define BAT_COOF 0.0092957746478873
#define BAT_MIN 200
#define BAT_MAX 290
#include <MySensors.h>
MyMessage upMsg(UP_POWER_SWITCH_ID, V_STATUS);
MyMessage downMsg(DOWN_POWER_SWITCH_ID, V_STATUS);
MyMessage powerMsg(POWER_CHILD_ID, V_VAR1);
MyMessage msgRF52RssiReceiv(CHILD_ID_nRF52_RSSI_RX, V_VAR1);
void preHwInit() {
pinMode(31, OUTPUT); //power management pin
digitalWrite(31, HIGH);
delay(3000);
pinMode(3, INPUT); // on off mode button
pinMode(25, OUTPUT); // sens1 led
pinMode(26, OUTPUT); // sens1 led
pinMode(27, OUTPUT); // sens1 led
pinMode(6, OUTPUT); // sens21 led
pinMode(7, OUTPUT); // sens2 led
pinMode(8, OUTPUT); // sens2 led
pinMode(28, OUTPUT); // bizzer
pinMode(2, INPUT); // common interrupt for touch sensors
pinMode(9, INPUT); // touch sensors1
pinMode(10, INPUT); //touch sensors2
pinMode(29, INPUT); // battery
digitalWrite(28, LOW);
digitalWrite(27, HIGH);
digitalWrite(26, HIGH);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
void before()
{
NRF_POWER->DCDCEN = 1;
analogReadResolution(12);
disableNfc();
turnOffAdc();
digitalWrite(25, LOW);
digitalWrite(6, LOW);
wait(200);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
wait(100);
playSound0();
wait(100);
digitalWrite(25, LOW);
digitalWrite(6, LOW);
wait(200);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
wait(3000);
digitalWrite(27, LOW);
digitalWrite(8, LOW);
wait(200);
digitalWrite(27, HIGH);
digitalWrite(8, HIGH);
wait(400);
digitalWrite(6, LOW);
digitalWrite(25, LOW);
wait(200);
digitalWrite(6, HIGH);
digitalWrite(25, HIGH);
wait(400);
digitalWrite(26, LOW);
digitalWrite(7, LOW);
wait(200);
digitalWrite(26, HIGH);
digitalWrite(7, HIGH);
wait(1000);
digitalWrite(26, LOW);
digitalWrite(7, LOW);
}
void setup()
{
digitalWrite(26, HIGH);
digitalWrite(7, HIGH);
wait(50);
playSound();
wait(2000);
readBatLev();
wait(200);
SLEEP_TIME_W = SLEEP_TIME;
}
void presentation()
{
sendSketchInfo("EFEKTA ON|OFF NODE 2CH", "1.0");
wait(100);
present(POWER_CHILD_ID, S_CUSTOM, "BATTERY DATA");
wait(100);
present(UP_POWER_SWITCH_ID, S_BINARY, "UP SWITCH");
wait(100);
present(DOWN_POWER_SWITCH_ID, S_BINARY, "DOWN SWITCH");
}
void loop()
{
if (sens_flag1 == 0 && sens_flag2 == 0) {
if (switch_a == 0 && switch_b == 0) {
timer_status = sleep(digitalPinToInterrupt(2), RISING, digitalPinToInterrupt(3), RISING, 3600000, false);
wait_off = 1;
} else {
//oldmillis = millis();
timer_status = sleep(digitalPinToInterrupt(2), RISING, digitalPinToInterrupt(3), RISING, SLEEP_TIME_W, false);
wait_off = 0;
}
}
if (timer_status == 3) {
wait(100);
digitalWrite(27, LOW);
digitalWrite(8, LOW);
wait(2000);
digitalWrite(27, HIGH);
digitalWrite(8, HIGH);
wait(100);
digitalWrite(31, LOW);
}
if (timer_status == 2) {
if (digitalRead(9) == HIGH && sens_flag1 == 0 && switch_b == 0) {
sens_flag1 = 1;
if (switch_a == 0) {
oldmillis = millis();
SLEEP_TIME_W = SLEEP_TIME;
switch_a = 1;
digitalWrite(6, LOW);
wait(10);
playSound1();
wait(20);
playSound2();
wait(50);
send(upMsg.set(switch_a));
wait(200);
} else {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
}
if (digitalRead(10) == HIGH && sens_flag2 == 0 && switch_a == 0) {
sens_flag2 = 1;
if (switch_b == 0) {
oldmillis = millis();
SLEEP_TIME_W = SLEEP_TIME;
switch_b = 1;
digitalWrite(25, LOW);
wait(10);
playSound1();
wait(20);
playSound2();
wait(50);
send(downMsg.set(switch_b));
wait(200);
} else {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
}
if (digitalRead(9) == LOW && sens_flag1 == 1) {
sens_flag1 = 0;
}
if (digitalRead(10) == LOW && sens_flag2 == 1) {
sens_flag2 = 0;
}
if (switch_a == 1 || switch_b == 1) {
if (wait_off == 0) {
newmillis = millis();
wait(10);
SLEEP_TIME_W2 = SLEEP_TIME_W;
wait(10);
interrupt_time = newmillis - oldmillis;
wait(10);
SLEEP_TIME_W = SLEEP_TIME_W2 - interrupt_time;
wait(10);
Serial.print("WAS IN A SLEEP: ");
Serial.print(newmillis - oldmillis);
Serial.println(" MILLISECONDS");
if (SLEEP_TIME_W < 1000) {
if (switch_a == 1) {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
if (switch_b == 1) {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
SLEEP_TIME_W = SLEEP_TIME;
wait(50);
}
Serial.println(SLEEP_TIME);
Serial.println(SLEEP_TIME_W);
Serial.println(SLEEP_TIME_W2);
Serial.print("GO TO SLEEP FOR: ");
Serial.print(SLEEP_TIME_W);
Serial.println(" MILLISECONDS");
}
oldmillis = millis();
}
}
if (timer_status == -1) {
if (switch_a == 1 || switch_b == 1) {
if (switch_a == 1) {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
if (switch_b == 1) {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
} else {
readBatLev();
}
}
}
void disableNfc() {
NRF_NFCT->TASKS_DISABLE = 1;
NRF_NVMC->CONFIG = 1;
NRF_UICR->NFCPINS = 0;
NRF_NVMC->CONFIG = 0;
}
void turnOffAdc() {
if (NRF_SAADC->ENABLE) {
NRF_SAADC->TASKS_STOP = 1;
while (NRF_SAADC->EVENTS_STOPPED) {}
NRF_SAADC->ENABLE = 0;
while (NRF_SAADC->ENABLE) {}
}
}
void myTone(uint32_t j, uint32_t k) {
j = 500000 / j;
k += millis();
while (k > millis()) {
digitalWrite(28, HIGH); delayMicroseconds(j);
digitalWrite(28, LOW ); delayMicroseconds(j);
}
}
void playSound0() {
myTone(1300, 50);
wait(20);
myTone(1300, 50);
wait(50);
}
void playSound() {
myTone(700, 30); 
wait(10);
myTone(700, 30);
wait(10);
myTone(700, 30);
wait(50);
}
void playSound1() {
myTone(200, 10);
wait(10);
myTone(400, 5);
wait(30);
}
void playSound2() {
myTone(400, 10);
wait(10);
myTone(200, 5);
wait(30);
}
void readBatLev() {
temp = analogRead(29);
vcc = temp * 0.0033 * 100;
battery = map((int)vcc, BAT_MIN, BAT_MAX, 0, 100);
if (battery < 0) {
battery = 0;
}
if (battery > 100) {
battery = 100;
}
sendBatteryLevel(battery, 1);
wait(2000, C_INTERNAL, I_BATTERY_LEVEL);
send(powerMsg.set(temp));
wait(200);
NrfRSSI = transportGetReceivingRSSI();
NrfRSSI2 = map(NrfRSSI, -85, -40, 0, 100);
if (NrfRSSI2 < 0) {
NrfRSSI2 = 0;
}
if (NrfRSSI2 > 100) {
NrfRSSI2 = 100;
}
send(msgRF52RssiReceiv.set(NrfRSSI2));
wait(200);
}

Ffeiliau achos yn stl - gyriant google

Ffeiliau PCB Gerber - gyriant google

Ar gyfer cwestiynau am y datblygiad hwn, bydd anawsterau yn eich datblygiadau ar Arduinos a Mysensors bob amser yn dod i'r adwy yn ein sgwrs telegram - https://t.me/mysensors_rus.

Ffynhonnell: hab.com

Ychwanegu sylw