Compare commits

..

No commits in common. 'main' and 'nano-revision-2.0' have entirely different histories.

  1. BIN
      Hardware/Nano845.fzz
  2. 1
      README.md
  3. 95
      Software/BiDi/BiDi.ino
  4. 27
      Software/LCDReceiver/LCDReceiver.ino
  5. 61
      Software/Receiver/Receiver.ino
  6. 14
      Software/Sender/Sender.ino
  7. 11
      Software/SerialTransceiver/SerialTransceiver.ino
  8. 13
      Software/TempSender/TempSender.ino
  9. 12
      Software/TempSenderPlusIR/TempSenderPlusIR.ino

BIN
Hardware/Nano845.fzz

Binary file not shown.

1
README.md

@ -2,4 +2,3 @@
|-------|------------------|-----------------|---------|---------| |-------|------------------|-----------------|---------|---------|
| 1.0 | D2 | D3 | U7 | U8 | | 1.0 | D2 | D3 | U7 | U8 |
| 2.0 | D2 | (D10)| U8 | U7 | | 2.0 | D2 | (D10)| U8 | U7 |
| 2.1 | D3 | D2 | U8 | U7 |

95
Software/BiDi/BiDi.ino

@ -0,0 +1,95 @@
/* RS 485-Implementierung, die sowohl Schreiben als auch Lesen kann */
/* Basis für andere Projekte */
#define BUTTON 2
#define RECEIVE 3
#define RECEIVE_ENABLE 4
#define SEND 5
#define SEND_ENABLE 6
#define MAX_LEN 128
void setup() {
// Buttons connected to analog input lines
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);
pinMode(A6,INPUT_PULLUP);
pinMode(A7,INPUT_PULLUP);
// Currently, all buttons are also connected via a diode to an interruptable pin, to notify on input changes.
// This interruptable pin should be assgined to BUTTON
pinMode(BUTTON,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON),button,FALLING); // interrupt for button change
// Set up pins for RS485 connection
pinMode(RECEIVE, INPUT);
pinMode(RECEIVE_ENABLE, OUTPUT);
pinMode(SEND, OUTPUT);
pinMode(SEND_ENABLE, OUTPUT);
attachInterrupt(digitalPinToInterrupt(RECEIVE),receive,CHANGE); // interrupt for incoming RS485 traffic
reset485();
buttons = 0x0;
}
void button() {
buttons = 0xFF ^ (digitalRead(A7)<<7 | digitalRead(A6)<<6 | digitalRead(A5)<<5 | digitalRead(A4)<<4 | digitalRead(A3)<<3 | (!digitalRead(A2))<<2 | digitalRead(A1)<<1 | digitalRead(A0));
}
void receive(){
bool received_bit = digitalRead(RECEIVE);
curr = micros();
duration = curr - last;
Serial.print("Input switched to ");
Serial.print(received_bit?"H":"L");
Serial.print(" after ");
Serial.print(duration);
Serial.println(" ticks");
last = curr;
if (duration > MAX_TICKS) reset485();
received_bit = !received_bit; // received_bit is the current value, the duration of the previous value (=inverted) has been measured
duration /= BASE;
while (duration > 0){
byte_idx--;
recv |= received_bit<<byte_idx;
if (byte_idx == 0) {
msg[msg_idx] = recv;
msg_idx++;
byte_idx = 8;
if (recv == 0x00) message_received();
}
duration--;
}
}
void reset485(){
byte_idx = 8;
msg_idx = 0;
recv=0x0;
}
void message_received(){
for (int i=0; i<MAX_LEN; i++) message[i]=msg[i];
reset485();
}
void button_pressed(int i){
Serial.println("not implemented");
}
void loop(){
if (buttons>0){
for (int i=0; i<7; i++){
if (buttons & (1<<i)) button_pressed(i);
}
}
if (message[0] != 0x0){
Serial.print("Received '");
Serial.print(message);
Serial.println("'");
message[0] = 0x0;
}
}

27
Software/LCDReceiver/LCDReceiver.ino

