/Designs/duckweed_collector/SW/RF01/RF01.pde
0,0 → 1,49
/*
connections arduino RF01 and RF02
 
in arduino version 018
(not yet tested in more recent arduino versions)
 
tested with ATmega 328
on frequency 433
 
no range test done yet, just in one room
*/
 
//connections RF01: (receiving)
#define SDI 5 // RF01 SDI, arduino 13 cannot be changed
#define SCK 4 // RF01 SCK, arduino 12 cannot be changed
#define CS 3 // RF01 nSEL, arduino 11 cannot be changed
#define SDO 2 // RF01 SDO, arduino 10 cannot be changed
//--------------------- // RF01 niRQ, arduino 02 cannot be changed
//----------------------// RF01 nFFS: 1-10k Pullup too Vcc
 
 
// receiving words with RF01
 
#include <RF01.h>
 
int serialTesting = 1;
 
void setup() {
Serial.begin(9600);
Serial.println("\nRF02 receive");
delay(250);
 
rf01_prepAll();
 
delay(250);
Serial.println("startup");
}
 
void loop() {
 
rf01_receive();
char* buf = (char*) rf01_data;
Serial.println(buf);
Serial.println(" done");
 
delay(500);
}
/Designs/duckweed_collector/SW/RF02/RF02.pde
0,0 → 1,94
/*
connections arduino RF01 and RF02
 
in arduino version 018
(not yet tested in more recent arduino versions)
 
tested with ATmega 328
on frequency 433
 
no range test done yet, just in one room
*/
 
//connections RF02: (sending)
#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8 cannot be changed
#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9 cannot be changed
#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10 cannot be changed
#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12 cannot be changed
//------------------// FSK: Pullupto VCC
 
 
// RF02 sending words
// tested with lib, november 2010
 
#include <RF02.h>
#include <stdint.h>
 
int wissel = 0;//wissel means change in dutch
 
void setup() {
Serial.begin(57600);
Serial.print("hello" );
Serial.println("init" );
rf02_prepAll434();
Serial.println("done" );
pinMode(4, OUTPUT); //testing leds
pinMode(5, OUTPUT);
ledBlink(4);
ledBlink(5);
}
 
void ledBlink(int num){
digitalWrite(num, HIGH);
delay(100);
digitalWrite(num, LOW);
delay(100);
}
 
