[chronojump] Added Wifi photocells arduino code



commit 331f513e47d25e547c8d30f437541109a2a1ec0c
Author: Xavier Padullés <x padulles gmail com>
Date:   Fri Jul 2 12:06:32 2021 +0200

    Added Wifi photocells arduino code

 arduino/PhotocellWifi/emitter/emitter.ino   | 197 +++++++++++++++++++++++++
 arduino/PhotocellWifi/receiver/receiver.ino | 215 ++++++++++++++++++++++++++++
 2 files changed, 412 insertions(+)
---
diff --git a/arduino/PhotocellWifi/emitter/emitter.ino b/arduino/PhotocellWifi/emitter/emitter.ino
new file mode 100644
index 000000000..5f06a690f
--- /dev/null
+++ b/arduino/PhotocellWifi/emitter/emitter.ino
@@ -0,0 +1,197 @@
+//radio.setRetries(15,15); primer parametro pausa entre intentos,(en múltiplos de 250µS, por eso 0 son 250µS 
 y 15 son  400µS.),hará hasta 15 intentos en caso de error
+//Versión 1.04
+#include <SPI.h>
+#include <RF24.h>
+#include <printf.h>
+#include <MsTimer2.h>
+//
+
+
+//          pin11 -----  M0
+//          pin12 ----- MSO
+// Arduino  pin13 ----- SCK  NRf24L01
+//          pin A4 ---- CSN
+//          pin A3 ----  CE
+//          3,3v            NRf24L01
+//          GND --------    NRf24L01
+
+
+
+// Set up nRF24L01 radio on SPI bus plus pins  (CE & CS)
+
+RF24 radio(A3, A4);   //9,10 originalmente , ahora A3,A4
+
+const int intPin = 0;         //Para definir pin interrupción  0 = interrupción  por pin D2
+const int debounceTime = 1;
+bool pinState = LOW;                //estado pin 2 Alto/Bajo
+bool lastPinState = LOW;
+volatile int cont;  // esta variable es especial para trabajar en la interrupción si hace falta
+volatile bool debounceFlag = LOW;
+uint8_t channel0 = 111; // channel0 defecto frecuencia emisión radio
+uint8_t channel_switch = 0; // recibira  el valor en decimal de microswich ajuste de frecuencia radio
+char c[4];  //para debug veriable frecuencia channel0 envio serie
+uint8_t pot = 0;
+int veces = 0;
+unsigned long tiempo1 = 0; // se le carga millis() cuando entra interrupcion flanco negativo
+unsigned long tiempo2 = 0; // se le carga millis () al detectar en pin d2 flanco positivo
+// se restan las dos variables para determinar la duración del pulso
+//int i;   //index para bucle
+//bool pinState = LOW;
+
+struct frame {
+  short id;
+  bool state;
+  unsigned long totalTime;
+};
+
+frame data = {.id = 0, .state = LOW, .totalTime = 0};
+int len_data = sizeof(data);
+
+// Single radio pipe address for the 2 nodes to communicate.
+const uint64_t pipe = 0xE8E8F0F0E1LL;
+
+
+
+void setup(void)
+{
+
+  /**
+    Set Power Amplifier (PA) level to one of four levels:
+    RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX
+
+    The power levels correspond to the following output levels respectively:
+    NRF24L01: -18dBm, -12dBm,-6dBM, and 0dBm
+
+    SI24R1: -6dBm, 0dBm, 3dBM, and 7dBm.
+
+    @param level Desired PA level.
+
+    void setPALevel ( RF24_PA_LOW );*/
+
+  //radio.setPALevel (RF24_PA_LOW); //funcion  que solo se llama una vez si se quiere cambiar de potencia
+  //pot= radio.getPALevel( ); //función que retorna potencia programada
+
+  Serial.begin(115200);
+  //
+  //  configure rf radio
+  //
+  radio.begin();
+
+
+  // establece frecuencia canal
+  //************************************************************************************
+
+  pinMode(A0, INPUT);       //
+  digitalWrite(A0, HIGH);   //
+  pinMode(A1, INPUT);       // Pone como entradas A0,A1,A3 y a nivel alto
+  digitalWrite(A1, HIGH);   //
+  pinMode(A2, INPUT);       //
+  digitalWrite(A2, HIGH);   //
+
+  //   En estas entradas se pondra un microswich , de 3 botones
+  //   Se leeran en binario y se sumarán al canal por defecto 101
+  if (!digitalRead(A0)) {
+    channel_switch = 1; //
+  }
+  if (!digitalRead(A1)) {
+    channel_switch = channel_switch + 2;
+  }
+  if (!digitalRead(A2)) {
+    channel_switch = channel_switch + 4;
+  }
+
+  //Máximo 125 canales, telefonia wifi ocupa de 2402 a 2472
+  //Nosotros llegamos hasta 2525 total libre del 72 al 125, 1mhz entre canales
+  //Con canales próximos se interfieren en las comunicaciones
+  //Como hay (125 - 71) = 54 canales, hacemos que cada bit del switch aumente en 2 channel0es (7Mhz)
+
+  radio.setChannel(channel0 + channel_switch * 2);
+  //****************************************************************************************
+
+  //-------------------------------------------------------
+  // Open pipes to other nodes for communication
+  // This simple sketch opens a single pipes for these two nodes to communicate
+  // back and forth.  One listens on it, the other talks to it.
+  radio.openWritingPipe(pipe);    //radio.openReadingPipe(1,pipe);
+  //--------------------------------------------------------
+  radio.stopListening();
+  //  printf(" Versión Emisor 1.02 \n\r");
+  Serial.println("Emitter version 1.03");
+  //----------------------------------------------------
+
+//  radio.printDetails();  //imprime configuración del emisor
+
+  //------------------------------------------------------
+
+
+  // Set pull-up resistors for all buttons
+
+  pinMode(2, INPUT_PULLUP);
+  pinMode(3, INPUT_PULLUP);
+  pinMode(4, INPUT_PULLUP);
+  pinMode(5, INPUT_PULLUP);
+  pinMode(6, INPUT_PULLUP);
+  pinMode(7, INPUT_PULLUP);
+  pinMode(8, INPUT_PULLUP);
+  pinMode(9, INPUT_PULLUP);
+  pinMode(10, INPUT_PULLUP);
+
+data.id = 0;
+for(int i = 9; i>=3; i--){
+  data.id = 2 * data.id;
+  if(!digitalRead(i)) {
+    data.id++;
+  }
+}
+
+  //------------------------------------------------------
+  pinState = digitalRead(2);
+  lastPinState = pinState;
+  attachInterrupt(digitalPinToInterrupt(2), controlint, CHANGE); //define interrupcion por  entrada 2, por 
flanco negativo
+
+  //----------------------------------------------------------
+
+  MsTimer2::set(debounceTime, debounce);
+}
+
+void loop(void)   // bucle programa
+{
+  if (debounceFlag == HIGH ) //ha ocurrido interrupción
+  {
+    pinState = digitalRead(2);
+    if(pinState != lastPinState) {
+//      data.totalTime = millis();
+//      if (pinState == LOW)
+//      {
+//        data.state = 'I';
+//      } else if (pinState = HIGH)
+//      {
+//        data.state = 'O';
+//      }
+      data.state = pinState;
+      bool en  = radio.write( &data, len_data -4);
+      lastPinState = pinState;
+
+      debounceFlag = LOW;
+      Serial.print(data.id);
+      Serial.print("\t");
+      Serial.println(pinState);
+      //TODO: comprobar si es mejor desactivar interrupciones o no
+      //interrupts();
+    }
+  }
+}
+
+void controlint()
+{
+  //TODO: comprobar si es mejor desactivar interrupciones o no
+  //noInterrupts();
+  pinState = digitalRead(2);
+  debounceFlag = LOW;
+  MsTimer2::start();
+}
+
+void debounce(){
+  MsTimer2::stop();
+  debounceFlag = HIGH;
+  }
diff --git a/arduino/PhotocellWifi/receiver/receiver.ino b/arduino/PhotocellWifi/receiver/receiver.ino
new file mode 100644
index 000000000..37c8ab107
--- /dev/null
+++ b/arduino/PhotocellWifi/receiver/receiver.ino
@@ -0,0 +1,215 @@
+//Versión 1.03
+
+#include <SPI.h>
+#include <RF24.h>
+#include <printf.h>
+//
+// Hardware configuration
+
+
+//          pin11 -----  M0
+//          pin12 ----- MSO
+// Arduino  pin13 ----- SCK  NRf24L01
+//          pin A4 ---- CSN
+//          pin A3 ----  CE
+//          3,3v       NRf24L01
+//          GND        NRf24L01
+
+String version = "WiFi_Receiver-1.03";
+
+// Set up nRF24L01 radio on SPI bus plus pins  (CE & CS)
+
+RF24 radio(A3, A4);   //9,10 originalmente , ahora A3,A4
+
+//Structure of the received data
+struct frame {
+  short id;
+  bool state;
+  unsigned long totalTime;
+};
+
+//data stores the radio incoming data
+frame data = {.id = 0, .state = LOW, .totalTime = 0};
+int len_data = sizeof(data);
+
+unsigned long totalTime;
+unsigned long sampleTime;
+unsigned long lastSampleTime;
+unsigned long startTime;
+uint8_t channel0 = 111; // Canal defecto frecuencia emisión radio
+uint8_t channel_switch = 0; // recibira  el valor en decimal de microswich ajuste de frecuencia radio
+uint8_t pot = 0;
+bool capturing = false;
+unsigned long baudRate = 115200;
+//
+// Topology
+//
+
+// Single radio pipe address for the 2 nodes to communicate.
+const uint64_t pipe = 0xE8E8F0F0E1LL;
+
+void setup(void)
+{
+//  SPI.setClockDivider(SPI_CLOCK_DIV2);
+
+  /**
+    Set Power Amplifier (PA) level to one of four levels:
+    RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX
+
+    The power levels correspond to the following output levels respectively:
+    NRF24L01: -18dBm, -12dBm,-6dBM, and 0dBm
+
+    SI24R1: -6dBm, 0dBm, 3dBM, and 7dBm.
+
+    @param level Desired PA level.
+
+    void setPALevel ( RF24_PA_LOW );*/
+
+  //radio.setPALevel (RF24_PA_HIGH); //funcion  que solo se llama una vez si se quiere cambiar de potencia
+  //pot= getPALevel( ); //función que retorna potencia programada
+
+
+
+  printf_begin();
+  Serial.begin (baudRate);
+  Serial.print("Initial setup: Baud rate : ");
+  Serial.println(baudRate);
+
+
+
+  radio.begin();
+
+  // establece frecuencia canal
+  //************************************************************************************
+  pinMode(A0, INPUT);       //
+  digitalWrite(A0, HIGH);   //
+  pinMode(A1, INPUT);       // Pone como entradas A0,A1,A3 y a nivel alto
+  digitalWrite(A1, HIGH);   //
+  pinMode(A2, INPUT);       //
+  digitalWrite(A2, HIGH);   //
+
+  //   En estas entradas se pondra un microswich , de 3 botones
+  //   Se leeran en binario y se sumarán al canal por defecto 101
+  if (!digitalRead(A0)) {
+    channel_switch = 1; //
+  }
+  if (!digitalRead(A1)) {
+    channel_switch = channel_switch + 2;
+  }
+  if (!digitalRead(A2)) {
+    channel_switch = channel_switch + 4;
+  }
+  
+  //maximo 125 canales, telefonia wifi ocupa de 2402 a 2472 y 
+  //Nosotros llegamos hasta 2525 total libre del 72 al 125 , separacion entre canales 1 Mhz
+  //Con canales próximos se interfieren en las comunicaciones
+  //Como hay (125 - 71) = 54 canales, hacemos que cada bit del switch aumente en 7 canales (7Mhz)
+  // 000 -> canal 75, 001 -> canal 82, 010 -> canal 89 ... 111 -> canal 124
+
+  radio.setChannel(channel0 + channel_switch * 2);
+  //****************************************************************************************
+
+  
+  // This simple sketch opens a single pipes for these two nodes to communicate
+  // back and forth.  One listens on it, the other talks to it.
+
+
+  radio.openReadingPipe(1, pipe); //radio.openWritingPipe(pipe);
+//  radio.printDetails();
+  radio.startListening();
+
+
+  pinMode(2, OUTPUT);
+  digitalWrite(2, LOW); // pone el led receptor apagado
+
+  startTime = millis();
+
+}
+
+void loop(void)
+{
+  int situacio = 1;   //Testing with diferens places to read the time. The optimal is (1)
+  
+  if (capturing)
+  {
+    if(situacio==1) { sampleTime = millis(); } // (1) Time read now to avoid random delay on 
radio.availabe() and radio.read()
+    while (radio.available())
+    {
+        if(situacio==2) { sampleTime = millis(); } // (2) Time read now to avoid random delay on 
radio.availabe() and radio.read()
+        //Reading from the radio and storing in data
+        radio.read(  &data, len_data);
+        if(situacio==3) { sampleTime = millis(); } // (3) Time read now to avoid random delay on 
radio.availabe() and radio.read()
+
+        if(sampleTime > startTime)            //No overflow
+        {
+          totalTime= sampleTime - startTime;
+          //Serial.print(startTime); Serial.print("\t"); Serial.print(sampleTime); Serial.print("\t"); 
Serial.println(totalTime);
+        } else if (sampleTime <= startTime)   //Overflow
+        {
+          //Time from the last measure to the overflow event plus the sampleTime
+          totalTime = (4294967295 -  lastSampleTime) + sampleTime;
+        }
+        Serial.print(data.id); Serial.print(";");
+        Serial.print(totalTime); Serial.print(";");
+        digitalWrite(2, !data.state);
+//      if (data.state)               //se ha recibido flanco de bajada
+//      {
+//        digitalWrite(2, HIGH);          // enciende led receptor
+//        //Serial.println("I");                    // envia el paso por conector RCA y por port serie
+//      } else if (!data.state)               //se ha recibido flanco de subida
+//      {
+//        digitalWrite(2, LOW);               // apaga led receptor
+//        //Serial.println("O");                        //envia  por port serie
+//      }
+
+      Serial.println(data.state);
+    }
+  }
+}
+
+void serialEvent()
+{
+  capturing = false;
+  String inputString = Serial.readString();
+  String commandString = inputString.substring(0, inputString.lastIndexOf(":"));
+  if (commandString == "start_capture") {
+    start_capture();
+  } else if (commandString == "end_capture") {
+    end_capture();
+  } else if (commandString == "get_status") {
+    get_status();
+  } else if (commandString == "get_version") {
+    get_version();
+  } else {
+    Serial.println("Not a valid command");
+  }
+  inputString = "";
+}
+
+void start_capture()
+{
+  radio.flush_rx();
+  Serial.println("Starting capture");
+  startTime = millis();
+  lastSampleTime = startTime + 1;
+  capturing = true;
+}
+
+void end_capture()
+{
+  capturing = false;
+  digitalWrite(2, LOW);
+  Serial.println("\nCapture ended:");
+  //asm("jmp 0x0000"); // ejecuta un reset para poner a "0" millis()
+}
+
+void get_status()
+{
+  Serial.println("status:");
+  radio.printDetails();
+}
+
+void get_version()
+{
+  Serial.println(version);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]