ATTINY RF433 DUAL SENSOR [CONTACT OR PIR]

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 1
Geregistreerd: 10 Apr 2021, 20:14

ATTINY RF433 DUAL SENSOR [CONTACT OR PIR]

Berichtdoor SmartProjector » 11 Apr 2021, 16:09

THIS CODE IS 1 CODE FOR MAKING 1 OF THE 2 SENSORS WORKING ON 3x AAA 1.2v BATTERIES
CHANGING A FEW EASY VARIABLES IS ENOUGH TO MAKE A CHOICE
YOU CAN EVEN CHOOSE IF YOU WANT TO USE ADC ON PB4 OR NOT.

[code2=]#include <avr/sleep.h> // Sleep Modes
#include <avr/power.h> // Power management
#include <avr/delay.h>
#include <RCSwitch.h>
#include <EnableInterrupt.h>

#define F_CPU 8000000UL

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define Sensor PB3
#define RfTransmitterVcc PB2


/**********************************************************************************************/
/*Here you can adjust what you prefer**********************************************************/
/**********************************************************************************************/
const boolean device = 1; //PIR = 0 & Contact Sensor = 1
const boolean adctoggle = 0; //1 = READ FROM ADC PB4 | 0 = READ FROM INTERNAL VOLTAGE
/**********************************************************************************************/
/*This is for voltage readings and device id ex. 10113600 = 3600 Milivolt of device 1011*******/
/**********************************************************************************************/
#define CHANNEL "1011"
/**********************************************************************************************/
/*OPEN/CLOSE/PIR CODE ex. CHANNEL + Code above 5000(Because of the voltage readings)***********/
/**********************************************************************************************/
#define OPENCode 10118250
#define CLOSEDCode 10118225
#define PIRCode 10118000






RCSwitch mySwitch = RCSwitch();

volatile boolean state;

void setup () {

mySwitch.enableTransmit(1);
mySwitch.setProtocol(1);
mySwitch.setPulseLength(320);
mySwitch.setRepeatTransmit(15);
initADC();
DDRB &= ~(1 << Sensor);
PORTB |= (1 << Sensor);
DDRB |= (1 << RfTransmitterVcc);

PORTB &= ~(1 << RfTransmitterVcc);
if(device){
if (PINB & (1 << Sensor)){
state = 1;
}
else{
state = 0;
}
enableInterrupt(Sensor, mctrigger, CHANGE);
}

}


void mctrigger(void) {
if(PINB & (1 << Sensor)){
state = 1;
}
else{
state = 0;
}
}

void pirtrigger(void) {
state=!state;
}

void loop (){
if(device){
if(PINB & (1 << Sensor)){
state = 1;
}
else{
state = 0;
}

if(state) {
interruptionCode(OPENCode, 1);
delay(500);
if (PINB & (1 << Sensor)){
goToSleep();
}
else{
state = 0;
}
}

if(!state) {
interruptionCode(CLOSEDCode, 0);
delay(500);
if(PINB & (1 << Sensor)){
state = 1;
}
else{
goToSleep();
}
}
}
else{
if(state) {
interruptionCode(PIRCode,1);
}
goToSleep();
}
}

//THANKS TO MARCELPOST
void readVcc(){
if(!adctoggle){
ADMUX = _BV(MUX3) | _BV(MUX2);
sbi(ADCSRA,ADEN);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA,ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high<<8) | low;
result = 1126400L / result; // Calculate Vcc (in mV); 1126400 = 1.1*1024*1000
String strVcc = String(result);
strVcc = CHANNEL + strVcc;
long vcc2 = strVcc.toInt();
delay(100);
mySwitch.send(vcc2, 24);
}
else{
sbi(ADCSRA,ADEN);
ADCSRA |= (1 << ADSC); // start ADC measurement
while (ADCSRA & (1 << ADSC) ); // wait till conversion complete
int adcvalue = ADCH;
adcvalue = round(adcvalue*19.5312); //VOLTAGE REFERENCE
String strVcc = String(adcvalue);
strVcc = CHANNEL + strVcc;
long vcc2 = strVcc.toInt();
delay(100);
mySwitch.send(vcc2, 24);
}

}

void initADC()
{
if(adctoggle){
ADMUX =
(1 << ADLAR) | // left shift result
(0 << REFS1) | // Sets ref. voltage to VCC, bit 1
(0 << REFS0) | // Sets ref. voltage to VCC, bit 0
(0 << MUX3) | // use ADC2 for input (PB4), MUX bit 3
(0 << MUX2) | // use ADC2 for input (PB4), MUX bit 2
(1 << MUX1) | // use ADC2 for input (PB4), MUX bit 1
(0 << MUX0); // use ADC2 for input (PB4), MUX bit 0

ADCSRA =

(1 << ADPS2) | // set prescaler to 64, bit 2
(1 << ADPS1) | // set prescaler to 64, bit 1
(0 << ADPS0); // set prescaler to 64, bit 0
}
}


void interruptionCode(long rfcode, boolean readbattery){
disableInterrupt(Sensor);
PORTB |= (1 << RfTransmitterVcc);
delay(20);
mySwitch.send(rfcode, 24);

if(readbattery == 1){
readVcc();
}

delay(20);
PORTB &= ~(1 << RfTransmitterVcc);
if(device){
enableInterrupt(Sensor, mctrigger, CHANGE);
}
else{
enableInterrupt(Sensor, pirtrigger, RISING);
}
}

void goToSleep (){
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
cbi(ADCSRA,ADEN);
power_all_disable ();
sleep_enable();
sleep_cpu();
sleep_disable();
power_all_enable();
}[/code2]

Advertisement

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: ATTINY RF433 DUAL SENSOR [CONTACT OR PIR]

Berichtdoor ctunes » 20 Apr 2021, 22:11

Bravo!

I'm sure you knew what this al meant!

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 25 gasten