void loop() {
ledBlink(4);
delay(1550);
Serial.print(wissel );
Serial.println(" send: ");
switch ( wissel)
{
case 0:
{
unsigned char buf[] = { "hello World! \n" };
rf02_changeText( buf, sizeof buf);
Serial.println("hello World! \n");
rf02_sendData();
wissel = 1;
break;
}
case 1:
{
unsigned char buf[] = { "Goodbye Life! \n" };
Serial.println("Goodbye Life! \n");
rf02_changeText( buf, sizeof buf);
rf02_sendData();
wissel = 2;
break;
}
case 2:
{
unsigned char buf[] = { "Bless all! \n" };
Serial.println("Bless all! \n");
rf02_changeText( buf, sizeof buf);
rf02_sendData();
wissel = 0;
break;
}
}
}
 
 
/Designs/duckweed_collector/SW/library/RF01/RF01.cpp
0,0 → 1,220
/*********************************************
*
* draft version v 0.1, experimental
*
* code based on the code of "benedikt k."
* this was an avr project from the site: http://www.mikrocontroller.net/topic/65984#541030
*
*
* code should be matched with RF01
*
* up to now no transmission between the RF12 modules and Jeelabs.com RF12 lib
*
* this code has worked: transmitting using atmega168 and atmega328 in combination with RF01s and RF02s
*
* arduino 18
*
* five march, contrechoc.com, june 2010 , october 2010
*
*
*********************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
 
#include "rf01.h"
 
#define F_CPU 16000000UL
#include <util/delay.h>
 
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
 
#define SDI 5 // RF01 SDI, arduino 13 cannot be changed
#define SCK 4 // RF01 SCK, arduino 12 cannot be changed
#define CS 3 // RF01 nSEL, arduino 11 cannot be changed
#define SDO 2 // RF01 SDO, arduino 10 cannot be changed
//----------------- // RF01 niRQ, arduino 02 cannot be changed
//------------------// RF01 nFFS: 1-10k Pullup too Vcc
 
#define LED_PORT PORTD
#define LED_DDR DDRD
#define LED_PIN PIND
 
#define LED0 5
#define LED1 6 //not used
 
// nFFS: 1-10k Pullup an Vcc !!!
 
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
#ifndef cLED0
#define cLED0() (LED_PORT &= ~(1<<LED0))
#endif
#ifndef sLED0
#define sLED0() (LED_PORT |= (1<<LED0) )
#endif
 
#ifndef cLED1
#define cLED1() (LED_PORT &= ~(1<<LED1))
#endif
#ifndef sLED1
#define sLED1() (LED_PORT |= (1<<LED1) )
#endif
 
// maximum receive buffer
#define RF_MAX 32
unsigned char rf01_buf[RF_MAX]; // recv buf
 
#include <util/delay.h>
 
void rf01_receive(){
rf01_rxdata(rf01_data, 32);
}
 
void rf01_prepAll(){
rf01_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
rf01_setfreq(RF01FREQ(434)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
rf01_setbandwidth(4); // 4 200kHz Bandbreite
rf01_setreceiver(2,4); //2,4 -6dB Verstärkung, DRSSI threshold: -79dBm
rf01_setbaud(57600); // 19200 Baud
 
}
 
static unsigned char sdrssi, sgain;
 
void rf01_trans(unsigned short wert)
{ unsigned char i;
 
cbi(RF_PORT, CS);
for (i=0; i<16; i++)
{ if (wert&32768)
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
sbi(RF_PORT, SCK);
wert<<=1;
_delay_us(0.2);
cbi(RF_PORT, SCK);
}
sbi(RF_PORT, CS);
}
 
void rf01_init(void)
{ unsigned char i;
 
RF_PORT=(1<<CS);
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
 
for (i=0; i<11; i++)
_delay_ms(10); // wait until POR done
 
rf01_trans(0xC2E0); // AVR CLK: 10MHz
rf01_trans(0xC42B); // Data Filter: internal
rf01_trans(0xCE88); // FIFO mode
rf01_trans(0xC6F7); // AFC settings: autotuning: -10kHz...+7,5kHz
rf01_trans(0xE000); // disable wakeuptimer
rf01_trans(0xCC00); // disable low duty cycle
 
LED_DDR= 0xFF;//(1<<LED0)|(1<<LED1);
blinkLED();
 
}
 
void rf01_setbandwidth(unsigned char bandwidth)
{
rf01_trans(0x8970|((bandwidth&7)<<1));
}
 
void rf01_setreceiver(unsigned char gain, unsigned char drssi)
{
sdrssi=drssi;
sgain=gain;
}
 
void rf01_setfreq(unsigned short freq)
{ if (freq<96) // 430,2400MHz
freq=96;
else if (freq>3903) // 439,7575MHz
freq=3903;
rf01_trans(0xA000|freq);
}
 
void rf01_setbaud(unsigned short baud)
{
if (baud<336)
return;
if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7)
rf01_trans(0xC880|((43104/baud)-1));
else
rf01_trans(0xC800|((344828UL/baud)-1));
 
rf01_trans(0xC806);
}
 
void rf01_rxdata(unsigned char *data, unsigned char number)
{ unsigned char i,j,c;
 
rf01_trans(0xC0C1|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX on
rf01_trans(0xCE89); // set FIFO mode
rf01_trans(0xCE8B); // enable FIFO
cbi(RF_PORT, SDI);
for (i=0; i<number; i++)
{ cbi(RF_PORT, CS);
while (!(RF_PIN&(1<<SDO))); // wait until data in FIFO
for (j=0; j<16; j++) // read and discard status register
{ sbi(RF_PORT, SCK);
asm("nop");
cbi(RF_PORT, SCK);
}
c=0;
for (j=0; j<8; j++)
{ c<<=1;
if (RF_PIN&(1<<SDO))
c|=1;
sbi(RF_PORT, SCK);
_delay_us(0.2);
cbi(RF_PORT, SCK);
}
*data++=c;
sbi(RF_PORT, CS);
}
//blinkLED();
rf01_trans(0xC0C0|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX off
}
 
void blinkLED(void){
for (unsigned char i=0; i<15; i++)
_delay_ms(5);
sLED1();
 
for (unsigned char i=0; i<15; i++)
_delay_ms(5);
cLED1();
 
}
 
void makePulse(int numberOfPulses){
if ( numberOfPulses > 0)
{
for (unsigned char i=0; i<numberOfPulses; i++)
{
_delay_ms(20);
sLED0();
_delay_ms(20);
cLED0();
}
_delay_ms(50);
}
 
}
 
/Designs/duckweed_collector/SW/library/RF01/RF01.h
0,0 → 1,26
#ifndef RF01_h
#define RF01_h
 
#include <stdint.h>
 
#define rf01_data (rf01_buf + 2)
 
extern unsigned char rf01_buf[]; // recv/xmit buf including hdr & crc bytes
 
extern void rf01_prepAll();
extern void rf01_receive();
 
extern void rf01_trans(unsigned short wert);
extern void rf01_init(void);
extern void rf01_setbandwidth(unsigned char bandwidth);
extern void rf01_setreceiver(unsigned char gain, unsigned char drssi);
extern void rf01_setfreq(unsigned short freq);
extern void rf01_setbaud(unsigned short baud);
extern void rf01_rxdata(unsigned char *data, unsigned char number);
 
#define RF01FREQ(freq) ((freq-430.0)/0.0025)
 
extern void blinkLED(void);
extern void makePulse(int numberOfPulses);
 
#endif
/Designs/duckweed_collector/SW/library/RF02/RF02.cpp
0,0 → 1,242
/*********************************************
*
* draft version v 0.1, experimental
*
* code based on the code of "benedikt k."
* this was an avr project from the site: http://www.mikrocontroller.net/topic/65984#541030
*
*
* code should be matched with RF01
*
* up to now no transmission between the RF12 modules and Jeelabs.com RF12 lib
*
* this code has worked: transmitting using atmega168 and atmega328 in combination with RF01s and RF02s
*
* arduino 18
*
* five march, contrechoc.com, 2010, june
*
*
*********************************************/
 
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <string.h>
#include "rf02.h"
#include <util/delay.h>
 