@ -9,19 +9,19 @@
#include <LiquidCrystal.h> #include <LiquidCrystal.h>
#include <SoftRS485.h> #include <SoftRS485.h>
#define Max485_RO 2 // read-output of Max485 #define PROGRAM "RS485-Nano Rev 2.0 / LCDReceive 1.2"
#define Max485_RE 8 // not-read-enable of Max485
#define Max485_DE 8 // data enable of Max485
#define Max485_DI 9 // data input of Max485
#define LCD_RS 10 #define Max485_RO 3 // read-output of Max485
#define LCD_EN 11 #define Max485_RE 5 // not-read-enable of Max485
#define LCD_D4 4 #define Max485_DE 9 // data enable of Max485
#define LCD_D5 5 #define Max485_DI 8 // data input of Max485
#define LCD_D6 6
#define LCD_D7 7
#define PROGRAM "RS485-Nano 2.1 / LCDReceive 1.2" #define LCD_RS 4
#define LCD_EN 6
#define LCD_D4 7
#define LCD_D5 11
#define LCD_D6 12
#define LCD_D7 13
// initialize the library by associating any needed LCD interface pin with the arduino pin number it is connected to // initialize the library by associating any needed LCD interface pin with the arduino pin number it is connected to
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7); LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
@ -29,12 +29,10 @@ LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
init485(Max485_RO,Max485_RE,Max485_DE,Max485_DI); // library initialization: init485(Max485_RO,Max485_RE,Max485_DE,Max485_DI); // library initialization:
// set up the LCD's number of columns and rows: // set up the LCD's number of columns and rows:
lcd.begin(16, 4); lcd.begin(16, 2);
// Print a message to the LCD. // Print a message to the LCD.
printMessage(PROGRAM); printMessage(PROGRAM);
} }
void printMessage(String s){ void printMessage(String s){
@ -45,7 +43,6 @@ void printMessage(String s){
auto cstr = s.c_str(); auto cstr = s.c_str();
for (int i=0;i<s.length();i++){ for (int i=0;i<s.length();i++){
if (col == 0 && cstr[i] == ' ') continue; if (col == 0 && cstr[i] == ' ') continue;
if (cstr[i] == '{' || cstr[i] == '}') continue;
lcd.print(cstr[i]); lcd.print(cstr[i]);
col++; col++;
if (cstr[i]==',' || col==16){ if (cstr[i]==',' || col==16){

61
Software/Receiver/Receiver.ino

@ -0,0 +1,61 @@
// Für Controllino könnte man benutzen: sRx = 20, sTx = 21, enable = 53
int sTx = 2;
int sRx = 3;
long base = 100;
long rst = base*10; // reset
boolean bt = false;
long dif = 0;
long lt = 0;
long now = 0;
char rcv = 0;
int idx = 0;
String message;
void setup(){
pinMode(sRx,INPUT);
pinMode(sTx,OUTPUT);
attachInterrupt(digitalPinToInterrupt(sRx),change485,CHANGE);
Serial.begin(115200);
Serial.println("Receiver ready");
}
void reset485(long dif){
rcv = 0;
idx = -1;
message.reserve(32);
}
void change485(){
bool bt = digitalRead(sRx);
now = micros();
dif = now - lt;
lt = now;
if (dif > rst){
reset485(dif);
} else {
handle485(!bt,dif);
}
}
void handle485(boolean bt, long dif){
long count = dif/base;
for (int i=0; i<count; i++) push485(bt);
}
void push485(boolean bt){
if (idx>=0) rcv |= bt<<idx;
idx++;
if (idx == 8){
if (rcv == 13) {
Serial.println(message);
message = "";
} else {
message+=rcv;
}
idx =0;
rcv =0;
}
}
void loop(){}

14
Software/Sender/Sender.ino

@ -20,13 +20,13 @@
#define ID 0 #define ID 0
#define PROGRAM "Sender" #define PROGRAM "Sender"
#define SW_VERSION "1.3" #define SW_VERSION "1.3"
#define HW_VERSION "2.1" #define HW_VERSION "2.0"
#define BTN_INT 3 // button interrupt pin #define BTN_INT 2 // button interrupt pin
#define Max485_RO 2 // read-output of Max485 #define Max485_RO 3 // read-output of Max485
#define Max485_RE 3 // not-read-enable of Max485 #define Max485_RE 5 // not-read-enable of Max485
#define Max485_DE 8 // data enable of Max485 #define Max485_DE 9 // data enable of Max485
#define Max485_DI 9 // data input of Max485 #define Max485_DI 8 // data input of Max485
#define TRESHOLD 1024 #define TRESHOLD 1024
#define TRIGGER_LEVEL 200 #define TRIGGER_LEVEL 200
@ -81,7 +81,7 @@ void isr(){
raw_states[7] = analogRead(21)<TRIGGER_LEVEL; raw_states[7] = analogRead(21)<TRIGGER_LEVEL;
#ifdef LOG_TO_SERIAL #ifdef LOG_TO_SERIAL
for (int i=0;i<8;i++){ for (int i=0;i<8;i++){
Serial.print(" "); Serial.print(" ");
Serial.print(raw_states[i]); Serial.print(raw_states[i]);
Serial.print(" "); Serial.print(" ");
} }

11
Software/SerialTransceiver/SerialTransceiver.ino

@ -8,13 +8,12 @@
// include the library code: // include the library code:
#include <SoftRS485.h> #include <SoftRS485.h>
#define Max485_RO 3 // read-output of Max485
#define Max485_RE 5 // not-read-enable of Max485
#define Max485_DE 9 // data enable of Max485
#define Max485_DI 8 // data input of Max485
#define Max485_RO 2 // read-output of Max485 #define PROGRAM "{hw:RS485-Nano rev 2.0,firmware:Transceiver,version:1.0}"
#define Max485_RE 3 // not-read-enable of Max485
#define Max485_DE 8 // data enable of Max485
#define Max485_DI 9 // data input of Max485
#define PROGRAM "{hw:RS485-Nano rev 2.1,firmware:Transceiver,version:1.0}"
String message = ""; String message = "";
char c; char c;

13
Software/TempSender/TempSender.ino

@ -21,15 +21,15 @@
// 6=Bad OG // 6=Bad OG
#define ID 0 #define ID 0
#define HW_VERSION "2.1" #define HW_VERSION "2.0"
#define PROGRAM "TempSender" #define PROGRAM "TempSender"
#define SW_VERSION "1.5" #define SW_VERSION "1.5"
#define BTN_INT 3 // button interrupt pin #define BTN_INT 2 // button interrupt pin
#define Max485_RO 2 // read-output of Max485 #define Max485_RO 3 // read-output of Max485
#define Max485_RE 3 // not-read-enable of Max485 #define Max485_RE 5 // not-read-enable of Max485
#define Max485_DE 8 // data enable of Max485 #define Max485_DE 9 // data enable of Max485
#define Max485_DI 9 // data input of Max485 #define Max485_DI 8 // data input of Max485
#define TRESHOLD 1024 #define TRESHOLD 1024
#define TRIGGER_LEVEL 200 #define TRIGGER_LEVEL 200
@ -47,7 +47,6 @@ unsigned long capacitor[8];
unsigned long times[8]; unsigned long times[8];
unsigned long sensor_time = 0; unsigned long sensor_time = 0;
// these values are used for temperature processing
SimpleDHT22 sensor(DHT_PIN); SimpleDHT22 sensor(DHT_PIN);
float temperature = 0; float temperature = 0;
float humidity = 0; float humidity = 0;

12
Software/TempSenderPlusIR/TempSenderPlusIR.ino

@ -24,13 +24,13 @@
#define ID 0 #define ID 0
#define PROGRAM "Temp+IR" #define PROGRAM "Temp+IR"
#define SW_VERSION "0.1" #define SW_VERSION "0.1"
#define HW_VERSION "2.1" #define HW_VERSION "2.0"
#define BTN_INT 3 // button interrupt pin #define BTN_INT 2 // button interrupt pin
#define Max485_RO 2 // read-output of Max485 #define Max485_RO 3 // read-output of Max485
#define Max485_RE 3 // not-read-enable of Max485 #define Max485_RE 5 // not-read-enable of Max485
#define Max485_DE 8 // data enable of Max485 #define Max485_DE 9 // data enable of Max485
#define Max485_DI 9 // data input of Max485 #define Max485_DI 8 // data input of Max485
#define TRESHOLD 1024 #define TRESHOLD 1024
#define TRIGGER_LEVEL 200 #define TRIGGER_LEVEL 200

Loading…
Cancel
Save