Berühren Sie den Mini-Schalter mit Glasscheibe am nRF52832

Im heutigen Artikel möchte ich Ihnen ein neues Projekt vorstellen. Diesmal ist es ein Touch-Schalter mit einer Glasscheibe. Das Gerät ist kompakt und misst 42 x 42 mm (Standardglasscheibe hat Abmessungen 80 x 80 mm). Die Geschichte dieses Geräts begann vor langer Zeit, vor etwa einem Jahr.



Die ersten Optionen betrafen den atmega328-Mikrocontroller, aber am Ende endete alles mit dem nRF52832-Mikrocontroller.



Der Touch-Teil des Geräts läuft auf TTP223-Chips. Beide Sensoren werden von einem Interrupt bedient. Angetrieben von einer CR2477-Batterie über einen Aufwärtswandler auf dem TPS610981-Chip | Datashit .




Das Gerät implementiert eine Ausschaltschaltung für Feldeffekttransistoren. Nach dem Drücken der Taste fängt der Mikrocontroller selbst die Energieverwaltung ab und dann kann die Taste für Servicemodi verwendet werden (in meinem Fall wird sie mit anderen Geräten gekoppelt, die Stromversorgung ausgeschaltet und auf die Werkseinstellungen zurückgesetzt (Werkseinstellungen)).


Es gibt 2 RGB-LEDs, die Status und Servicemodi anzeigen. Ein Piezo-Emitter wurde hinzugefügt, um ein Klicken zu simulieren, wenn Sie die Touch-Tasten und die Tonanzeige der Servicemodi berühren. Die LEDs und der Piezo-Emitter können auf Wunsch des Benutzers ein- und ausgeschaltet werden. Dies erfolgt über die Smart-Home-Steuerung. Durch Senden von Befehlen an technische Sensoren können auch die Benutzerintervalle für das Senden der Batterieladung und des Signalpegels über die Smart-Home-Steuerung geändert werden. In meinem Fall ist es MAJORDOMO .


Der Verbrauch im Übertragungsmodus beträgt 7 mA (250 kbps, 10 ms), der Schlafverbrauch beträgt 40 μA, der Offline-Verbrauch beträgt weniger als 1 μA (= Verbrauch des Aufwärtswandlers im Leerlaufmodus). Ausgang rx, tx, swd Stecker zum Programmieren. Ein Miniatur-2x3p-Anschluss wird in Schritten von 1,27 verwendet. Für die Programmierung wurde ein spezieller Adapter hergestellt.



Wie immer basiert das Gerät auf dem MySensors- Protokoll. Dieser Berührungsschalter soll im Steuerungssystem für Rollläden verwendet werden. Im Allgemeinen ist die Anwendung jedoch nur durch Ihre Vorstellungskraft begrenzt. Zum Beispiel hat bereits jetzt ein Sohn (7 Jahre alt) 3 Bestellungen für die Schalterversion aufgegeben: das Licht in der Toilette mit einer Badewanne ein- und ausschalten (es wird nicht hoch vom Boden montiert), das Licht in einem langen und dunklen Korridor einzuschalten, wenn er mit einer Badewanne und einer weiteren zur Toilette fährt am Bett, um schnell das Licht in deinem Zimmer einzuschalten, damit sich die Monster zerstreuen.





Das Gehäuse wurde traditionell auf einem SLA-Drucker gedruckt, das Gerät ist winzig, das Gehäuse ist klein, die Verwendung dieser Drucktechnologie ist gerechtfertigt.


Gedrucktes Modell anzeigen



Magnete werden in das Gehäuse und die Batterieabdeckung eingeklebt.


Vidosiki mit Tests dieses Geräts:





Für diejenigen, die wiederholen möchten:


Programmcode des Leistungsschaltertests für das Rollo-Steuerungssystem für Arduino IDE


Arduino Viring
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_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() { //delay(1000); pinMode(31, OUTPUT); digitalWrite(31, HIGH); delay(3000); pinMode(3, INPUT); pinMode(25, OUTPUT); pinMode(26, OUTPUT); pinMode(27, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(28, OUTPUT); // bizzer pinMode(2, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(29, INPUT); digitalWrite(28, LOW); // off bizzer digitalWrite(27, HIGH); digitalWrite(26, HIGH); digitalWrite(25, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void before() { //digitalWrite(31, HIGH); NRF_POWER->DCDCEN = 1; //NRF_UART0->ENABLE = 0; analogReadResolution(12); disableNfc(); turnOffAdc(); //wait(2000); 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("Power on|off Node", "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; send(upMsg.set(switch_a)); //wait(200); digitalWrite(6, LOW); wait(10); playSound1(); wait(20); playSound2(); wait(50); } else { switch_a = 0; send(upMsg.set(switch_a)); //wait(200); digitalWrite(6, HIGH); wait(10); playSound2(); wait(20); playSound1(); wait(50); } //sleep_not_pasible = 1; //digitalWrite(25, HIGH); //wait(100); } 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; send(downMsg.set(switch_b)); //wait(200); digitalWrite(25, LOW); wait(10); playSound1(); wait(20); playSound2(); wait(50); } else { switch_b = 0; send(downMsg.set(switch_b)); //wait(200); digitalWrite(25, HIGH); wait(10); playSound2(); wait(20); playSound1(); wait(50); } //sleep_not_pasible = 1; //digitalWrite(6, HIGH); //wait(100); } if (digitalRead(9) == LOW && sens_flag1 == 1) { sens_flag1 = 0; //digitalWrite(6, HIGH); //playSound2(); //wait(50); } if (digitalRead(10) == LOW && sens_flag2 == 1) { sens_flag2 = 0; //digitalWrite(25, HIGH); //playSound2(); //wait(50); } 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) { //   myTone j = 500000 / j; //    j       k += millis(); //          while (k > millis()) { //  ,      digitalWrite(28, HIGH); delayMicroseconds(j); //    i   «1»   j digitalWrite(28, LOW ); delayMicroseconds(j); //    i   «0»   j } } void playSound0() { //wait(500); myTone(1300, 50); //     0,1    2048  wait(20); //  0,1  myTone(1300, 50); wait(50); } void playSound() { //wait(500); myTone(700, 30); //     0,1    2048  wait(10); //  0,1  myTone(700, 30); wait(10); myTone(700, 30); wait(50); //  0,1  //myTone(500, 30); //wait(500); } void playSound1() { //wait(500); myTone(200, 10); //     0,1    2048  wait(10); //  0,1  myTone(400, 5); wait(30); //  0,1  //myTone(500, 30); //wait(500); } void playSound2() { //wait(500); myTone(400, 10); //     0,1    2048  wait(10); //  0,1  myTone(200, 5); wait(30); //  0,1  //myTone(500, 30); //wait(500); } void readBatLev() { //NRF5_ESB_startListening(); wait(200); 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); wait(200); 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); } 

Akten in stl


Gerber-Leiterplattendateien


Bei Fragen zu dieser Entwicklung, zu den Schwierigkeiten in Ihrer Entwicklung werden Arduino und Mysensors in unserem Telegramm- Chat immer zur Hilfe kommen.

Source: https://habr.com/ru/post/de453868/


All Articles