#define F_CPU 16000000UL
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
 
#define LED_PORT PORTD
#define LED_DDR DDRD
#define LED_PIN PIND
 
#define LED0 4 -- PD4
#define LED1 2 -- PD2
 
#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8
#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9
#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10
#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12
//------------------// FSK: Pullupto VCC
 
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
#ifndef cLED0
#define cLED0() (LED_PORT &= ~(1<<LED0))
#endif
#ifndef sLED0
#define sLED0() (LED_PORT |= (1<<LED0) )
#endif
 
#ifndef cLED1
#define cLED1() (LED_PORT &= ~(1<<LED1))
#endif
#ifndef sLED1
#define sLED1() (LED_PORT |= (1<<LED1) )
#endif
 
 
 
unsigned char test[32]=" 55555 \n";
 
void rf02_changeText( unsigned char* ptr, uint8_t number){
 
if (number> 32)number = 32;
memcpy( test, ptr, number);
}
 
void rf02_prepAll434(){
 
rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
rf02_setfreq(RF02FREQ(434)); // 433,92MHz
rf02_setpower(1); // -12dBm Ausgangangsleistung
rf02_setmodfreq(3); // 120kHz Frequenzshift
rf02_setbaud(19200); // 19200 Baud
 
}//
 
void rf02_prepAll(unsigned short freq, uint8_t setPower,uint8_t modFreq,unsigned short baudRate){
 
rf02_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
rf02_setfreq( RF02FREQ(freq) ); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
if ( setPower < 0 ) setPower = 0;
if ( setPower > 4 ) setPower = 4;
rf02_setpower(setPower); // -12dBm Ausgangangsleistung
if ( modFreq < 0 ) modFreq = 0;
if ( modFreq > 8 ) modFreq = 8;
rf02_setmodfreq(modFreq); // 120kHz Frequenzshift
rf02_setbaud(baudRate); // 19200 Baud
 
}//
 
 
void rf02_sendData(){
 
rf02_txdata( test, sizeof test);
}
 
 
 
