fa139a0642ea8593206f60e7f22fa6bc53736600
[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 // setup
80
81 void help() {
82   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");
83 }
84
85 void setup() {
86   Serial.begin(9600);
87   mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2  
88   mySwitch.enableTransmit(10); // with sender wired in receiving doesn't work, pin #10
89
90   // DS18B20
91   sensors.begin();
92
93   // DHT22
94   dht.setup(8);
95
96 }
97
98 int serial_pos = 0;
99 char serial_data[2]; // socket (0-9), state (0-1)
100 char binary_data[24];
101
102 void loop() {
103   if (mySwitch.available()) {
104     Serial.print(mySwitch.getReceivedBitlength());
105     Serial.print(" bits ");
106     Serial.println(mySwitch.getReceivedValue(), BIN);
107     mySwitch.resetAvailable();
108   }
109   if (Serial.available() > 0) {
110      char input = Serial.read();
111
112      if (input == '?' || input == 'h') {
113        help();
114      } else
115
116      if ( input == 'T' ) {
117        Serial.print("DS18B20 temperature = ");
118        sensors.requestTemperatures();
119        Serial.println( sensors.getTempCByIndex(0) );       
120      } else
121
122      if ( input == 'B' ) {
123        Serial.readBytesUntil('\n', binary_data, sizeof(binary_data));
124        Serial.print("# send B");
125        Serial.println( binary_data );
126        LED_ON
127        mySwitch.send( binary_data );
128        LED_OFF
129      } else
130
131     // light sockets at 315 Mhz
132      if (input == 'a') {
133        send_315("1000100110110000000000010");
134      } else
135      if (input == 'b') {
136        send_315("1011001001011111000000010");
137      } else
138
139      // DHT22
140      if (input == 'd') {
141        Serial.print("temperature=");
142        Serial.print(dht.getTemperature());
143        Serial.print(" humidity=");
144        Serial.print(dht.getHumidity());
145        Serial.print(" status=");
146        Serial.println(dht.getStatusString());
147      }
148
149      if ( input >= 0x30 && input <= 0x39 ) {
150        input = input - 0x30; // ASCII to number
151        serial_data[serial_pos++] = input;
152      } else {     
153        Serial.print("# ignore: ");
154        Serial.println(input, HEX);
155      }
156      
157      if ( serial_pos == 2 ) {
158        Serial.print("switch=");
159        Serial.print(serial_data[0], DEC);
160        Serial.print(" state=");
161        Serial.println(serial_data[1] ? "on" : "off");
162
163        byte on = serial_data[1];
164
165        LED_ON
166
167         // switches, 433 Mhz set of 3
168         switch ( serial_data[0] ) {
169          case 1:
170            on   ? mySwitch.send("110101011101010000001100")
171                 : mySwitch.send("110101011101010000000011");
172            break;
173          case 2:
174            on   ? mySwitch.send("110101010111010000001100")
175                 : mySwitch.send("110101010111010000000011");
176            break;
177          case 3:
178            on   ? mySwitch.send("110101010101110000001100")
179                 : mySwitch.send("110101010101110000000011");
180            break;
181          case 4:
182            on   ? mySwitch.send("001111110000000011000000")
183                 : mySwitch.send("001111110000000000000000");
184            break;
185          default:
186            Serial.print("# invalid switch number ");
187            Serial.println(serial_data[0], DEC);
188         }
189
190         LED_OFF
191
192         // reset for later
193         serial_pos = 0;
194      }
195   }
196 }