1567feeda117ed69d7ca18c7e53299bb04a7779a
[Arduino] / rpi_promini / rpi_promini.ino
1 /*
2
3   Connect Arduino ProMini 3.3V 8Mhz Atmega328 to Raspberry Pi
4   
5   RPI pin  Arduino
6   RXD      TXD
7   TXD      RXD
8   GPIO6    RST
9   GND      GND
10   +5V      RAW
11
12            2    433Mhz receive
13 //           3    433Mhz outdoor temperature sensor receiver # DISABLED
14            8    DHT22
15            10   433Mhz send
16            11   DS18B20
17            12   315Mhz send
18            13   status LED
19            
20 */
21
22 #include <RCSwitch.h>
23
24 #include <OneWire.h>
25 #include <DallasTemperature.h>
26
27 RCSwitch mySwitch = RCSwitch();
28
29 // DS18B20 on pin 11
30 OneWire oneWire(11);
31 DallasTemperature sensors(&oneWire);
32
33
34 // 315Mhz light sockets
35 #define TX_PIN 12
36 #define LED_PIN 13
37 #define LED_ON  digitalWrite(LED_PIN, HIGH);
38 #define LED_OFF digitalWrite(LED_PIN, LOW);
39
40 int int_0 = 300; // ms
41 int int_1 = 900; // ms
42 int wait  = 2000; // ms
43 int repeat = 20; // times (5 times seem a little low for sensors which are more than 10m away)
44
45 void send_315(char *code) {
46   Serial.print("send 315Mhz ");
47   Serial.println(code);
48   
49   // we have to send same signal at least two times
50   for(int r = 0; r < repeat; r++ ) {
51
52     digitalWrite(LED_PIN, HIGH);
53
54     for(int i = 0; i < strlen(code); i++) {
55       int i1 = int_0;
56       int i2 = int_1;
57       if (code[i] == '1' ) {
58         i1 = int_1;
59         i2 = int_0;
60       }
61       digitalWrite(TX_PIN, HIGH);
62       delayMicroseconds(i1);
63       digitalWrite(TX_PIN, LOW);
64       delayMicroseconds(i2);
65     }
66
67     digitalWrite(LED_PIN, LOW);
68
69     delayMicroseconds(wait); // guess
70   }
71
72 }
73
74
75 // DHT22
76 #include "DHT.h"
77 DHT dht;
78
79 #include "RunningAverage.h"
80
81 RunningAverage temp_avg(20);
82 RunningAverage hum_avg(20);
83
84 // setup
85
86 void help() {
87   Serial.print("# press buttons on remote or send AB where A = socket (0..9), B = state (0 = off, 1 = on)\nB00...00 (24 digits) to send binary\n");
88 }
89
90 void setup() {
91   Serial.begin(9600);
92   mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2  
93   mySwitch.enableTransmit(10); // with sender wired in receiving doesn't work, pin #10
94   mySwitch.setRepeatTransmit(repeat); // or change to be different for 433 and 315 MHz
95
96   // DS18B20
97   sensors.begin();
98
99   // DHT22
100   dht.setup(8);
101
102     temp_avg.addValue( dht.getTemperature() );
103     hum_avg.addValue( dht.getHumidity() );
104
105 }
106
107 int serial_pos = 0;
108 char serial_data[2]; // socket (0-9), state (0-1)
109 char binary_data[32];
110
111 unsigned long time = millis();
112
113 void loop() {
114   if ( millis() - time > 2000 ) {
115         float t = dht.getTemperature();
116     if ( dht.getStatus() == 0 )
117       temp_avg.addValue( t );
118         float h = dht.getHumidity();
119     if ( dht.getStatus() == 0 )
120       hum_avg.addValue( h );
121     time = millis();
122   }
123
124   if (mySwitch.available()) {
125     Serial.print(mySwitch.getReceivedBitlength());
126     Serial.print(" bits ");
127     Serial.println(mySwitch.getReceivedValue(), BIN);
128     mySwitch.resetAvailable();
129   }
130   if (Serial.available() > 0) {
131      char input = Serial.read();
132
133      if (input == '?' || input == 'h') {
134        help();
135      } else
136
137      if ( input == 'T' ) {
138        Serial.print("DS18B20 temperature = ");
139        sensors.requestTemperatures();
140        Serial.println( sensors.getTempCByIndex(0) );       
141      } else
142
143      if ( input == 'B' ) {
144        Serial.readBytesUntil('\n', binary_data, sizeof(binary_data));
145        Serial.print("# send B");
146        Serial.println( binary_data );
147        LED_ON
148        mySwitch.send( binary_data );
149        LED_OFF
150      } else
151
152      if ( input == 'R' ) {
153        Serial.readBytesUntil('\n', binary_data, sizeof(binary_data));
154        Serial.print("# send 315 binary ");
155        Serial.println( binary_data );
156        send_315( binary_data );
157      } else
158
159     // light sockets at 315 Mhz
160      if (input == 'a') {
161        send_315("1000100110110000000000010");
162      } else
163      if (input == 'b') {
164        send_315("1011001001011111000000010");
165      } else
166
167      // DHT22
168      if (input == 'd') {
169        Serial.print("temperature=");
170        Serial.print(temp_avg.getAverage());
171        Serial.print(" humidity=");
172        Serial.println(hum_avg.getAverage());
173      }
174
175      if ( input >= 0x30 && input <= 0x39 && serial_pos < 2 ) {
176        input = input - 0x30; // ASCII to number
177        serial_data[serial_pos++] = input;
178      } else {     
179        Serial.print("# ignore: ");
180        Serial.println(input, HEX);
181      }
182      
183      if ( serial_pos == 2 ) {
184        Serial.print("switch=");
185        Serial.print(serial_data[0], DEC);
186        Serial.print(" state=");
187        Serial.println(serial_data[1] ? "on" : "off");
188
189        byte on = serial_data[1];
190
191        LED_ON
192
193         // switches, 433 Mhz set of 3
194         switch ( serial_data[0] ) {
195          case 1:
196            on   ? mySwitch.send("110101011101010000001100")
197                 : mySwitch.send("110101011101010000000011");
198            break;
199          case 2:
200            on   ? mySwitch.send("110101010111010000001100")
201                 : mySwitch.send("110101010111010000000011");
202            break;
203          case 3:
204            on   ? mySwitch.send("110101010101110000001100")
205                 : mySwitch.send("110101010101110000000011");
206            break;
207          case 4:
208            on   ? mySwitch.send("001111110000000011000000")
209                 : mySwitch.send("001111110000000000000000");
210            break;
211          case 5:
212 /*
213                 cca. 320Mhz 4 channel 4.8A 220V relay
214
215                 A       1101001010011010011100010
216                 B       1101001010011010011101000
217                 C       1101001010011010011100100
218                 D       1101001010011010011110000
219                 off     1101001010011010011111000
220                 on      1101001010011010011100110
221 */
222                 switch ( on ) {
223                         case '0': send_315( "1101001010011010011111000" );
224                         case '1': send_315( "1101001010011010011100110" );
225                         case 'A': send_315( "1101001010011010011100010" );
226                         case 'B': send_315( "1101001010011010011101000" );
227                         case 'C': send_315( "1101001010011010011100100" );
228                         case 'D': send_315( "1101001010011010011110000" );
229                         default:  Serial.println("# ERROR: use 0-off 1-on A B C D");
230                 }
231          default:
232            Serial.print("# invalid switch number ");
233            Serial.println(serial_data[0], DEC);
234         }
235
236         LED_OFF
237
238         // reset for later
239         serial_pos = 0;
240      }
241   }
242 }