void rf02_trans(unsigned short value)
{ uint8_t i;
 
cbi(RF_PORT, CS);
 
for (i=0; i<16; i++)
{ if (value&0x8000) //0x8000
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
 
sbi(RF_PORT, SCK);
value<<=1;
_delay_us(0.3);
cbi(RF_PORT, SCK);
}
sbi(RF_PORT, CS);
}
 
 
 
void rf02_init(void)
{
RF_PORT=(1<<CS);
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
 
for (unsigned char i=0; i<15; i++)
_delay_ms(10); // wait until POR done
rf02_trans(0xC0E0); // power settings
rf02_trans(0x8A75);// fsk in rfm02 = afc in rf12
// rf02_trans(0x80C7);
rf02_trans(0xC2A0); // enable tx sync bit, disable low bat detector
 
//LED_DDR= 0xFF;
}
 
void rf02_setmodfreq(uint8_t bandwidth)
{
rf02_trans(0x8F80|(bandwidth&7));
//rf02_trans(0x8F70);
}
 
void rf02_setfreq(unsigned short freq)
{ if (freq<96) // 430,2400MHz
freq=96;
else if (freq>3903) // 439,7575MHz
freq=3903;
rf02_trans(0xA000|freq);
 
//rf02_trans(0xA640); //= 434 MHz
}
 
void rf02_setpower(uint8_t power)
{
rf02_trans(0xB000|((power&7)<<8));
}
 
void rf02_setbaud(unsigned short baud)
{
if (baud<1345)
baud=1345;
if (baud<19000)
rf02_trans(0xD240); // 25% PLL current
else if (baud<37000)
rf02_trans(0xD2C0); // 33% PLL current
else
rf02_trans(0xD200); // 50% PLL current
 
//rf02_trans(0xC800|((344828UL/baud)-1)); // Baudrate= 344827,59/(R+1)
rf02_trans(0xC806);
}
 
void rf02_txdata( unsigned char * data, uint8_t number)
{
uint8_t i,value;
value=0xC6; //1100 0110
cbi(RF_PORT, CS); //nSel
 
for (i=0; i<8; i++)
{ if (value&0x80) //1000 0000 = 80
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
 
sbi(RF_PORT, SCK);
value<<=1;
_delay_us(0.2);
cbi(RF_PORT, SCK);
}
 
rf02_shiftout(0xAA);//10101010
rf02_shiftout(0xAA);
rf02_shiftout(0xAA);
rf02_shiftout(0x2D);//00101101
rf02_shiftout(0xD4);//11010100
// no checkbit, in experimenting some letters were transmitted wrong!
 
for (i=0; i<number; i++)
rf02_shiftout(*data++);
 
sbi(RF_PORT, CS);
while(RF_PIN&(1<<IRQ)); // wait until transfer done
rf02_trans(0xC464); // TX off after 10us
 
}
 
void rf02_shiftout(unsigned char value)
{ uint8_t j;
for (j=0; j<8; j++)
{ while(RF_PIN&(1<<IRQ));
while(!(RF_PIN&(1<<IRQ)));
 
if (value&128) //100101000
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
value<<=1;
}
}
/Designs/duckweed_collector/SW/library/RF02/RF02.h
0,0 → 1,26
#ifndef RF02_h
#define RF02_h
 
#include <stdint.h>
 
extern void rf02_prepAll434();
extern void rf02_prepAll(unsigned short freq, uint8_t setPower, uint8_t modFreq, unsigned short baudRate);
//extern void rf02_prepAll(unsigned short freq, uint8_t setPower, uint8_t modFreq, unsigned short baudRate);
 
extern void rf02_sendData();
extern void rf02_changeText( unsigned char* ptr, uint8_t number);
 
extern void rf02_trans(unsigned short value);
extern void rf02_init(void); // init functions
extern void rf02_setmodfreq(uint8_t bandwidth); // set modulation deviation
extern void rf02_setfreq(unsigned short freq); // set tx frequency
extern void rf02_setpower(uint8_t power); // set power (0-7)
extern void rf02_setbaud(unsigned short baud); // set baudrate
extern void rf02_txdata(unsigned char* ptr, uint8_t number); // tx data
extern void rf02_shiftout(unsigned char value);
 
 
#define RF02FREQ(freq) ((freq-430.0)/0.0025)
 
#endif